Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Dataset (Master-Detail) (https://www.delphipraxis.net/124934-dataset-master-detail.html)

nachti1505 27. Nov 2008 13:54

Datenbank: Firebird • Version: 2.1 • Zugriff über: FIBPlus

Dataset (Master-Detail)
 
Hallo!

Habe zwei Tabellen, welche in der DB mittels ForeignKey verlinkt sind. Auf diese wird aus Delphi mit FIBPlus zugegriffen. Master-Detail-Properties sind gesetzt.

Prinzipiell kann es nun zu folgendem Workflow kommen:

Code:
MasterSet.Insert (neuen Datensatz anlegen und bearbeiten)
MasterSet.TrageEinigeWerteEin
  DetailSet.Insert
  DetailSet.TrageEinigeWerteEin
  DetailSet.Post <-- ERROR!
MasterSet.Post
An besagter Stelle kommt ein Fehler (Referentielle Integrität verletzt), der mir auch vollkommen klar ist. Frage daher, wie sollte man den workflow designen um den Fehler zu vermeiden?

Edith fällt gerade noch ein, dass es in einige Situation hilfreich ist, das DetailSet auf CachedUpdates zu stellen und die Änderungen erst nach MasterSet.Post an die DB zu übertragen. Allerdings sollte in der aktuellen Situation auf CachedUpdates verzichtet werden.

mkinzler 27. Nov 2008 14:24

Re: Dataset (Master-Detail)
 
Befinden sich beide DataSets in der selben Transaktion?

nachti1505 27. Nov 2008 16:01

Re: Dataset (Master-Detail)
 
Jupp, befinden sie sich...

alex517 27. Nov 2008 20:26

Re: Dataset (Master-Detail)
 
Hi,

Du hast einen ForeignKey vom Slave auf den Master.
Der Fehler entsteht bei dem Versuch einen Slave-Datensatz zu speichern, bevor der ein Master-Datensatz existiert.
Firebird muss ein Masterdatensatz mit der neuen Master-ID bekannt sein bevor in einem Slave-Datensatz eine Referenz
darauf gesetzt werden kann.
Du musst erst ein Master.Post ausführen bevor du ein Slave.Post machen kannst.

Dabei ist zu beachten, dass der die ID (Master.PrimaryKey) auch in der lokalen Datenmenge des FibDataSets
eingetragen wird und damit auch für den Slave-DataSet zu Verfügung steht.

Das kann über 3 Wege erfolgen:
1: Properties FibDataSets.AutoUpdateOptions(GeneratorName, WhenGetGenID, UpdateTableName, Keyfields) setzen
2: im ID mit Gen_ID() im OnNewRecord-Event zuweisen
3: ab FB 2.0 mit INSERT INTO ... VALUES (...) RETURNING .., habe ich aber noch nicht verwendet

alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr.

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