Karol Z.

Karol Z. IT manager

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

zachowanie numeracji ciągłej w
trakcie roku i zaczynanie od 1
w roku kolejnym ??

poproszę o podpowiedzi, pomysły
ja myslalem o trigerze z sekwencja jak w
przypadku id i jobie z alter sequence gdy wykryje nowy rok :)
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Karol Z.:
zachowanie numeracji ciągłej w
trakcie roku i zaczynanie od 1
w roku kolejnym ??

poproszę o podpowiedzi, pomysły
ja myslalem o trigerze z sekwencja jak w
przypadku id i jobie z alter sequence gdy wykryje nowy rok :)

Wystarczy chyba job odpalający się 1 stycznia o godzinie 00:00:01 co rok, który robi
drop sequence
create sequence.
Po co Ci trigger?

W Oraclu nie możesz zrobić alter na sekwencji.Grzegorz Drzymała edytował(a) ten post dnia 04.11.10 o godzinie 13:26
Leszek Rabek

Leszek Rabek IT Team Manager/IT
Designer/Analityk/Se
nior Developer

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Dziwne i niebezpieczne podejście z dropowaniem. Trochę może rozszerze przykład, a co jeśli mamy kilka rodzajów faktur i każdy rodzaj ma mieć swoje numerowanie. Moim zdaniem powinno się zrobić oddzielną strukturę przechowującą ostatni numer i z niej pobierać kolejne numery i update. Przed pobieraniem oczywiście blokada na wyłączność. Ponieważ struktura nie będzie duża wszystko wykona się szybko.
To tak według mnie.

Oczywiście numerowanie faktur to tylko przykład. Ale wydaje mi się że firma TETA już nie raz zastosowała takie podejście :)
Karol Z.

Karol Z. IT manager

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Grzegorz Drzymała:

>
Po co Ci trigger?


ma uzupełniać kolumnę na bazie, nie korzystam z procedur

CREATE OR REPLACE TRIGGER next_symbol_FV
BEFORE
INSERT
ON fakturki :)
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
begin
begin
for c1 in (
select 'FV'||TO_CHAR (symbol_fv_seq.NEXTVAL, 'fm00009') next_val_fv
from dual
) loop
:new.SYMBOL := c1.next_val_fv;
end loop;
end;
end;
/

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

ja myslalem o trigerze z sekwencja jak w

Sekwencja może zapewnić tylko unikalność
ale już nie ciągłość.
Szczególnie jak wykorzystasz cache'owanie numerów.
Karol Z.

Karol Z. IT manager

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Leszek Rabek:

Oczywiście numerowanie faktur to tylko przykład. Ale wydaje mi się że firma TETA już nie raz zastosowała takie podejście :)

jasne, że tak :) ale to projekt nie związany z TETA...
opiera się na APEXie i ma z założeniu nie korzystać
z procedur pl sql'owych.

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Karol Z.:

ma uzupełniać kolumnę na bazie, nie korzystam z procedur

CREATE OR REPLACE TRIGGER next_symbol_FV
>...
end;
end;
/
Ja tak tylko co do konstrukcji tego trigerka. Bo pętla, beginów kupa...
A nie ładniej tak ?

CREATE OR REPLACE TRIGGER next_symbol_FV
BEFORE INSERT ON fakturki :)
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
SELECT 'FV' || TO_CHAR(symbol_fv_seq.NEXTVAL, 'fm00009') next_val_fv
INTO :NEW.SYMBOL
FROM dual;
END;
/Wojciech T. edytował(a) ten post dnia 04.11.10 o godzinie 15:12
Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Karol Z.:
jasne, że tak :) ale to projekt nie związany z TETA...
opiera się na APEXie i ma z założeniu nie korzystać
z procedur pl sql'owych.
Spróbuj wrzucić do wnętrza TO_CHAR (zamiast "symbol_fv_seq.NEXTVAL") coś takiego:
(
select nvl(max(to_number(replace(symbol,'FV'))),0)+1
from fakturki
where extract (year from data_ins) = extract (year from sysdate)
)

O ile się da coś takiego zrobić w triggerze :]

Mam nadzieję, że to już ostatni edit :)Izabela Korzińska edytował(a) ten post dnia 04.11.10 o godzinie 15:31
Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Izabela Korzińska:
Spróbuj wrzucić do wnętrza TO_CHAR (zamiast "symbol_fv_seq.NEXTVAL") coś takiego:
(
select nvl(max(to_number(replace(symbol,'FV'))),0)+1
from fakturki
where extract (year from data_ins) = extract (year from sysdate)
)

O ile się da coś takiego zrobić w triggerze :]
Po przemyśleniu - sądzę, że 2 użytkowników, wystawiających fakturę w tym samym momencie dostanie ten sam numer.
A więc moim zdaniem masz tylko 2 wyjścia:
1. rozwiązanie Leszka i wykorzystanie tabelki pomocniczej
lub
2. wykorzystanie sekwencji i nie zachowanie ciągłości.
Leszek Rabek

Leszek Rabek IT Team Manager/IT
Designer/Analityk/Se
nior Developer

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Poza tymi dwoma użytkownikami to przy większej ilości danych mamy dużo wolniejsze czasy wykonania takiej konstrukcji.

Do Karola:

W trigerze też można przyblokować tabelę w exclusive mode no i obsłżyć taki przypadek. Oczywiście w procedurze byłoby o wiele ładniej (parametryzacja itp), no ale jak nie można to trudno. A na sekwencji w tym wypadku bym się raczej nie opierał.

konto usunięte

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Ja to zrobiłem na osobnej tabelce - jeden wiersz - jeden numerator. Do tego procedura, która po stronie serwera dba o poprawną numerację przy pomocy locka. Dzięki osobnej tabeli miałem locka na wierszu i blokowałem tylko inne operacje używające tego samego numeratora. Dodatkowo sprawdzało się wprowadzenie numeratora per rok. Czasem do 4-5 stycznia wystawiali faktury z datą grudniową, no ale ze styczniową też... W wierszu był też wprowadzony sposób numeracji - jak się komuś odwidziało - od nowego roku mógł wystartować innym sposobem numerowania. No, ale to był prosty postgresql - nie tam zaawansowany oracle :)
Mariusz Masewicz

Mariusz Masewicz Prawie wszysko o
bazach danych Oracle
:-)

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Karol Z.:
jasne, że tak :) ale to projekt nie związany z TETA...
opiera się na APEXie i ma z założeniu nie korzystać
z procedur pl sql'owych.


Ciekawe... Caly APEX to jeden wielki PL/SQL :-)

konto usunięte

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Michał Z.:
Ja to zrobiłem na osobnej tabelce - jeden wiersz - jeden numerator. Do tego procedura, która po stronie serwera dba o poprawną numerację przy pomocy locka. Dzięki osobnej tabeli miałem locka na wierszu i blokowałem tylko inne operacje używające tego samego numeratora. Dodatkowo sprawdzało się wprowadzenie numeratora per rok. Czasem do 4-5 stycznia wystawiali faktury z datą grudniową, no ale ze styczniową też... W wierszu był też wprowadzony sposób numeracji - jak się komuś odwidziało - od nowego roku mógł wystartować innym sposobem numerowania. No, ale to był prosty postgresql - nie tam zaawansowany oracle :)

A czy nie miałeś przy tym hotspota?

Jest jeszcze rozwiązanie z pre-alokacją numerów.
Job co x minut / godzin odpala się i sprawdza czy jest wystarcająco dostępna pula numerów, jesli nie, generuje rekordy:


<kod sekwencji>, <numer>, <status: zajety/wolny>

Przykład:

FR0009, 1, Z
FR0009, 2, Z
FR0009, 3, W
FR0009, 4, W
FR0009, 5, W
....


Proces który potrzebuje numerka bierze pierwszy wolny i próbuje mu zmienić status:

set status = "Z"ajety where kod = x and numer = y and status = "W"olny


Proces pobierający numerek może pobrać sobie całą grupę numerów i próbować na nich do skutku (albo do końca puli).
W razie końca puli może sobie je dogenerować (z nadmiarem).

Przy tym rozwiązaniu:
- nie ma utraty numerów - co najwyżej chwilowe dziury
- nie ma hotspotów

konto usunięte

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

