niebieszki
20.02.2011, 12:30:51
Witam
Mam taki problem: chciałbym utworzyć unikalny, kolejny numer dokumentu,
Przykładem może być tworzenie numeru faktury vat podczat jej dodawania? Format takiej nazwy powinien być edytowalny przez uzytkownika. Może na pczątek coś w stylu
"D numer/miesiac/rok" jak podzielić pola w bazie danych wstawic jedno jako nazwa faktury czy kilka poł na kazdy czlon... pobranie miesiaca czy roku to pewnie przy uzyciu js się da ale jak sprawdić który numer był ostatnio dodany do bazy i wystawić kolejny? Po id takiej sprawy nie można obslużyć ponieważ pdczas usuwania jakiejs faktury pole autincrement dodaje automatycznie kolejny numer id.
Jak sie do tego zabrać?
Nie rozumiem dlaczego AUTO_INCREMENT Twoim zdaniem się nie nadaje. Właśnie do tego zostało stworzone. Dodatkowo utwórz w bazie danych pole w którym będziesz przechowywał datę utworzenia rekordu. Wtedy będziesz mógł skleić z tego numer w dowolnej formie. Przy okazji proponuję odwrócić kolejność na ROK/MIESIĄC/NUMER, będzie czytelniej.
niebieszki
21.02.2011, 11:44:06
nie nadaje się z tego względu iż podczas usunięcia takiego dokumentu z bazy powstanie luka przykład zęby bardziej zobrazować.
tworzysz sobie dokument 1 nadaje mu automatycznie id =1 i date 2010/02/21 w połączeniu wszystko ląduje do nazwy i wygląda tak D 1 2010/02/21 (na razie super)
tworzysz sobie dokument 2 nadaje mu automatycznie id =2 i date 2010/02/21 w połączeniu wszystko ląduje do nazwy i wygląda tak D 2 2010/02/21 (dalej super)
usuwasz sobie dokument 2
wiec sobie znowu tworzysz dokument 2 i nadaje mu automatycznie id=3.... i zaczynają się schody jest luka... brakuje dokumentu nr.2 (nazwa bedzie D 3 2010/02/21)
a przy np. dokumentach ścisłego zarachowania musi być ciągłość numeracji
to tylko przykład taka sytuacja może wystąpić częściej niż tylko przy usuwania, jakiś błąd bazy i id idzie automatycznie o 1 w gore...
Może jakiś inny pomysł?
Pilsener
21.02.2011, 13:21:44
Cytat
np. dokumentach ścisłego zarachowania musi być ciągłość numeracji
- dlatego nie można ich usuwać, jak źle wystawiłeś fakturę i została ona już zatwierdzona (dodana do bazy) to nie można jej usunąć, trzeba wystawić fakturę korygującą a nawet jeśli, to nie usuwa się nigdy fizycznie lecz ustawia pole deleted na 1.
To co chcesz zrobić jest bez sensu, jak sobie wydrukuję np. fakturę nr 5 a za pół roku ktoś znów wydrukuje tą fakturę to będzie na niej numer 4 bo ktoś fakturę nr 2 usunął? Autoincrement jest używane przez cały świat i spełnia oba założenia: ciągłości (nowy dokument ma zawsze wyższy numer niż stary) i unikalności (nigdy nie będzie dwóch różnych dokumentów o tym samym numerze).
A co ma się dziać w sytuacji gdy dodasz dokumenty o id=1,2,3 a potem usuniesz dokument z id=2?
niebieszki
23.02.2011, 15:52:05
dałem zły przykład... mi nie chodzi o usuwnie tych dokumentów... bardziej chodzi mi o sytuacje... gdy wystapi jakis blad przy tranzakcji i pole auto inkrement sie podniesie o 1....
albo nawet jeszcze prostrzy przyklad...numerowanie dokumentów po miesiacu i roku... jak z pola autoinkrement zrobic tak aby jak jest luty liczylo od 1 a jak marzec to znowu liczenie od jeden? itp...?
Ja mam to zrobione w ten sposób, że mam dwie kolumny - id (AUTO_INCREMENT) - czyli unikalny numer, nazwijmy to, zamówienia, oraz invoice_id (UNIQUE, NULL), czyli unikalny numer faktury. Nowo otwarta faktura nie ma jeszcze przypisanego numeru invoice_id, jedynie id. Gdy ją sobię wypełnię i kliknę "zamknij" skrypt pobiera najwyższy invoice_id, inkrementuje i zapisuje do bazy. Nie ma przy tym obawy, że dwie osoby zrobią to w tym samym momencie i coś się spitoli, bo pole invoice_id jest ustawione na UNIQUE i mysql zwróci błąd.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.