Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySQL, Unidac und AutoInc (https://www.delphipraxis.net/185558-mysql-unidac-und-autoinc.html)

JRichmann 19. Jun 2015 18:49

Datenbank: MaySQL • Version: 5.X • Zugriff über: Unidac

MySQL, Unidac und AutoInc
 
Hallo zusammen,

ich habe einen Masterdatensatz und im gleichen Bildschirm mehrere Detailsätze zu diesem Master.

Die Daten stehen in einer MySQL DB
Es wird UniDAC Verwendet
Die P-Keys in der Tabelle sind Auto Inc Felder.

Mein Problem ist folgendes:
Wenn ich einen neuen Mastersatz anlege,
aber noch nicht gespeichert habe, sind
die P-Key Felder in der UniQuery leer.
Diese werden erst nach dem Spichern gefüllt.

Insofern kann, so lange der Mastersatz nicht gespeichert ist keine Detailsatz angelegt werden,
da ich die Bindung noch nicht kenne.

Hat jemad eine Idee ?
Kann man die Masterquery irgendwie dazu bringen,,, den P-Key bereits zu kennen ?
Ohne zu speichern ?

Danke und Grüße

mkinzler 19. Jun 2015 18:55

AW: MySQL, Unidac und AutoInc
 
Da der Masterdatensatz in der Datenbank noch nicht existiert, funktioniert eine automatische Master/detailbeziehung erst nach dem Post des Masterdatensatzes.

JRichmann 19. Jun 2015 19:22

AW: MySQL, Unidac und AutoInc
 
Keine Chance die ID früher (vor dem speichern) zu erfahren ?

Das Problem is folgendes:
Es wir hier eine alte Access-DB auf MySQL umgestellt.
Früher (mit Access und den GM-Dao Komponenten) war
das scheinbar anders. Es sheit hier funkctioniert zu haben.

Die Anpassung ist jetzt für mich tödlich viel Arbeit.

Grüße und Danke

HolgerX 20. Jun 2015 16:25

AW: MySQL, Unidac und AutoInc
 
Mal eine einfache Frage:

Woher soll dein im Arbeitsspeicher, aber noch nicht in der Datenbank bestehende Datensatz wissen, welche ID von der DATENBANK beim speichern (post) vergeben wird?

Denn zwischen deinem begin Edit des Masterdatensatzes und deinem POST kann von einem anderen Client bereits ein Post ausgeführt werden, dann währe deine ID gleich um 2 höher wie bei beginn des Edits..


Erst mit Post wird der Datensatz an die DB geschickt, erst dann wird die nächste ID per AutoInc vergeben.

Dies war auch schon bei Access so, außer das die dort verwendeten Datenbank-Komponenten automatisch ein (internen) Post ausgeführt haben, wenn der Detailsatz erstellt wird.

Oder es wurde eine PseudoID im Speicher verwendet, welches durch die DB-Komponente beim Post korrigiert wurde...

Ich kenne keine Komponenten, die eine von der DB vergebenen ID schon im voraus 'reservieren' kann..

Bernhard Geyer 20. Jun 2015 16:47

AW: MySQL, Unidac und AutoInc
 
Zitat:

Zitat von HolgerX (Beitrag 1305903)
Ich kenne keine Komponenten, die eine von der DB vergebenen ID schon im voraus 'reservieren' kann..

Wenn man sowas benötigen würde sollte man statt AutoInc-Felder GUIDs als PK-Werte verwenden.

Perlsau 20. Jun 2015 16:51

AW: MySQL, Unidac und AutoInc
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wozu mußt du die neue Id des Masterdatensatzes kennen, bevor du ihn gespeichert hast? Mach es doch so, daß die Detail-Datensätze erst angelegt werden, nachdem der Masterdatensatz erzeugt wurde. Je nach Datenbanksystem gibt es auch die Möglichkeit, den Trigger für das Erzeugen der Id bereits vor dem Insert auszulösen, so daß du schon vor dem Posten die neue Id weißt bzw. abrufen kannst. In IbExpert bzw. Firebird, meinem bevorzugten DBMS, sieht das so aus:

Sir Rufo 21. Jun 2015 00:35

AW: MySQL, Unidac und AutoInc
 
Ein ClientDataSet verwendet in diesem Fall eine PseudoID (negative Werte)

jobo 21. Jun 2015 08:55

AW: MySQL, Unidac und AutoInc
 
Also zuerst die Warnung, dann die Anwort:
Mit dem folgenden Vorschlag kannst Du in Teufelsküche kommen, wenn es nicht wasserdicht umgesetzt ist und es ist durchaus möglich, dass es gar nicht geht. Das musst Du also sauber prüfen, ob es theoretisch gemeinsam mit den Delphikomponenten Deinen Anwendungsfall abdeckt, ob es das praktisch auch tut (Mehrbenutzerumgebung, ...) und in Betracht ziehen, dass es keine wirkliche Lösung ist, denn normalerweise werden für soetwas andere Verfahren verwendet, die mysql aber nicht bietet.
Wenn überhaupt, eignet sich der Kram unten eher für SQL Scripts, mglw. kann das auch innerhalb Deiner Komponenten transaktionssicher durchgeführt werden.

Du kannst Dir 1. in mysql aus dem Information Schema den nächsten Auto Increment Wert je Tabelle holen und Du kannst 2. die zuletzt vergebene ID abfragen. Daraus kannst Du ggF. das zusammensetzen, was Du brauchst:
Nächste AutoID
Code:
SELECT AUTO_INCREMENT
  FROM INFORMATION_SCHEMA.TABLES
 WHERE TABLE_SCHEMA = 'myDB'
   AND TABLE_NAME = 'myTable';
Code:
LAST_INSERT_ID(); /*bzw*/ SELECT LAST_INSERT_ID();

p80286 21. Jun 2015 09:49

AW: MySQL, Unidac und AutoInc
 
Zitat:

Zitat von Perlsau (Beitrag 1305907)
Wozu mußt du die neue Id des Masterdatensatzes kennen, bevor du ihn gespeichert hast? Mach es doch so, daß die Detail-Datensätze erst angelegt werden, nachdem der Masterdatensatz erzeugt wurde.

Der Frage kann ich mich nur anschließen. Solange ein Datensatz nicht gespeichert wurde, existiert er für eine DB nicht!

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 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