![]() |
AW: Firbird Generator und Transaction
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. |
AW: Firbird Generator und Transaction
Zitat:
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:
und es gibt eine wo ich werte ablege, die doch nicht benutzt wurde
CREATE TABLE BRPNR (
ID BIGINT NOT NULL, TN VARCHAR(32) COLLATE UNICODE, NR integer, REUSE CHAR(1) );
Code:
auf den Tabellen die da oben Reuse 'T' haben erzeuge ich automatisiert trigger die in etwa so aussehen
CREATE TABLE BRPNRX (
ID BIGINT NOT NULL, TN VARCHAR(32) COLLATE UNICODE, NR integer );
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:
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
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 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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz