SQL Server w logistyce

Tabela _licznik w bazie danych SQL Server

Rejestr numeracji dokumentów — pilnuje ciągłości i niepowtarzalności numerów w obrębie roku, typu i firmy.

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
  • Numer dokumentu nie jest liczony w locie — tabela przechowuje ostatnią użytą wartość dla każdej kombinacji parametrów.
  • Numeracja jest prowadzona osobno dla każdej firmy, rodzaju PRX, typu dokumentu i roku, opcjonalnie także miesiąca.
  • Kolumna TERMINDO określa datę ważności numeracji — po jej upływie wymagane jest założenie nowego zakresu.
  • Najpoważniejsze ryzyko to nadanie dwóm dokumentom tego samego numeru przy jednoczesnym zapisie, dlatego pobranie numeru musi być operacją niepodzielną.

Do czego służy tabela [dbo].[_licznik]

Numer dokumentu pełni w firmie funkcję identyfikatora używanego poza systemem — na wydruku, w rozmowie z kontrahentem, w dokumentacji księgowej. Musi więc być niepowtarzalny i ciągły. Tabela [dbo].[_licznik] zapewnia jedno i drugie, przechowując ostatnią wykorzystaną wartość dla każdego zakresu numeracji.

Zakres jest wyznaczony przez kombinację kilku kolumn: kodu firmy, symbolu PRX oznaczającego rodzaj dokumentu, typu dokumentu oraz roku, a przy niektórych rodzajach także miesiąca. Dzięki temu dokumenty przyjęcia i wydania mają niezależne numeracje, a każda spółka w grupie prowadzi własną. Kolumna ROLASYS pozwala dodatkowo związać zakres z rolą — przydaje się, gdy oddziały wystawiają dokumenty z odrębnych pul.

Prostota tego rozwiązania kryje jedno istotne wymaganie. Pobranie numeru składa się z odczytu bieżącej wartości i zapisania jej zwiększonej wersji. Jeżeli dwie operacje wykonają te kroki równocześnie, obie odczytają tę samą wartość i nadadzą dwóm dokumentom identyczny numer. Dlatego cała operacja musi przebiegać w jednej transakcji z blokadą wiersza.

Z czego składa się numer dokumentu
Firma FirmaKod spółki — każda prowadzi własną, niezależną numerację
Rodzaj i typ Rodzaj i typSymbole PRX oraz TYP wchodzą w skład numeru
Okres OkresRok, a przy części rodzajów także miesiąc numeracji
Kolejny numer Kolejny numerWartość z kolumny NUMER zwiększona o jeden

Zmiana któregokolwiek z trzech pierwszych elementów rozpoczyna odrębny ciąg numerów, liczony od początku.

Budowa tabeli — wykaz kolumn

Kolumny opisują zakres numeracji, jej stan bieżący oraz okres obowiązywania.

Wykaz kolumn tabeli
KolumnaTypWymaganaZnaczenie
Zakres numeracji
FIRMAvarchar(20)
tekst do 20 znaków
takKod firmy
PRXvarchar(5)
tekst do 5 znaków
takIdentyfikator rodzaju dokumentu PRX stanowi część numeru dokumentu
TYPvarchar(5)
tekst do 5 znaków
takTyp dokumentu stanowi część numeru dokumentu
ROKvarchar(4)
tekst do 4 znaków
takSymbol roku do numeracji
MIESIACvarchar(2)
tekst do 2 znaków
nieMiesiąc, którego dotyczy numeracja
ROLASYSvarchar(3)
tekst do 3 znaków
nieIdentyfikator roli
Stan i opis
NUMERint
liczba całkowita
takOstatni numer dokumentu w ramach danego rodzaju i typu w danym roku
OPISvarchar(35)
tekst do 35 znaków
takOpis przeznaczenia numeru dokumentu
AKTYWNEbit
wartość logiczna 0/1
takOznacznie czy dany wiersz tabeli jest aktywny
ID_LICZNIKint
liczba całkowita
takUnikalny identyfikator wiersza tabeli
Okres obowiązywania
TERMINDOdate
data
takData ważności numeracji

