AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firbird Generator und Transaction
Thema durchsuchen
Ansicht
Themen-Optionen

Firbird Generator und Transaction

Ein Thema von tkhandel · begonnen am 19. Mär 2025 · letzter Beitrag vom 20. Mär 2025
Antwort Antwort
Seite 2 von 2     12   
tkhandel

Registriert seit: 2. Jan 2022
Ort: Arnsberg im Sauerland
102 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Firbird Generator und Transaction

  Alt 20. Mär 2025, 12:18
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.
Jürgen
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
691 Beiträge
 
FreePascal / Lazarus
 
#12

AW: Firbird Generator und Transaction

  Alt 20. Mär 2025, 12:52
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
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 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 by Thomas Breitkreuz