Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#18

AW: Letzte vergebene Nummer speichern

  Alt 5. Aug 2022, 15:51
Wir haben hier ein grundlegendes Missverständnis.

Die von mir eingeführte ID hat nichts, aber auch garnichts mit der von Dir erstellten ID zu tun.

Die GeneratorID dient ausschließlich zur Kennzeichnung der letzten DeineID in der Tabelle LastID. Sie ist absolut losgelöst vom Rest des Universums zu sehen. Sie sagt nur, wirklich nur: Das ist der zuletzt eingefügte Datensatz.
Selbst wenn die von Dir für die Fachlichkeit erstellte ID minütlich bei 1 anfangen würde, zeigte die GeneratorID trotzdem immer auf die zuletzt erstellte DeineID.

Wir müssen hier strikt zwischen GeneratorID und DeineID unterscheiden. Fachlich gibt es hier keinerlei Zusammenhang. Es ist also problemlos möglich, dass sowohl die GeneratorID 1, die GeneratorID 12345 und die GeneratorID 5126811 alle auf DeineID 1 verweisen.

Flapsig formuliert: Mit DeineID kannst Du machen was Du willst, (beliebiges Zeitinterval) zurücksetzen, neuen Algorithmus entwickeln, ...

Die Reihenfolge ergibt sich immer durch die GeneratorID, das ist nix weiter als ein AutoInc, bei dem der nächste Satz halt den nächsten Wert in 'ner definierten Reihenfolge bekommt. Darüber kannst Du dann (sofern die Daten in der Tabelle immer erhalten bleiben) feststellen, in welcher Reihenfolge für DeineID die 1 vergeben wurde. Wann wurde die 1 zum ersten Mal vergeben, wann zum 2. Mal, wann zum x-mal.

Tabelle LastID:
GeneratorIDDeineID
0001XM07-001-Z
0002XM07-002-A
0003XM07-003-X
0004XM07-U
0005XM07-A
0006XM08-001-X
0007XM08-002-B
0008XM09-001-B
0009A444-5
... 
1001XM07-001-Z
... 
2002XM07-002-A
... 
3003XM07-003-X
... 
4004XM07-U
... 
5005XM07-A
... 
6006XM08-001-X
... 
8007XM09-001-B
8008XM08-002-B
8009A444-5
Wenn's verständlicher wird, nenn' die GeneratorID einfach Reihenfolge
SQL-Code:
create Table LastID
(
  Reihenfolge BIGINT not null,
  DeineID Integer not null -- oder welcher Type das auch immer sein mag.
);
CREATE GENERATOR GEN_Reihenfolge;
SET GENERATOR GEN_Reihenfolge TO 0;

-- in der SP an geeigneter Stelle:
insert into LastID (Reihenfolge, DeineID) values (Gen_ID(GEN_Reihenfolge, 1), DeineID);

-- zur Abfrage der neuesten DeineID
select first 1 DeineID from LastID order by Reihenfolge desc;

-- zur Ansicht der Reihenfolge der DeineID-Vergabe:
select Reihenfolge, DeineID from LastId order by Reihenfolge.

-- soll nachgeschaut werden, ob es eine DeineID mehrfach gibt:
select Count(*) as Anzahl, DeineID from LastID group by DeineID having Count(*) > 1 order by DeineID

-- soll für eine bestimmte DeineID, die mehrfach vorhanden ist, die Reihenfolge der Vergabe angezeigt werden?
select Reihenfolge, DeineID from LastID where DeineID = 'WertDerGesuchtenDeineID';
Ist die pure Anzeige der Reihenfolge noch nicht ausreichend, dann spendiere der Tabelle noch eine TimeStamp-Spalte und befülle diese jeweils mit.
SQL-Code:
create Table LastID
(
  Reihenfolge BIGINT not null,
  DeineID Integer not null, -- oder welcher Type das auch immer sein mag.
  ZeitStempel TimeStamp
);
CREATE GENERATOR GEN_Reihenfolge;
SET GENERATOR GEN_Reihenfolge TO 0;

-- in der SP an geeigneter Stelle:
insert into LastID (Reihenfolge, DeineID, ZeitStempel) values (Gen_ID(GEN_Reihenfolge, 1), DeineID, Current_TimeStamp);

-- Abfrage von DeineID in zeitlicher Abfolge:
select Reihenfolge, DeineID, Zeitstempel from LastID order by ZeitStempel, Reihenfolge
-- sollten innerhalb eines ZeitTempels mehrere DeineIDs eingefügt werden, so kannst Du damit auch bei denen noch die Reihenfolge der Erstellung nachvollziehen.
  Mit Zitat antworten Zitat