Witam
Piszę sobie programik do wystawiania fakturek - praca na 2 stanowiskach wiec jako serwer bazy danych użyłem FIREBIRD. Wiadomo że klucz główny w przypadku braku zatwierdzenia transakcji z jakiejś przyczyny będzie miał lukę w numeracji - proszę o podpowiedzi
- osobna tabela z numerami dla faktury (na czas zapisu blokujesz możliwość zmiany numeru dla innych, odczytujesz aktualny numer, zwiększasz o jeden i z takim numerem a) zapisujesz fakturę, b) zapisujesz go w tej tabeli. Jak się wywali coś to rollback odwoła oba zapisy i kolejny zapis będzie z tym samym numerem, a jak się zapisze to się zapisze)
- zapisuj fakturę bez numeru i jeśli uda się zapisać to pobranie numeru z generatora i update z tym numerem. Jeśli dobrze to zaprojektujesz to ten update zawsze się zatwierdzi.
- inne
Ja miałem podobną koncepcje rozwiązania problemu co w 2 punkcie - zrobić to na wyzwalaczu że po insercie doda nr .
Problem w tym że uczę się Firebird'a i moja prośba czy coś więcej w tym temacie podpowiedziałbyś?
no ale co tu podpowiadać - najpierw robisz insert z nagłówkiem i pozycjami faktury, potem commit i jak się uda to robisz update ustawiający numer faktury - coś na kształt
UPDATE faktury SET numer = gen_id(generator_nr_faktury, 1) WHERE faktura_id = id_faktury
A te faktury to muszą mieć kolejne numery? Chyba przepisy tego nie wymagają. A jeśli już tak jest to zrobiłbym klucz unikalny na polu faktury i przed wstawianiem odczytywał select (max(nr_faktury)+1) i jeśli ktoś inny pobierze jednocześnie ten sam numer to będzie błąd dazy danych "key violation" i wtedy można zrobić ponownie ten select.
ustawić autoincrement jako id faktury i wsio
Najbezpieczniej jest jednak blokować numer w osobnej tabeli bo wtedy nikt nie pobierze kolejnego numeru przed zatwierdzeniem faktury, inaczej gdyby transakcja o niższym numerze faktury została wycofana a następna już była zatwierdzona w tym samym czasie to nie byłoby kolejności. Trzeba jeszcze rozwiązać problem anulowania faktur (z różnych powodów zgodnie z prawem), na przykład na skutek rezygnacji z zakupu towaru po kilku dniach.
z fakturami jest inny problem.
Numery moga byc generowane w postacji np 2010/01/000001.
Jedyny sposob to np trzymanie konfiguracji w procedurze ktora sie odpali po insercie (trigger)