AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Letzte vergebene Nummer speichern

Letzte vergebene Nummer speichern

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

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#1

AW: Letzte vergebene Nummer speichern

  Alt 5. Aug 2022, 17:51
Ein asynchrones Statement, in welchem nur die Nummer generiert wird.
https://www.firebirdfaq.org/faq16/
Wie dort, nur eben auf die eigene Datenbank. (die Werte für die Connection kann man von der aktuellen Connecion auslesen/nehmen)

Das ist dann unabhängig von Transaktionen und der Dauer des Executes.


Wir nutzen sowas für ein Log in der DB (Tabelle) ... bei einer Exception würde ja die Transaction zurückgesetzt und das Log würde verschwinden ... so aber nicht, da in einer unabhängigen Transaktion gespeichert wurde.
Bzw. was Ähnliches auch für Tabellen, welche über alle Entwicklungsdatenbanken geshared werden. (wie eine globale Tabelle, obwohl eigentlich Jeder seine Eigene hätte)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 5. Aug 2022 um 17:54 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.559 Beiträge
 
Delphi 7 Professional
 
#2

AW: Letzte vergebene Nummer speichern

  Alt 5. Aug 2022, 18:25
Für mich immernochnicht wirkliche Klar ist: Was ist die letzte ID?

Zuerst die SP aufgerufen, zuletzt die SP aufgerufen?

Zuerst in der SP (unabhängig von der Gesamtlaufzeit) erstellte ID?

Zuletzt in der SP (unabhängig von der Gesamtlaufzeit) erstellte ID?

Der höchste Wert, der, ohne Beachtung von Prefix und Suffix, ermittelt wurde?

Der Moment, in dem in der SP die ID feststeht, unabhängig von der Laufzeit der davor und der danach auszuführenden Teile der SP?

Post #8 und #12 geben mir da noch nicht ausreichend Klarheit.

Eventuell könnte man die Tabelle LastId noch etwas aufbohren:

SQL-Code:
create Table LastID
(
  Reihenfolge BIGINT not null,
  DeineID Integer not null, -- oder welcher Type das auch immer sein mag.
  Prefix VarChar(32), -- oder wie lang Präfix auch immer maximal lang sein mag
  ID Integer,
  Suffix VarChar(32) -- oder wie lang Suffix auch immer maximal lang sein mag
);
CREATE GENERATOR GEN_Reihenfolge;
SET GENERATOR GEN_Reihenfolge TO 0;

-- in der SP an geeigneter Stelle:
insert into LastID (Reihenfolge, DeineID, Prefix, ID, Suffix) values (Gen_ID(GEN_Reihenfolge, 1), DeineID, a, b, c);
Dann könnte die letzte ID z. B. sinngemäß in der Art ermittelt werden:
SQL-Code:
select ID from LastID
where Reihenfolge =
(
  select Max(Reihenfolge) as MaxID
  from LastID
  where Prefix = 'gesuchtes Präfix
  and Suffix = 'gesuchtes Suffix'
)
Aber nach Deinem letzten Einwand dürfte sich das Problem auch nur örtlich, aber nicht zeitlich, verlagern.

Oder:
SQL-Code:
SP
begin
  insert into LastID (Reihenfolge, DeineID) values (Gen_ID(GEN_Reihenfolge, 1), ErzeugeMeineID);
end;
Inzwischen ahne ich, wo das konkrete Problem zu suchen ist und nein, eine wirkliche Lösung fällt mir dazu nicht ein
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
865 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Letzte vergebene Nummer speichern

  Alt 5. Aug 2022, 18:36
Für mich immernochnicht wirkliche Klar ist: Was ist die letzte ID?

Der höchste Wert, der, ohne Beachtung von Prefix und Suffix, ermittelt wurde?
Fast richtig. Der letzte Wert, den *mein* Generator in meiner SP erzeugt hat. Das ist meistens der höchste Wert von meinem Generator aber nicht immer. Wenn der Generator wieder bei 1 anfägt.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.559 Beiträge
 
Delphi 7 Professional
 
#4

AW: Letzte vergebene Nummer speichern

  Alt 5. Aug 2022, 18:43
Ja, aber dann ist es immernoch der mit der höchsten Reihenfolge.
SQL-Code:
select ID from LastID
where Reihenfolge =
(
  select Max(Reihenfolge) as MaxID
  from LastID
  where Prefix = 'gesuchtes Präfix
  and Suffix = 'gesuchtes Suffix'
)
müsste dann schon passen.

Geändert von Delphi.Narium ( 5. Aug 2022 um 18:44 Uhr) Grund: Schreibfehler, selbst bei so wenig Text :-(
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
865 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Letzte vergebene Nummer speichern

  Alt 5. Aug 2022, 18:46
Ja, aber dann ist es immernoch der mit der höchsten Reihenfolge.
Nein. Siehe mein Beispiel in Post #20. Und der Generator kann ja wieder von 1 anfangen und dann im zweiten Durchlauf den ersten Durchlauf überholen. Oder im ersten Durchlauf generell einen höheren Wert erreicht haben als im zwweiten oder n-ten Durchlauf.

Geändert von BlueStarHH ( 5. Aug 2022 um 18:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Letzte vergebene Nummer speichern

  Alt 5. Aug 2022, 18:58
Ich sehe da momentan drei Möglichkeiten für eine Kollision durch nebenläufigen Zugriff:
  1. Beide verwenden den Generator
  2. Einer verwendet den Generator, der andere nicht
  3. Beide verwenden den Generator
Punkt 1 ist offenbar unkritisch: Es ist egal, welche der erzeugten IDs wir speichern.
Punkt 2 habe ich so verstanden, dass dann die ID mit Generator gewinnt.
Punkt 3 wäre der Fall, wo der höhere Generatorwert gewinnt, wenn wir ausschließen können, dass während der Kollision der Generator zurückgesetzt wird.

Ist das soweit richtig?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
865 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Letzte vergebene Nummer speichern

  Alt 5. Aug 2022, 19:03
Ich sehe da momentan drei Möglichkeiten für eine Kollision durch nebenläufigen Zugriff:
  1. Beide verwenden den Generator nicht
  2. Einer verwendet den Generator, der andere nicht
  3. Beide verwenden den Generator
Punkt 1 ist offenbar unkritisch: Es ist egal, welche der erzeugten IDs wir speichern.
Punkt 2 habe ich so verstanden, dass dann die ID mit Generator gewinnt.
Punkt 3 wäre der Fall, wo der höhere Generatorwert gewinnt, wenn wir ausschließen können, dass während der Kollision der Generator zurückgesetzt wird. Beim Zurücksetzen gewinnt der neue Startwert.

Ist das soweit richtig?
Ja, ich habs nochmal konkretisiert in fett.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.559 Beiträge
 
Delphi 7 Professional
 
#8

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.688 Beiträge
 
Delphi 12 Athens
 
#9

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
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:25 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