Kolumna NUMER przechowuje wartość ostatnio wykorzystaną, nie następną do wykorzystania. Pomyłka w tej interpretacji przy ręcznej korekcie skutkuje pominięciem numeru albo jego powtórzeniem.

Indeksy i wydajność zapytań

Indeksy odpowiadają dwóm zastosowaniom: odnalezieniu właściwego zakresu przy nadawaniu numeru oraz kontroli zakresów wygasających.

Indeksy zdefiniowane na tabeli
IndeksKolumnyRodzaj
PK__licznikID_LICZNIKklucz główny
PRX_TYP_DOKPRX, TYP, ROKzwykły
TERMINDOTERMINDOzwykły
TYP_PRXTYP, PRXzwykły

Indeks PRX_TYP_DOK obejmuje kolumny w kolejności, w jakiej zawężany jest zakres przy nadawaniu numeru. Indeks na TERMINDO służy czemu innemu — pozwala tanio odpytać, które zakresy tracą ważność, i założyć nowe przed końcem roku, zanim wystawienie dokumentu stanie się niemożliwe.

Skąd biorą się zdublowane numery dokumentów

Powtórzony numer dokumentu to problem, który ujawnia się zwykle dopiero w księgowości i bywa kłopotliwy do naprawienia. Przyczyny są nieliczne i dobrze rozpoznane.

Przyczyny duplikatów w numeracji
PrzyczynaObjawZapobieganie
Odczyt i zapis poza jedną transakcjąDwa dokumenty wystawione w tej samej sekundzie mają ten sam numerPobranie numeru w transakcji z blokadą wiersza licznika
Ręczna korekta kolumny NUMERNumer powtarza się lub w ciągu powstaje lukaZmiana wyłącznie po sprawdzeniu najwyższego numeru faktycznie użytego
Dwa zakresy o tych samych parametrachNumeracja skacze między dwoma ciągamiKontrola unikalności kombinacji firmy, PRX, typu i roku
Przywrócenie bazy z kopiiNumery nadane po wykonaniu kopii zostają nadane ponownieWeryfikacja stanu liczników po każdym odtworzeniu bazy

Trzy pierwsze przyczyny da się wykluczyć raz na zawsze; czwarta wymaga procedury sprawdzającej po każdym odtworzeniu bazy.

Wykrycie duplikatu jest łatwiejsze niż jego naprawa. Zmiana numeru dokumentu, który trafił już do kontrahenta albo do systemu księgowego, wymaga korekty poza systemem, dlatego warto raczej zapobiegać — regularnym sprawdzeniem, czy najwyższy numer użyty w dokumentach zgadza się ze stanem licznika.

Jak korzystać z tabeli w praktyce

Przy utrzymaniu numeracji dokumentów obowiązują następujące zasady:

  • Pobieraj numer w transakcji obejmującej odczyt i zapis, z blokadą wiersza licznika — to jedyna skuteczna ochrona przed duplikatem.
  • Zakładaj zakresy na kolejny rok z wyprzedzeniem; brak aktywnego licznika uniemożliwia wystawienie dokumentu, zwykle pierwszego dnia roboczego stycznia.
  • Kontroluj kolumnę TERMINDO zapytaniem cyklicznym, zamiast czekać na zgłoszenie użytkownika.
  • Nie zmieniaj kolumny NUMER bez sprawdzenia najwyższej wartości faktycznie użytej w dokumentach danego typu.
  • Wypełniaj kolumnę OPIS — przy kilkudziesięciu zakresach to jedyny sposób odróżnienia, który do czego służy.
  • Po odtworzeniu bazy z kopii zweryfikuj stan wszystkich liczników przed dopuszczeniem użytkowników do pracy.

Kontrola zakresów numeracji tracących ważność w ciągu najbliższych dwóch miesięcy:

SELECT  FIRMA,
        PRX,
        TYP,
        ROK,
        OPIS,
        NUMER    AS OSTATNI_UZYTY,
        TERMINDO,
        DATEDIFF(DAY, GETDATE(), TERMINDO) AS DNI_DO_KONCA
FROM    dbo._licznik
WHERE   AKTYWNE = 1
  AND   TERMINDO <= DATEADD(MONTH, 2, GETDATE())
ORDER BY TERMINDO;

Uruchamiane cyklicznie, to zapytanie zapobiega najczęstszej awarii związanej z numeracją — brakowi aktywnego zakresu na początku nowego roku.

Numeracja dokumentów należy do mechanizmów, o których nikt nie myśli, dopóki działają. Dwa zapytania kontrolne uruchamiane raz w miesiącu — jedno o wygasające zakresy, drugie o zgodność stanu liczników z dokumentami — wystarczą, żeby tak pozostało.

Powiązane tabele i dokumentacja

Numeracja łączy się z definicjami dokumentów i uprawnieniami, które decydują o dostępie do poszczególnych zakresów:

FAQ

Najczęściej zadawane pytania o tabelę _licznik

01

Dlaczego dwa dokumenty dostały ten sam numer?

Niemal zawsze dlatego, że odczyt bieżącej wartości i zapis wartości zwiększonej odbyły się poza jedną transakcją. Dwie operacje wykonane w tej samej chwili odczytały tę samą liczbę i obie nadały ten sam numer. Rozwiązaniem jest pobieranie numeru w transakcji z blokadą wiersza licznika.

02

Co się stanie, gdy zabraknie aktywnego zakresu numeracji?

Wystawienie dokumentu danego typu przestanie być możliwe. Problem ujawnia się typowo pierwszego dnia roboczego nowego roku, gdy zakresy z datą ważności do 31 grudnia przestają obowiązywać. Zapobiega mu cykliczne zapytanie o kolumnę TERMINDO i zakładanie zakresów z wyprzedzeniem.

03

Czy kolumna NUMER przechowuje numer następny czy ostatnio użyty?

Ostatnio użyty. Przy nadawaniu numeru system zwiększa tę wartość o jeden i zapisuje wynik. Pomylenie obu interpretacji przy ręcznej korekcie prowadzi albo do pominięcia numeru, albo do jego powtórzenia — dlatego zmian w tej kolumnie nie wprowadza się bez sprawdzenia dokumentów.

04

Po co numeracja jest rozdzielona według firmy i typu?

Żeby ciągi numerów były niezależne. Dokumenty przyjęcia i wydania mają odrębną numerację, podobnie jak poszczególne spółki w grupie. Bez tego podziału numer nie identyfikowałby jednoznacznie dokumentu w obrębie rodzaju, a przerwa w jednym ciągu wpływałaby na pozostałe.

Słownik pojęć

Słownik pojęć

Pojęcia związane z numeracją i identyfikacją dokumentów.

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.
KKopia zapasowa
Zabezpieczona kopia bazy danych pozwalająca odtworzyć stan systemu po awarii. W SQL Server wykonuje się ją w trybie pełnym, różnicowym lub jako kopię dziennika transakcji.
RRole i uprawnienia
Mechanizm przypisywania użytkownikom dostępu do funkcji i danych. Zamiast nadawać uprawnienia pojedynczo, przypisuje się je do roli odpowiadającej stanowisku.
ŚŚlad rewizyjny
Nieusuwalny zapis, kto i kiedy zmienił dane w systemie. Podstawa wiarygodności ewidencji podczas audytu i kontroli.
FFaktura
Dokument potwierdzający sprzedaż, będący podstawą rozliczenia podatkowego i płatności.
KKsięgowość
Ewidencja zdarzeń gospodarczych prowadzona zgodnie z ustawą o rachunkowości, zamykana okresami sprawozdawczymi.

Zobacz to w praktyce

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