Home » Tutorials » Datenbanken » ZEOS Library – Einsatz mit Delphi und Firebird

ZEOS Library – Einsatz mit Delphi und Firebird

ZEOS Master/Detail-Unterstützung

Die DataSet-Komponenten der ZEOS Library unterstützen von Hause aus zwei Arten von Master/Detail-Verbindungen: Verbindungen mit serverseitiger Filterung und Verbindungen mit clientseitiger Filterung. Beide Arten und noch eine weitere, die von ZEOS unabhängig und somit auch ohne jeglichen Komfort ist, werden im Folgenden beschrieben.
Anmerkung: Wenn in diesem Abschnitt vom „Master“ oder „Detail“ gesprochen wird, dann ist damit ein DataSet-Nachfolger (TZQuery/TZReadOnlyQuery, TZTable oder ein TZStoredProc) gemeint, über den auf die Master- bzw. Detail-Ergebnismenge einer Master/Detail-Verbindung zugegriffen wird.

Master/Detail mit serverseitiger Filterung

Diese Methode entspricht dem Stantdardverhalten der BDE-TQuery-Komponente. Eine Master/Detail-Verbindung zwischen zwei DataSets wird hier wie folgt eingerichtet:

  • Die DataSource des Masters wird in die Property DataSource des Deatils eingetragen.
  • Im Detail-SQL-Statement müssen die Primärschlüsselfelder des Masters in der WHERE-Klausel gegen die Fremdschlüsselfelder des Deatails geprüft werden.

Hier ein Beispiel für einfache Master/Detail-SQL-Statements. Voruassetzung: Verwendung von TZQuery oder TZReadOnlyQuery für die Master/Detail-Verbindung:

  • Master-SQL:
     SELECT id, feld1, feld2, feld3
     FROM   master
  • Detail-SQL:
     SELECT feld1, feld2, master_id
     FROM   detail
     WHERE  master_id = :id

Der Parameter :id steht für den Inhalt des Feldes „id“ des Masters (ist dort Primärschlüssel), denn in die Property DataSource des Details wird die DataSource des Masters eingetragen. Somit bezieht sich dieser Parameter auf das gleichnamige Feld des Masters. Das Feld master_id im Detail-SQL ist das Fremdschlüssel-Feld der Detailtabelle, welches auf den Primärschlüssel des Masters referenziert.
Ändert der Cursor im Master DataSet bei Serverfilterung die Position (Wechsel des Datensatzes), dann wird das SQL-Statement des Details erneut mit den aktuellen Schlüsselwerten ausgeführt. Die Ergebnismenge des Details wird somit automatisch angepasst.

Master/Detail mit clientseitiger Filterung

Diese Methode entspricht dem Standardverhalten der BDE-TTable-Komponente. Eine Master/Deatail-Verbindung zwischen zwei DataSets wird hier wie folgt eingerichtet:

  • Die DataSource des Masters wird in die Property MasterDataSource des Details eingetragen.
  • Die Primärschlüsselfelder des Masters werden in der Property MasterField des Details eingetragen.
  • Der Fremdschlüssel des Details, der den Primärschlüssel des Masters referenziert, wird in die Property IndexFieldNames eingetragen.

Bei der clientseitigen Filterung übertragen die DataSets zuerst alle Tabellenzeilen vom Server auf den Client. Das Detail setzt dann (auf der Clientseite) einen entsprechenden Filter, um die Detaildaten des aktuellen Masterdatensatztes zu erhalten.
Die Master/Detail-Verbindungen mit clientseiter Filterung haben einen Automatismus für den Fall, dass ein neuer Detail-Datensatz angelegt wird: Die Fremdschlüsselfelder des Details (angegeben in der Property IndexFieldNames des Details) werden automatisch mit den entsprechenden (aktuellen) Primärschlüsseldaten des Masters (angegeben in der Property MasterField des Details) gefüllt. Bei serverseitiger Filterung muss man in diesem Fall über den Programmcode dafür sorgen, dass die Fremdschlüsselfelder des Details mit den zugehörigen Primärschlüsseldaten aus dem Master versorgt werden. Das kann durch die Ausprogrammierung des OnNewRecord-Ereignisses des Details realisiert werden. Dieses Ereignis wird immer dann ausgelöst, wenn ein neuer Datensatz angelegt (hinzugefügt) werden soll (siehe hierzu auch die Delphi Online-Hilfe zu TDataSet). Bezogen auf die oben definierten SQL-Statements, wird folgendes implementiert:

procedure dmMasterDetail.qryDetailNewRecord(DataSet: TDataSet);
begin
  qryDetailMASTER_ID.Value := qryMasterID.Value;
end;

Für die Datenfelder master_id des Details und id des Masters wurden über den Feldeditor die entsprechenden TFields erstellt.

Info: Für Master/Detail-Verbindungen unter ZEOS gibt es eine nützliche Option, die über die Property Options im Master eingestellt wird: es ist doAlwaysResyncDetail. Ist diese Option gesetzt, dann wird die Ergebnismenge des Details nur bei einem Post bzw. Zeilen-/Datensatzwechsel im Master aktualisiert.

Master/Detail – „zu Fuß“

Die klassische Methode der Realisierung einer Master/Detail-Verbindung ähnelt der für die serverseitige Filterung. Die Statements sehen genau so aus. Lediglich die dort in Master und Detail gesetzten Properties (wie oben beschrieben) werden hier nicht gesetzt. Die TZQueries „laufen“ im Prinzip unabhängig voneinander. Das bedeutet: Das Detail bekommt von einer Änderung im Master nichts mit. Seine Synchronisierung muss also nachprogrammiert werden. Das geschieht im Regelfall über das OnChange-Ereignis des Masters. Dieses Ereignis wird ausgelöst, wenn zu einem neuen Datensatz gewechselt wurde oder Felddaten des zugrunde liegenden DataSet geändert wurden (siehe hierzu auch die Delphi Online-Hilfe zu TDataSource). Die Synchronisierung des Details müsste für oben genanntes Beispiel wie folgt implementiert werden:

procedure dmMasterDetail.dsMasterDataChange(
  Sender: TObject; Field: TField);
begin  
  with qryDetail do begin
    Close;
    ParamByName('id').Value := qryMasterID.Value;
    Open;
  end;
end;

Das ist im Prinzip das Gleiche, was ZEOS bei serverseitiger Filterung automatisch ausführt: Das Detail-Query wird (erneut) mit dem aktuellen ID-Wert des Masters, der an den Parameter „:id“ im Detail-SQL-Statement übergeben wird, ausgeführt. Somit wird seine Ergebnismenge in Bezug auf den aktuellen Master-Datensatz aktualisiert.
Soll im Detail ein neuer Datensatz angelegt werden, dann gilt auch hier das Gleiche, wie bei serverseitiger Filterung (siehe dortige Erläuterung).

Ein Gedanke zu „ZEOS Library – Einsatz mit Delphi und Firebird“

  1. Lieben Dank für dieses tolle Tutorial. Es ist sehr klar und übersichtlich, und eine tolle Hilfe für den Einstieg.

     

Kommentare sind geschlossen.