W tabeli mam wszystkie numeratory.
Dla każdego numeratora mam ostatnią wartość.
Numerację gwarantuję lockiem - explicite stawianym na wierszu z tabeli z numeratorami.
Proces wystawiania faktury kończy commit, albo rollback...

Dla mnie to było wystarczająco wydajne i spójne przy okazji. Minusem jest lock, ale podczas wystawiania użytkownik nie musiał widzieć "nowego" numerka. Więc długość trwania transakcji nie była uzależniona od widzimisię użytkownika. W innym przypadku - trzeba brać pierwsze wolne. Ogólnie - dzięki wydzieleniu tego w osobną funkcję - reszta systemu nie musi wiedzieć jak nadawane są numery i metodę można zmienić. Rozważałem oczywiście różne rozwiązania - pierwsze wolne może mieć problem na koniec roku. No, ale... z drugiej strony - takie nieścisłości i tak są pomijalne i US raczej się nie będzie czepiać.

konto usunięte

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Piotr Wolański:
Sekwencja może zapewnić tylko unikalność
ale już nie ciągłość.
Szczególnie jak wykorzystasz cache'owanie numerów.

Numeracja faktur nie musi być ciągła. Musi być tylko unikalna.
Paweł Grzegorz Kwiatkowski

Paweł Grzegorz Kwiatkowski Architekt
oprogramowania,
Ericsson

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Krzysztof Kozłowski:
Piotr Wolański:
Sekwencja może zapewnić tylko unikalność
ale już nie ciągłość.
Szczególnie jak wykorzystasz cache'owanie numerów.

Numeracja faktur nie musi być ciągła. Musi być tylko unikalna.

Wydaje mi się, że nie jest to prawda. Ustawa o rachunkowości nie mówi wprost o tym, że numeracja nie musi być ciągła.
Dodatkowo, na http://podatki.gazetaprawna.pl/orzeczenia/453440,zla_n... jest
napisane, że Wojewódzki Sad Administracyjny w Warszawie uznał, "[...] poprawną metodą dokumentowania jest nadawanie kolejnych,
następujacych po sobie numerów fakturom VAT." W rozporządzeniu ministra finansów, jest mowa o "numerze kolejnym",
http://www.mf.gov.pl/_files_/podatki/vat_i_akcyzowy/ak....

Czyli faktur VAT nie trzeba numerować kolejno w sensie: 1,2,3,... ale podmiot wystawiający można przyjąć sobie
inny wzorzec numeracji. Jednak w tym wzorcu musza występować kolejne liczby (np. X/MM/RRRR, gdzie X to kolejne numery).

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Krzysztof Kozłowski:
>> Numeracja faktur nie musi być ciągła. Musi być tylko unikalna.

Nie nie musi... ale to jest najbardziej popularny sposób
wypełnienia zapisu ustawy o sprawdzeniu _kompletności_ zapisów
np. art.20. ust. 5 pkt 3 Ustawy o Rachunkowości

Jak masz dziury w numeracji to skąd wiesz, że masz kompletne zapisy ?

konto usunięte

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Piotr Wolański:
Jak masz dziury w numeracji to skąd wiesz, że masz kompletne zapisy ?

Jasne, że różne US różnie do tego podchodzą, ale na podstawie numeracji faktur nie da się stwierdzić, czy mamy do czynienia z dziurą w numeracji, czy nie.

Przykład: czy pomiędzy fakturami o numerach FV/2010/10/12345 i FV/2010/11/0001 jest dziura w numeracji czy jej nie ma?

Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle

Krzysztof Kozłowski:
Piotr Wolański:
Jak masz dziury w numeracji to skąd wiesz, że masz kompletne zapisy ?

Jasne, że różne US różnie do tego podchodzą, ale na podstawie numeracji faktur nie da się stwierdzić, czy mamy do czynienia z dziurą w numeracji, czy nie.

Przykład: czy pomiędzy fakturami o numerach FV/2010/10/12345 i FV/2010/11/0001 jest dziura w numeracji czy jej nie ma?

I właśnie dlatego numeracja z numerem miesiąca jest taka dobra ;)
zawsze można dopisać "znalezione" faktury do zeszłego miesiąca i jest OK.

Następna dyskusja:

Oracle - auto numerowanie d...




Wyślij zaproszenie do