- Tabela odpowiada na pytanie „co się działo z tym dokumentem” — zbiera wszystkie operacje powiązane numerem
REFNO. - Zapis obejmuje pełny kontekst: użytkownika, adres IP, nazwę hosta, magazyn, komórkę kosztową i kontrahenta.
- Indeks złożony
REFNO_ACHpozwala pobrać historię dokumentu z pominięciem wpisów wycofanych, bez filtrowania po odczycie. - Kolumna
UWAGImieści opis zdarzenia — to zwykle jedyne miejsce, gdzie zapisano powód operacji.
Do czego służy tabela [dbo].[_historia]
Dokument magazynowy przechodzi przez kilka rąk, zanim trafi do archiwum. Zostaje wystawiony, poprawiony, zatwierdzony, czasem skorygowany. Tabela [dbo].[_historia] gromadzi te kroki i pozwala odtworzyć je w kolejności, bez sięgania do pamięci osób, które je wykonywały.
Struktura celowo powtarza część kolumn dokumentu źródłowego — typ, numer, magazyn, kontrahenta i datę zdarzenia gospodarczego. Nie jest to nadmiarowość, lecz warunek działania: dokument może zostać poprawiony albo wycofany, a wpis historyczny ma zachować stan z chwili operacji. Raport z historii pokazuje więc, jak sprawa wyglądała wtedy, a nie jak wygląda po wszystkich późniejszych zmianach.
Wpisy wiąże z dokumentem numer referencyjny w kolumnie REFNO. To ten sam identyfikator, który występuje w rejestrze błędów, w blokadach edycyjnych i w dzienniku zdarzeń — dzięki czemu pełny obraz sprawy da się złożyć z czterech tabel bez dopasowywania po dacie i loginie.
Wpisy zachowują wartości z chwili operacji, dlatego późniejsza korekta dokumentu nie zmienia obrazu jego historii.
Budowa tabeli — wykaz kolumn
Kolumny dzielą się na trzy grupy: identyfikację wpisu, opis okoliczności zdarzenia oraz dane dokumentu, którego dotyczyło.
| Kolumna | Typ | Wymagana | Znaczenie |
|---|---|---|---|
| Identyfikacja wpisu | |||
ID_HISTORIA | int liczba całkowita | tak | Unikalny identyfikator wiersza tabeli |
REFNO | bigint liczba całkowita 64-bitowa | nie | Numer referencyjny dokumentu |
PRX | varchar(5) tekst do 5 znaków | nie | Kod PRX wiersza tabeli |
ACH | varchar(1) tekst do 1 znaków | tak | Status wiersza tabeli |
AKTYWNE | bit wartość logiczna 0/1 | tak | Oznaczenie czy dany wiersz tabeli jest aktywny |
STAMP | timestamp znacznik wersji wiersza | tak | Unikalny identyfikator wiersza tabelu - stanu |
| Okoliczności zdarzenia | |||
KIEDY | datetime data i godzina | tak | Data i czas zapisu danych do tabeli |
DDOWOD | date data | nie | Data powstania zdarzenia |
DZIEN | date data | nie | Dzień zdarzenia |
LOGIN | varchar(50) tekst do 50 znaków | nie | Nazwa użytkownika dopisującego wiersz |
IP | varchar(50) tekst do 50 znaków | nie | Adres IP komputera z którego nastąpiło zdarzenie |
HOST | varchar(200) tekst do 200 znaków | nie | Nazwa hosta z którego było połączenie z programem |
MAGAZYN | varchar(5) tekst do 5 znaków | nie | Symbol magazynu |
MPK | varchar(20) tekst do 20 znaków | nie | Symbol komórki |
| Dane dokumentu | |||
TYPDOK | varchar(3) tekst do 3 znaków | nie | Typ dokumentu |
NUMERDOK | varchar(20) tekst do 20 znaków | nie | Numer dokumentu |
KTRHID | bigint liczba całkowita 64-bitowa | nie | Identyfikator kontrahenta |
TYTUL | varchar(50) tekst do 50 znaków | nie | Tytuł dokumentu |
OPIS | varchar(500) tekst do 500 znaków | nie | Tytuł dokumentu |
UWAGI | varchar(max) tekst bez limitu długości | nie | Uwagi - opis zdarzenia |
Kolumny TYTUL i OPIS mają w tej tabeli zbliżone znaczenie — pierwsza jest krótką etykietą wpisu, druga mieści pełniejszy opis dokumentu. Właściwa treść zdarzenia trafia do kolumny UWAGI.
Indeksy i wydajność zapytań
Pięć indeksów odpowiada punktom wyjścia, od których zaczyna się analiza: dokumentowi, użytkownikowi, kontrahentowi i przedziałowi czasu.
| Indeks | Kolumny | Rodzaj |
|---|---|---|
KIEDY | KIEDY | zwykły |
KTRHID_KIEDY | KTRHID, KIEDY | zwykły |
LOGIN_REFNO | LOGIN, REFNO | zwykły |
PK__historia | ID_HISTORIA | klucz główny |
REFNO_ACH | REFNO, ACH | zwykły |
Indeks REFNO_ACH zasługuje na uwagę. Historia dokumentu jest niemal zawsze odczytywana z pominięciem wpisów wycofanych, więc dołączenie statusu jako drugiej kolumny pozwala serwerowi odfiltrować je już na poziomie indeksu. Analogicznie działa LOGIN_REFNO przy pytaniu, co konkretna osoba robiła z konkretnym dokumentem.
Cztery rejestry, jeden numer referencyjny
Historia dokumentu to tylko część obrazu. StudioSystem prowadzi cztery uzupełniające się rejestry, które łączy wspólny numer REFNO — i dopiero razem odpowiadają na pytanie, co się wydarzyło.
| Tabela | Co rejestruje | Kiedy po nią sięgnąć |
|---|---|---|
_historia | Operacje na dokumencie wraz z kontekstem | Gdy pytanie brzmi: co działo się z tym dokumentem |
_dziennik | Wszystkie operacje modyfikujące dane w systemie | Gdy pytanie dotyczy działań użytkownika, nie jednego dokumentu |
_error | Błędy zgłoszone przez aplikację | Gdy operacja się nie powiodła i trzeba ustalić dlaczego |
_edit | Trwające blokady edycyjne | Gdy dokument jest niedostępny do edycji |
Wspólny numer REFNO pozwala zestawić wpisy z czterech tabel bez dopasowywania po czasie i loginie.
Kolejność sięgania po nie ma znaczenie praktyczne. Przy zgłoszeniu „dokument wygląda inaczej niż wczoraj” zaczyna się od historii; jeżeli nie widać w niej operacji tłumaczącej różnicę, następny jest dziennik zdarzeń — bo zmiana mogła dotyczyć powiązanej kartoteki, a nie samego dokumentu.
Jak korzystać z tabeli w praktyce
Przy pracy z historią dokumentów przydają się następujące zasady:
- Zaczynaj od numeru
REFNO, nie od numeru dokumentu — ten drugi bywa zmieniany przy korektach i nie zawsze jest jednoznaczny. - Filtruj wpisy warunkiem na
ACH, aby pominąć zapisy wycofane; indeksREFNO_ACHjest przygotowany właśnie pod to. - Czytaj kolumnę
UWAGI— to zwykle jedyne miejsce, w którym zapisano powód operacji, a nie tylko jej fakt. - Porównuj
DDOWODzKIEDY; różnica wskazuje, że dokument wprowadzono z datą wsteczną. - Przy analizie zdarzeń spoza godzin pracy zwróć uwagę na kolumny
IPiHOST— pokazują, skąd nastąpiło połączenie. - Archiwizuj wpisy starsze niż okres wymagany przez politykę firmy; tabela rośnie proporcjonalnie do liczby wystawianych dokumentów.
Pełny przebieg sprawy dla wskazanego numeru referencyjnego, z pominięciem wpisów wycofanych:
SELECT KIEDY,
LOGIN,
MAGAZYN,
TYPDOK,
NUMERDOK,
TYTUL,
IP,
LEFT(UWAGI, 250) AS OPIS_ZDARZENIA
FROM dbo._historia
WHERE REFNO = @refno
AND ACH <> 'X'
ORDER BY KIEDY;
Para warunków na REFNO i ACH trafia dokładnie w indeks złożony założony na tych kolumnach, więc zapytanie działa szybko niezależnie od objętości tabeli.
Historia dokumentu ma wartość dowodową tylko wtedy, gdy nikt jej nie modyfikuje. Konto aplikacyjne powinno mieć do tej tabeli prawo dopisywania i odczytu, ale nie aktualizacji — inaczej zapis przestaje być świadectwem przebiegu sprawy, a staje się jedynie jej bieżącym opisem.
Powiązane tabele i dokumentacja
Historia dokumentów tworzy komplet razem z pozostałymi rejestrami wiązanymi numerem referencyjnym: