- 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
TERMINDOokreś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.
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.
| Kolumna | Typ | Wymagana | Znaczenie |
|---|---|---|---|
| Zakres numeracji | |||
FIRMA | varchar(20) tekst do 20 znaków | tak | Kod firmy |
PRX | varchar(5) tekst do 5 znaków | tak | Identyfikator rodzaju dokumentu PRX stanowi część numeru dokumentu |
TYP | varchar(5) tekst do 5 znaków | tak | Typ dokumentu stanowi część numeru dokumentu |
ROK | varchar(4) tekst do 4 znaków | tak | Symbol roku do numeracji |
MIESIAC | varchar(2) tekst do 2 znaków | nie | Miesiąc, którego dotyczy numeracja |
ROLASYS | varchar(3) tekst do 3 znaków | nie | Identyfikator roli |
| Stan i opis | |||
NUMER | int liczba całkowita | tak | Ostatni numer dokumentu w ramach danego rodzaju i typu w danym roku |
OPIS | varchar(35) tekst do 35 znaków | tak | Opis przeznaczenia numeru dokumentu |
AKTYWNE | bit wartość logiczna 0/1 | tak | Oznacznie czy dany wiersz tabeli jest aktywny |
ID_LICZNIK | int liczba całkowita | tak | Unikalny identyfikator wiersza tabeli |
| Okres obowiązywania | |||
TERMINDO | date data | tak | Data 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.
| Indeks | Kolumny | Rodzaj |
|---|---|---|
PK__licznik | ID_LICZNIK | klucz główny |
PRX_TYP_DOK | PRX, TYP, ROK | zwykły |
TERMINDO | TERMINDO | zwykły |
TYP_PRX | TYP, PRX | zwykł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.
| Przyczyna | Objaw | Zapobieganie |
|---|---|---|
| Odczyt i zapis poza jedną transakcją | Dwa dokumenty wystawione w tej samej sekundzie mają ten sam numer | Pobranie numeru w transakcji z blokadą wiersza licznika |
| Ręczna korekta kolumny NUMER | Numer powtarza się lub w ciągu powstaje luka | Zmiana wyłącznie po sprawdzeniu najwyższego numeru faktycznie użytego |
| Dwa zakresy o tych samych parametrach | Numeracja skacze między dwoma ciągami | Kontrola unikalności kombinacji firmy, PRX, typu i roku |
| Przywrócenie bazy z kopii | Numery nadane po wykonaniu kopii zostają nadane ponownie | Weryfikacja 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ę
TERMINDOzapytaniem cyklicznym, zamiast czekać na zgłoszenie użytkownika. - Nie zmieniaj kolumny
NUMERbez 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: