Hallo Holger,
ich hatte mich falsch oder besser gesagt Blöde ausgedrückt.
Die BON-Nr muss natürlich immer fortlaufend sein, deshalb der Generator bei der BonNr.
Ich hatte nur das Problem das ein Rollback alles zurück setzt nur den Generator nicht.
wird dir beim generator aber immer so passieren, es klingt aber so das du da mittlerweile einen
weg gefunden hast. ich mach das aber meistens auch so wie von billa angedeutet
es gibt eine Tabelle in der der aktuelle wert drin steht für jede nummer die ich brauche
Code:
CREATE TABLE BRPNR (
ID BIGINT NOT NULL,
TN VARCHAR(32) COLLATE
UNICODE,
NR integer,
REUSE CHAR(1)
);
und es gibt eine wo ich werte ablege, die doch nicht benutzt wurde
Code:
CREATE TABLE BRPNRX (
ID BIGINT NOT NULL,
TN VARCHAR(32) COLLATE
UNICODE,
NR integer
);
auf den Tabellen die da oben Reuse 'T' haben erzeuge ich automatisiert trigger die in etwa so aussehen
Code:
CREATE OR ALTER trigger gutschrift_brp03 for gutschrift
active before delete position 32001
AS
BEGIN
IF (COALESCE(OLD.NR,'')<>'') THEN
begin
INSERT INTO BRPNRX (TN, NR) VALUES ('GUTSCHRIFT', OLD.NR);
end
END
Code:
CREATE OR ALTER trigger gutschrift_brp04 for gutschrift
active before insert position 32001
AS
BEGIN
IF (COALESCE(NEW.NR,'')='') THEN
begin
--die folgenden 3 zeilen sind nur dann im trigger wenn reuse T
SELECT FIRST 1 NR FROM BRPNRX where BRPNRX.TN='GUTSCHRIFT' order by NR into new.nr;
if (new.nr is not null) then delete from brpnrx where BRPNRX.TN='GUTSCHRIFT' and nr=new.nr;
else
--ab hier dann auch ohne reuse, bei bedarf sogar schon immer beides mit autonomous transaction, damit das locking möglichst kurz dauert
begin
update brpnr set nr=nr+1 where brpnr.tn='GUTSCHRIFT';
select nr from brpnr where brpnr.tn='GUTSCHRIFT' into new.nr;
end
end
when any do begin
while (new.nr is null) do
execute procedure brpgetnrtryagain(new.id);
end
END
es ist gegenüber der realen version stark vereinfacht weil ich da auch noch variablen als template drin hab wie [JJJJ] und diversen anderen kram, funktioniert so in der art aber seit mehr als 10 jahren in einem realen kundenprojekt
zeigt aber auch so schon wie das laufen kann. die Prozedur brpgetnrtryagain lass ich mal weg, die macht aber sinngemäss das gleiche wie der trigger und wiederholt das im fall von einem deadlock so oft mit einer execute statement. with autonomous transaction bis da ein wert ermittet wurde , falls es ein locking problem gab.
der code da oben ist einfach so runtergetippt, also keine gewähr auf compilierbarkeit