Announcement

Collapse
No announcement yet.

Nested DataSets

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Nested DataSets

    Ich habe da ein paar Verständnisprobleme mit den DataSetFields, also DataSets die in anderen Datenmengen eingebunden sind. Wenn ich das richtig verstehe, wird in der Hauptmenge ein Feld vom Typ TDataSetField definiert welches dann in der unterlagerten Tabelle über die Eigenschaft DataSetField angesprochen wird. Was mir gedanklich fehlt, ist sowas wie eine Master-Detail Verbindung zwischen der Haupt- und der eingelagerten Datenmengen. Woher "weiss" die Hauptmenge, welcher Teil der eingelagerten Tabelle in einer Zeile gültig ist? Wie muss mann vorgehen, wenn existierende Tabellen (master-detail verknüpft) als NestedDataSets angezeigt werden sollen?
    Gruss Peter

  • #2
    Hallo,

    angenommen, das eigene Programm greift über ADO (ADO Express) auf die Datenbank zu. In diesem Fall können die Dienste des <b>Shape</b>-Providers in Anspruch genommen werden, indem die SELECT-Abfrage wie folgt aussieht:
    <pre>
    SHAPE {SELECT * FROM Customers}
    APPEND ({SELECT * FROM Orders}
    RELATE CustomerID TO CustomerID)

    </pre>
    Über die RELATE-Anweisung wird der Shape-Provider darüber informiert, wie die Verknüpfung zwischen den beiden Tabellen hergestellt werden soll.

    Die TADODataSet-Instanz fordert über die <b>CommandText</b>-Eigenschaft eine Shape-Datenmenge ab, die aus den Datensätzen der Tabellen Customer und Orders besteht. Der Shape-Provider fasst dabei die Detail-Daten aus Orders in einem <b>Chapter</b> (alias nested Dataset) zusammen. Über den Feldeditor legt man nun persistente TField-Instanzen an, wobei Delphi automatisch den Typ <b>TDataSetField</b> für das nested Dataset verwendet.
    <pre>
    object ADODataSet1: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorType = ctStatic
    CommandText =
    'SHAPE {SELECT * FROM Customers}'#13#10'APPEND ({SELECT * FROM Orders}'#13 +
    #10'RELATE CustomerID TO CustomerID)'
    Parameters = <>
    Left = 432
    Top = 211
    object ADODataSet1CustomerID: TWideStringField
    FieldName = 'CustomerID'
    FixedChar = True
    Size = 5
    end
    object ADODataSet1CompanyName: TWideStringField
    FieldName = 'CompanyName'
    Size = 40
    end
    object ADODataSet1City: TWideStringField
    FieldName = 'City'
    Size = 15
    end
    object ADODataSet1Chapter1: TDataSetField
    FieldName = 'Chapter1'
    ReadOnly = True
    IncludeObjectField = False
    end
    end
    </pre>
    Werden die Daten nun über TDataSource in einem TDBGrid angezeigt, stellt Delphi automatisch einen Button in diesem Feld dar. Klickt man den Button an, werden die Nested Dataset-Datensätze in einem eigenen Standard-Formular (wird nicht im eigenen Programm implementiert) angezeigt.

    Möchten man die Daten in zwei getrennten TDBGrids anzeigen, wird eine 2. TADODataSet-Instanz benötigt, die über die Eigenschaft <b>DataSetField</b> mit dem Chapter (nested Dataset) verbunden wird.

    Comment


    • #3
      Das Konzept müsste aber doch eigentlich auch mit anderen TDataSet Nachfplgern als TADODataSet funktionieren, die dann den Shape-Provider nicht zur Verfügung haben.</br> Allgemein scheint es sich um das Problem zu handeln, wie man "runde Objekte" in "eckige Tabellen" packt.</br> Wie sieht es zum Beispiel aus, wenn man 2 (Master-Detail Verknüpfte) Interbase DataSets in dieser Form darstellen möchte

      Comment


      • #4
        Hallo,

        in diesem Fall würde ich zu TClientDataSet (Delphi 5) oder <b>TIBClientDataSet</b> (Delphi 6) greifen. Dort hat Borland diese Nested Dataset-Fähigkeiten ebenfalls implementiert (damit MIDAS auch für ORACLE-Datenbanken eingesetzt werden kann, arbeitet aber mit allen Datenbanken zusammen). Solange sich alles im gleichen Programm (auf dem gleichen Rechner) abspielt, fallen keine MIDAS-Lizenzkosten an.

        In der Delphi-Hilfe wird dies in der Hilfeseite zu <i>TCustomClientDataSet.DataSetField</i> beschrieben

        Comment

        Working...
        X