AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Kommendes AutoInc Value bestimmen
Thema durchsuchen
Ansicht
Themen-Optionen

Kommendes AutoInc Value bestimmen

Ein Thema von ATS3788 · begonnen am 3. Nov 2017 · letzter Beitrag vom 8. Nov 2017
Antwort Antwort
Benutzerbild von ATS3788
ATS3788

Registriert seit: 18. Mär 2004
Ort: Kriftel
646 Beiträge
 
Delphi XE Starter
 
#1

Kommendes AutoInc Value bestimmen

  Alt 3. Nov 2017, 14:29
Datenbank: XML • Version: XE7 • Zugriff über: Firedac
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;
Martin MIchael
  Mit Zitat antworten Zitat
Benutzerbild von ATS3788
ATS3788

Registriert seit: 18. Mär 2004
Ort: Kriftel
646 Beiträge
 
Delphi XE Starter
 
#2

AW: Kommendes AutoInc Value bestimmen

  Alt 8. Nov 2017, 10:25
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.
Martin MIchael
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: Kommendes AutoInc Value bestimmen

  Alt 8. Nov 2017, 12:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Kommendes AutoInc Value bestimmen

  Alt 8. Nov 2017, 12:32
Ein AutoInc wird (eigentlich) von der Datenbank vergeben,
Hier geht es offenbar ausschließlich um TFDMemTable.

Hallo ich habe eine einfache
XML Datenbank
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#5

AW: Kommendes AutoInc Value bestimmen

  Alt 8. Nov 2017, 12:34
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Kommendes AutoInc Value bestimmen

  Alt 8. Nov 2017, 12:44
Ein AutoInc wird (eigentlich) von der Datenbank vergeben,
Hier geht es offenbar ausschließlich um TFDMemTable.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Kommendes AutoInc Value bestimmen

  Alt 8. Nov 2017, 13:08
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 FDMemTable1.Table.Columns.CurrValues[0] (unter der Annnahme, daß das AutoInc-Feld den Index 0 hat).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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:51 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