Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Kommendes AutoInc Value bestimmen (https://www.delphipraxis.net/194261-kommendes-autoinc-value-bestimmen.html)

ATS3788 3. Nov 2017 14:29

Datenbank: XML • Version: XE7 • Zugriff über: Firedac

Kommendes AutoInc Value bestimmen
 
Hallo ich habe eine einfache
XML Datenbank und ich würde gerne
den kommenden AutoInc Counter in

procedure TDataModule1.FDMemTableBeforeInsert(DataSet: TDataSet);

auslesen. Geht das ?

Bei der folgenden Abfrage geht das es wäre nur toll das "before" zu machen

Delphi-Quellcode:
procedure TDataModule1.FDMemTableAfterPost(DataSet: TDataSet);
var
Counter : LongInt;
Count : Integer;
begin
Count := 6;
Counter := DataSet.FieldByName('Counter').AsLargeInt;
AddSongs(Counter,Count);
end;

ATS3788 8. Nov 2017 10:25

AW: Kommendes AutoInc Value bestimmen
 
Hallo vieleicht habe ich da einen falschen Denkansatz.

Ich habe eine Mutter Memory Table und generiere ein Auto Inc mit Counter,
soweit sogut, dann habe ich ein Unter Table und möchte das diese auf Counter reagiert
und alle Datensätze anzeigt.

nahpets 8. Nov 2017 12:30

AW: Kommendes AutoInc Value bestimmen
 
Ein AutoInc wird (eigentlich) von der Datenbank vergeben, es wird beim Speichern eines neuen Satzes ermittelt und dann in die entsprechenden Spalte eingefügt.

Es ist vorher nicht bekannt und kann von daher auch nicht vorher bestimmt werden.

Unter Oracle würd' ich 'ne Sequenz nehmen und von der im Before-Ereignis den nächsten Wert abfragen, sowie diesen dann in die entsprechende Spalte einfügen. Gleichzeitig hätte ich ihn für weitere Verarbeitungen zur Verfügung.

Bei FireBird geht's über 'nen Generator.

Auf die automatische Vergabe des Wertes über AutoInc muss man dann aber verzichten.

Welche Zwischenschicht sowas ggfls. wie handhaben kann, weiß ich nicht.

Uwe Raabe 8. Nov 2017 12:32

AW: Kommendes AutoInc Value bestimmen
 
Zitat:

Zitat von nahpets (Beitrag 1385639)
Ein AutoInc wird (eigentlich) von der Datenbank vergeben,

Hier geht es offenbar ausschließlich um TFDMemTable.

Zitat:

Zitat von ATS3788 (Beitrag 1384985)
Hallo ich habe eine einfache
XML Datenbank


Hobbycoder 8. Nov 2017 12:34

AW: Kommendes AutoInc Value bestimmen
 
AutoInc wird im Normalfall vom DBMS verwaltet und dient in der Regel dazu, Datensätzen eine einzigartigen ID zu verpassen, um die sich das Anwendungsprogramm nicht kümmern muss.

Solange sichergesellt ist, dass eine Table nur von einem Cleint verwendet wird, was ja bei MemoryTables möglich ist, dann könnte man einfach mal Max(Couter) abfragen. Der nächste Int wäre dann wohl auch der nächste AutoInc-Wert.
ABER:
Ein DBMS speichert sich für die Tables die jeweiligen aktuellen AutoInc-Wert weg, und und nimmt dies zum Bestimmen des nächsten AutoInc-Werts.
Das heißt, wird aus der Table:
ID Name
1 Tom
2 Klaus
3 Peter
der Datensatz "Peter" gelöscht, bleibt der letzte AutoInc der Tabelle auf 3. Wenn jetzt "Willi" eingefügt wird, dann sieht die Tabelle so aus
ID Name
1 Tom
2 Klaus
4 Willi

Würde man also mit Max(ID) vor dem Einfügen von "Willi" abfragen, bekäme man als Result 2 und würde fälschlicherweise davon ausgehen, dass der nächste die 3 wäre.

Es gibt je nach DBMS auch die Möglichkeit für eine AutoInc den gespeicherten Wert abzufragen. Ob das bei MemoryTables auch geht, weiß ich nicht.

Oder du verwaltest Counter generell selbst, also kein AutoInc sondern nur ein normales Int-Feld. Dann kannst du generell mit Max(Couter)+1 den nächsten bestimmen, musst ihn aber dann auch selber mit eintragen.
Letzteres ist aber in eine Multiuser-Umgebung nicht wirklich zu empfehlen, dann es kann auf Grund verschiedener Ursachen immer dazu kommen, dass zwischen Abfrage des Max(Couter)+1 und dem tatsächlichen Speichern des Datensatzes doch noch ein anderes Speichervorgang eines anderen Clients dazwischen kommt. Und schon hätte eine Inkonsistenz.

nahpets 8. Nov 2017 12:44

AW: Kommendes AutoInc Value bestimmen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1385641)
Zitat:

Zitat von nahpets (Beitrag 1385639)
Ein AutoInc wird (eigentlich) von der Datenbank vergeben,

Hier geht es offenbar ausschließlich um TFDMemTable.

Zitat:

Zitat von ATS3788 (Beitrag 1384985)
Hallo ich habe eine einfache
XML Datenbank


Schon klar. Und in dem Falle ist für mich TFDMemTable "die Datenbank".

Arbeite recht viel mit der kbmMemTable. Ist auch nur 'ne Textdatei, quasi CSV mit 'nem Header davor, in dem die Tabellendefinition steht. Kann auch AutoInc. Ist alles in Delphi, Quelltext vorhanden.
Trotzdem kann ich da 'nen AutoInc-Wert nicht im BeforePost-Ereignis abfragen. Das macht auch "die Datenbank". Auch wenn da real garkeine Datenbank im eigentlichen Sinne vorhanden ist.

Hier müsste man also mal durch die Sourcen von TFDMemTable gehen, schauen, wo und wie die AutoIncs vergeben bzw. verwalten und ggfls. da dann ansetzen.

Bei 'ner sinnvollen Kapselung des datenbanktypischen Verhaltens, dürften die Aussichten eher schlecht sein, einen AutoInc-Wert vor seiner Vergabe zu erhalten.

Uwe Raabe 8. Nov 2017 13:08

AW: Kommendes AutoInc Value bestimmen
 
Zitat:

Zitat von nahpets (Beitrag 1385646)
Bei 'ner sinnvollen Kapselung des datenbanktypischen Verhaltens, dürften die Aussichten eher schlecht sein, einen AutoInc-Wert vor seiner Vergabe zu erhalten.

Ist in der Tat nicht so offensichtlich. Den letzten AutoInc-Wert findet man über
Delphi-Quellcode:
FDMemTable1.Table.Columns.CurrValues[0]
(unter der Annnahme, daß das AutoInc-Feld den Index 0 hat).


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz