AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MySQL, Unidac und AutoInc

Ein Thema von JRichmann · begonnen am 19. Jun 2015 · letzter Beitrag vom 21. Jun 2015
Antwort Antwort
JRichmann

Registriert seit: 8. Dez 2009
Ort: Pattensen
57 Beiträge
 
Delphi XE5 Architect
 
#1

MySQL, Unidac und AutoInc

  Alt 19. Jun 2015, 19:49
Datenbank: MaySQL • Version: 5.X • Zugriff über: Unidac
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
Jörg Richmann
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: MySQL, Unidac und AutoInc

  Alt 19. Jun 2015, 19:55
Da der Masterdatensatz in der Datenbank noch nicht existiert, funktioniert eine automatische Master/detailbeziehung erst nach dem Post des Masterdatensatzes.
Markus Kinzler
  Mit Zitat antworten Zitat
JRichmann

Registriert seit: 8. Dez 2009
Ort: Pattensen
57 Beiträge
 
Delphi XE5 Architect
 
#3

AW: MySQL, Unidac und AutoInc

  Alt 19. Jun 2015, 20:22
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
Jörg Richmann
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#4

AW: MySQL, Unidac und AutoInc

  Alt 20. Jun 2015, 17:25
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..
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: MySQL, Unidac und AutoInc

  Alt 20. Jun 2015, 17:47
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#6

AW: MySQL, Unidac und AutoInc

  Alt 20. Jun 2015, 17:51
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:
Miniaturansicht angehängter Grafiken
beforeinsert.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: MySQL, Unidac und AutoInc

  Alt 21. Jun 2015, 01:35
Ein ClientDataSet verwendet in diesem Fall eine PseudoID (negative Werte)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: MySQL, Unidac und AutoInc

  Alt 21. Jun 2015, 09:55
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();
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: MySQL, Unidac und AutoInc

  Alt 21. Jun 2015, 10:49
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  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 12:06 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