AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Letzte vergebene Nummer speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Letzte vergebene Nummer speichern

Ein Thema von BlueStarHH · begonnen am 3. Aug 2022 · letzter Beitrag vom 7. Aug 2022
Antwort Antwort
Delphi.Narium

Registriert seit: 27. Nov 2017
2.598 Beiträge
 
Delphi 7 Professional
 
#1

AW: Letzte vergebene Nummer speichern

  Alt 5. Aug 2022, 19:08
Wann wird denn der Generator auf 1 gesetzt?

Datumsabhängig? Dann muss das Datum, das Quartal, der wie auch immer geartete Wert, anhand dessen eine Zeitabfolge erkennbar werden könnte, mit in die Tabelle LastID.

Z. B. sowas in der Art?

SQL-Code:
insert into LastID (Reihenfolge, DeineID, Prefix, ID, Suffix, Monat, Jahr)
values (Gen_ID(GEN_Reihenfolge, 1), DeineID, a, b, c, Month(Current_Date), Year(Current_Date));
SQL-Code:
select Max(ID) as MaxID
from LastID
where Prefix = 'gesuchtes Präfix
and Suffix = 'gesuchtes Suffix'
and Monat = 1
and Jahr = 2022
Letztlich muss die Information mitgespeichert werden, mit der eindeutig festgestellt werden kann, zu welchem Zeitraum die zu ermittelnde letzte ID gehört.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#2

AW: Letzte vergebene Nummer speichern

  Alt 5. Aug 2022, 21:11
Ich glaube, es fehlt ein Kriterium, mit dem man feststellen kann, ob zwischen zwei Generatorwerten ein Rücksetzen stattgefunden hat. Andernfalls gibt es keine Möglichkeit, die Werte im Nachgang zu priorisieren.

Man könnte z.B. beim Rücksetzen einen Zählerwert erhöhen. Damit wäre die Kombination Zählerwert/Generator-ID eindeutig.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.598 Beiträge
 
Delphi 7 Professional
 
#3

AW: Letzte vergebene Nummer speichern

  Alt 6. Aug 2022, 18:34
@BlueStarHH

Schau doch bitte mal, ob Du damit einen Ansatz bauen kannst: FireBird - Understanding the WITH LOCK clause
SQL-Code:
Syntax and behaviour

    SELECT ... FROM single_table
       [WHERE ...]
       [FOR UPDATE [OF ...]]
       [WITH LOCK]
Damit wird bis zum Commit eine Tabelle / ein Datensatz / eine Spalte gelockt. Andere können dann nicht schreiben, bekommen entweder eine Exception oder warten, bis die Freigabe erfolgt. Das kommt doch dann einer CriticalSection sehr nahe.

Dazu müsstest Du dann am Beginn der SP eine Tabelle / einen Datensatz / eine Spalte locken und zwar entsprechend für die Speicherung der jeweils letzten ID. Am Ende der SP schreibst Du dann die in der SP ermittelte ID entsprechend. Das anschließende Commit, egal aus ob aus der SP heraus oder aus dem aufrufenden Progamm, gibt den Datensatz bzw. Tabelle wieder frei, ebenso natürlich auch ein Rollback.

Für fachlich unterschiedliche IDs könnest Du dann eine Tabelle, mit nur einer Zeile, aber je ID einer Spalte, erstellen, per Select am Beginn der SP den Datensatz mit explizitem Lock auf die zu ändernde ID-Spalte lesen und am Ende genau die Spalte mit der ermittelten ID aktuallisieren.

Ohne auf korrekte Syntax zu achten als Idee:
SQL-Code:
procedure GetNextID
  SELECT LetzteIDSpalte FROM LetzteIDTabelle
  FOR UPDATE OF LetzteIDSpalte
  WITH LOCK;

  a := ErzeugePrefix;
 
  if Bedingung then
    b := gen_id(MeinGenerator, 1);
    UPDATE LetzteIDTabelle set LetzteIDSpalte = b;
  else
    b := '';

  c := ErzeugeSuffix;

  result := a+b+c;
end;
  Mit Zitat antworten Zitat
bnreimer42

Registriert seit: 26. Mai 2013
Ort: Erlangen, Franken
129 Beiträge
 
Delphi 12 Athens
 
#4

AW: Letzte vergebene Nummer speichern

  Alt 6. Aug 2022, 19:41
Man kann in Firebird einen Generator als "Sperre" und zum Prüfen, ob Du loslegen darfst verwenden.

Z.B.
Generator mit 0 initialisieren (Irgendwann mal, wenn kein Programm läuft)

Im Programm (oder Stored Procedure)
Einfach wert des Generators erhöhen.
Wenn = 1 dann mache, was Du tun musst, kein anderer kommt Dir in die Quere
Wenn > 1 reduziere den Generator um 1 und brich ab.

Das läuft super, außer die Prozedur bricht ab, wenn der Generator auf 1 steht, denn dann bleibt die Sperre auf ewig. Muss dann vom Admin wieder auf 0 gesetzt werden, wenn kein Programm läuft.

Das Vorgehen ist einfacher, als in einer Tabelle mit LOCK einen Satz zu sperren.
Björn Reimer
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
698 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Letzte vergebene Nummer speichern

  Alt 7. Aug 2022, 09:54
Es gibt auch globale Variablen in Firebird, die sind auch entsprechend abfragbar, wenn sie nicht zu Deiner Session / Connection gehören
  Mit Zitat antworten Zitat
Antwort Antwort


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 19: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-2025 by Thomas Breitkreuz