SQL Server w logistyce

Tabela _historia w bazie danych SQL Server

Historia operacji na dokumentach — pozwala odtworzyć, co działo się z konkretnym rekordem i kto za tym stał.

sql.server.net.pl/sql/
Uśmiechnięty analityk w garniturze przy szerokim monitorze
Uśmiechnięty analityk w garniturze przy szerokim monitorze
W skrócie
  • 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_ACH pozwala pobrać historię dokumentu z pominięciem wpisów wycofanych, bez filtrowania po odczycie.
  • Kolumna UWAGI mieś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.

Jak z pojedynczych wpisów powstaje historia dokumentu
Operacja OperacjaZatwierdzenie, korekta lub zmiana statusu dokumentu
Kontekst KontekstZapisany zostaje login, adres IP, magazyn i komórka kosztowa
Powiązanie PowiązanieWpis dostaje numer REFNO wspólny dla całej sprawy
Odtworzenie OdtworzenieZapytanie po REFNO zwraca przebieg operacji w kolejności czasu

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.

Wykaz kolumn tabeli
KolumnaTypWymaganaZnaczenie
Identyfikacja wpisu
ID_HISTORIAint
liczba całkowita
takUnikalny identyfikator wiersza tabeli
REFNObigint
liczba całkowita 64-bitowa
nieNumer referencyjny dokumentu
PRXvarchar(5)
tekst do 5 znaków
nieKod PRX wiersza tabeli
ACHvarchar(1)
tekst do 1 znaków
takStatus wiersza tabeli
AKTYWNEbit
wartość logiczna 0/1
takOznaczenie czy dany wiersz tabeli jest aktywny
STAMPtimestamp
znacznik wersji wiersza
takUnikalny identyfikator wiersza tabelu - stanu
Okoliczności zdarzenia
KIEDYdatetime
data i godzina
takData i czas zapisu danych do tabeli
DDOWODdate
data
nieData powstania zdarzenia
DZIENdate
data
nieDzień zdarzenia
LOGINvarchar(50)
tekst do 50 znaków
nieNazwa użytkownika dopisującego wiersz
IPvarchar(50)
tekst do 50 znaków
nieAdres IP komputera z którego nastąpiło zdarzenie
HOSTvarchar(200)
tekst do 200 znaków
nieNazwa hosta z którego było połączenie z programem
MAGAZYNvarchar(5)
tekst do 5 znaków
nieSymbol magazynu
MPKvarchar(20)
tekst do 20 znaków
nieSymbol komórki
Dane dokumentu
TYPDOKvarchar(3)
tekst do 3 znaków
nieTyp dokumentu
NUMERDOKvarchar(20)
tekst do 20 znaków
nieNumer dokumentu
KTRHIDbigint
liczba całkowita 64-bitowa
nieIdentyfikator kontrahenta
TYTULvarchar(50)
tekst do 50 znaków
nieTytuł dokumentu
OPISvarchar(500)
tekst do 500 znaków
nieTytuł dokumentu
UWAGIvarchar(max)
tekst bez limitu długości
nieUwagi - 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.

Indeksy zdefiniowane na tabeli
IndeksKolumnyRodzaj
KIEDYKIEDYzwykły
KTRHID_KIEDYKTRHID, KIEDYzwykły
LOGIN_REFNOLOGIN, REFNOzwykły
PK__historiaID_HISTORIAklucz główny
REFNO_ACHREFNO, ACHzwykł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.

Rejestry pomocnicze StudioSystem
TabelaCo rejestrujeKiedy po nią sięgnąć
_historiaOperacje na dokumencie wraz z kontekstemGdy pytanie brzmi: co działo się z tym dokumentem
_dziennikWszystkie operacje modyfikujące dane w systemieGdy pytanie dotyczy działań użytkownika, nie jednego dokumentu
_errorBłędy zgłoszone przez aplikacjęGdy operacja się nie powiodła i trzeba ustalić dlaczego
_editTrwające blokady edycyjneGdy 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; indeks REFNO_ACH jest 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 DDOWOD z KIEDY; różnica wskazuje, że dokument wprowadzono z datą wsteczną.
  • Przy analizie zdarzeń spoza godzin pracy zwróć uwagę na kolumny IP i HOST — 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:

FAQ

Najczęściej zadawane pytania o tabelę _historia

01

Czym _historia różni się od dziennika zdarzeń?

Punktem odniesienia. _historia jest zorganizowana wokół dokumentu — odpowiada na pytanie, co się z nim działo. Dziennik zdarzeń jest zorganizowany wokół operacji w systemie i odpowiada na pytanie, co robił dany użytkownik. Obie tabele opisują te same zdarzenia z innej strony i w praktyce używa się ich razem.

02

Dlaczego dane dokumentu są powtórzone w wpisie historycznym?

Bo dokument może zostać poprawiony albo wycofany, a wpis historyczny ma zachować stan z chwili operacji. Gdyby raport pobierał typ, numer i kontrahenta z bieżącej wersji dokumentu, pokazywałby przeszłość taką, jaka wynika z dzisiejszych danych — a nie taką, jaka faktycznie była.

03

Do czego służy indeks REFNO_ACH?

Historia dokumentu jest niemal zawsze odczytywana z pominięciem wpisów oznaczonych jako wycofane. Umieszczenie statusu jako drugiej kolumny indeksu pozwala serwerowi odrzucić je już podczas przeszukiwania, zamiast pobierać wszystkie wiersze i odfiltrowywać je po odczycie.

04

Jak długo przechowywać wpisy historyczne?

Zależy od polityki firmy i wymagań branżowych — przy dokumentach magazynowych powiązanych z rozliczeniami zwykle co najmniej tyle, ile wynosi okres przedawnienia roszczeń. Starsze wpisy warto przenosić do tabeli archiwalnej, bo objętość rośnie proporcjonalnie do liczby wystawianych dokumentów.

Słownik pojęć

Słownik pojęć

Pojęcia opisujące odtwarzanie przebiegu operacji na dokumentach.

ŚŚlad rewizyjny
Nieusuwalny zapis, kto i kiedy zmienił dane w systemie. Podstawa wiarygodności ewidencji podczas audytu i kontroli.
MMicrosoft SQL Server
Serwer relacyjnej bazy danych, na którym pracują aplikacje SoftwareStudio. Odpowiada za spójność danych, uprawnienia dostępu, kopie zapasowe i wydajność zapytań.
IIndeks bazodanowy
Struktura przyspieszająca wyszukiwanie wierszy w tabeli. Dobrze dobrane indeksy skracają czas zapytań, ale spowalniają zapisy i zajmują miejsce na dysku.
IIdentyfikowalność
Zdolność odtworzenia drogi towaru — od dostawcy, przez magazyn, po odbiorcę. Wymagana prawem w branży spożywczej i farmaceutycznej.
GGRC
Governance, Risk and Compliance — ład korporacyjny, zarządzanie ryzykiem i zgodność z przepisami. Wymaga dokumentowania procedur i śladu rewizyjnego.
MMPK
Miejsce powstawania kosztów — jednostka organizacyjna, do której przypisuje się wydatki. Pozwala rozliczyć koszty w podziale na działy.
KKartoteka kontrahentów
Wspólny rejestr dostawców i odbiorców, do którego odwołują się dokumenty we wszystkich modułach. Warunek spójności danych między systemami.

Zobacz to w praktyce

Sprawdź, jak systemy SoftwareStudio oparte na MS SQL Server wspierają ten obszar Twojej firmy.