Announcement

Collapse
No announcement yet.

Master-Detail mit IBDataSet

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

  • Master-Detail mit IBDataSet

    Hallo,

    ich möchte aus einer Interbase Anwendung die bislang verwendeten IBTable rausschmeissen und durch IBDataSet ersetzen. Das Problem ist jetzt, wie bilde ich mit IBDataSet die Master-Detail Beziehung nach?<br>
    <br>
    Hätte da jemand einen Tipp für mich?

    Florian

  • #2
    Hallo,

    wenn die Detail-Datenmenge einen Parameter-Namen für die WHERE-Einschränkung nutzt, der mit einem Spalten-Namen der Master-Datenmenge übereinstimmt und wenn die Detail-Datenmenge über die Eigenschaft <b>DataSource</b> eine Verbindung zur Master-Datenmenge herstellt, ist das Verhalten von TIBDataSet völlig gleich. In dem folgenden Beispiel ist IBDataSet1 die Master-Datenmenge und IBDataSet2 die Detaildatenmenge, die über <i>select * from SALES where CUST_NO = :CUST_NO</i> ihre Ergebnismenge einschränkt. Immer dann, wenn in der Master-Datenmenge ein neuer Datensatz ausgewählt wird, führt IBX die SELECT-Abfrage der Detail-Datenmenge automatisch neu aus:
    <pre>
    object Form1: TForm1
    Left = 193
    Top = 114
    Width = 870
    Height = 640
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object DBGrid1: TDBGrid
    Left = 264
    Top = 48
    Width = 320
    Height = 120
    DataSource = DataSource1
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    end
    object DBGrid2: TDBGrid
    Left = 264
    Top = 184
    Width = 320
    Height = 120
    DataSource = DataSource2
    TabOrder = 1
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    end
    object IBDatabase1: TIBDatabase
    Connected = True
    DatabaseName = 'C:\Programme\Gemeinsame Dateien\Borland Shared\Data\EMPLOYEE.GDB'
    Params.Strings = (
    'user_name=sysdba'
    'password=masterkey'
    'lc_ctype=WIN1252')
    LoginPrompt = False
    DefaultTransaction = IBTransaction1
    IdleTimer = 0
    SQLDialect = 1
    TraceFlags = []
    Left = 88
    Top = 48
    end
    object IBTransaction1: TIBTransaction
    Active = True
    DefaultDatabase = IBDatabase1
    AutoStopAction = saNone
    Left = 88
    Top = 80
    end
    object IBDataSet1: TIBDataSet
    Database = IBDatabase1
    Transaction = IBTransaction1
    BufferChunks = 1000
    CachedUpdates = False
    DeleteSQL.Strings = (
    'delete from CUSTOMER'
    'where'
    ' CUST_NO = :OLD_CUST_NO')
    InsertSQL.Strings = (
    'insert into CUSTOMER'

    ' (CUSTOMER, CONTACT_FIRST, CONTACT_LAST, PHONE_NO, ADDRESS_LINE' +
    '1, ADDRESS_LINE2, '
    ' CITY, STATE_PROVINCE, COUNTRY, POSTAL_CODE, ON_HOLD)'
    'values'

    ' (:CUSTOMER, :CONTACT_FIRST, :CONTACT_LAST, :PHONE_NO, :ADDRESS' +
    '_LINE1, '

    ' :ADDRESS_LINE2, :CITY, :STATE_PROVINCE, :COUNTRY, :POSTAL_COD' +
    'E, :ON_HOLD)')
    RefreshSQL.Strings = (
    'Select '
    ' CUST_NO,'
    ' CUSTOMER,'
    ' CONTACT_FIRST,'
    ' CONTACT_LAST,'
    ' PHONE_NO,'
    ' ADDRESS_LINE1,'
    ' ADDRESS_LINE2,'
    ' CITY,'
    ' STATE_PROVINCE,'
    ' COUNTRY,'
    ' POSTAL_CODE,'
    ' ON_HOLD'
    'from CUSTOMER '
    'where'
    ' CUST_NO = :CUST_NO')
    SelectSQL.Strings = (
    'select * from CUSTOMER')
    ModifySQL.Strings = (
    'update CUSTOMER'
    'set'
    ' CUSTOMER = :CUSTOMER,'
    ' CONTACT_FIRST = :CONTACT_FIRST,'
    ' CONTACT_LAST = :CONTACT_LAST,'
    ' PHONE_NO = :PHONE_NO,'
    ' ADDRESS_LINE1 = :ADDRESS_LINE1,'
    ' ADDRESS_LINE2 = :ADDRESS_LINE2,'
    ' CITY = :CITY,'
    ' STATE_PROVINCE = :STATE_PROVINCE,'
    ' COUNTRY = :COUNTRY,'
    ' POSTAL_CODE = :POSTAL_CODE,'
    ' ON_HOLD = :ON_HOLD'
    'where'
    ' CUST_NO = :OLD_CUST_NO')
    Active = True
    Left = 144
    Top = 48
    end
    object IBDataSet2: TIBDataSet
    Database = IBDatabase1
    Transaction = IBTransaction1
    BufferChunks = 1000
    CachedUpdates = False
    SelectSQL.Strings = (
    'select * from SALES where CUST_NO = :CUST_NO')
    Active = True
    DataSource = DataSource1
    Left = 192
    Top = 80
    end
    object DataSource1: TDataSource
    DataSet = IBDataSet1
    Left = 176
    Top = 48
    end
    object DataSource2: TDataSource
    DataSet = IBDataSet2
    Left = 224
    Top = 80
    end
    end
    </pre>

    <pre>
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, Grids, DBGrids, DB, IBCustomDataSet, IBDatabase;

    type
    TForm1 = class(TForm)
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    IBDataSet1: TIBDataSet;
    IBDataSet2: TIBDataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    DataSource2: TDataSource;
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    end.
    </pre&gt

    Comment


    • #3
      Hallo Andreas,

      herzlichen Dank für die Hilfestellung,
      mit dem beschriebenen Weg klappts ohne Probleme.

      Floria

      Comment


      • #4
        Hallo, ich habe ein Problem mit IBDataset und master-detail:
        <br>Problem: Ich möchte gern in Tabelle1(ibdataset1) eine Tabelle anzeigen lassen,wobei in einer Spalte Werte eingetragen werden müssen.Dies will ich mit Master - Detail lösen, so dass der User in der Leeren Spalte via DropDown(combobox) die nötigen werte auswählen kann(die geschieht mit einer ibquery.
        <br>Die Daten werden auch im DropDown Menü des Grids angezeigt, aber wenn ich einen Wert auswähle soll Tabelle1 Geupdated werden mit diesem wert und das funktioniert nicht.<br>Muss man hierbei noch was beachten bezüglich des Updates ?<br>Ich habe im Objektmanager bei ibdataset die ibquery eingetragen unter Lookupdataset ...

        <br> Volke

        Comment


        • #5
          Hallo,

          das folgende Beispiel demonstriert das Nutzen von Nachschlagetabellen in einem TDBGrid. Die im TDBGrid sichtbare Auswahlspalte wird über den <b>Feld-Editor</b> als Lookup-Feld neu angelegt (siehe <i>IBDataSet1ANREDE</i>) und mit der Ergebnismenge der separaten SELECT-Abfrage für die Auswahldaten verbunden:

          Schritt 1: Testdatenbank
          <pre>
          /*************************************************
          /* Script fuer die ErsterVersuch-Datenbank */
          /* InterBase 6 Dialect 3-Datenbank */
          /************************************************/

          SET SQL DIALECT 3;

          /* Datenbank erzeugen */

          CREATE DATABASE 'C:\Konferenzen\EK2002\Workshops\InterBase\Datenba nk\ErsterVersuch.OSGDB'
          USER 'SYSDBA' PASSWORD 'masterkey'
          DEFAULT CHARACTER SET WIN1252;

          /* Generatoren festlegen */

          CREATE GENERATOR GEN_ANR;
          CREATE GENERATOR GEN_KDN;
          CREATE GENERATOR GEN_POS;
          SET GENERATOR GEN_KDN TO 1000;
          SET GENERATOR GEN_POS TO 1000;

          /* Tabelle ANR (Anreden) */

          CREATE TABLE ANR (
          ANRID INTEGER NOT NULL,
          Anrede VARCHAR(30) NOT NULL);
          ALTER TABLE ANR
          ADD CONSTRAINT PK_ANR PRIMARY KEY(ANRID);
          COMMIT WORK;

          INSERT INTO ANR (ANRID,Anrede) VALUES (GEN_ID(GEN_ANR,1), 'Herr');
          INSERT INTO ANR (ANRID,Anrede) VALUES (GEN_ID(GEN_ANR,1), 'Frau');
          INSERT INTO ANR (ANRID,Anrede) VALUES (GEN_ID(GEN_ANR,1), 'Firma');
          INSERT INTO ANR (ANRID,Anrede) VALUES (GEN_ID(GEN_ANR,1), '');
          COMMIT WORK;

          /* Tabelle KDN (Kunden) */

          CREATE TABLE KDN (
          KNDID INTEGER NOT NULL,
          ANRID INTEGER NOT NULL,
          Name1 VARCHAR(35) NOT NULL,
          Name2 VARCHAR(35),
          Datum DATE NOT NULL);
          ALTER TABLE KDN
          ADD CONSTRAINT PK_KDN PRIMARY KEY(KNDID);
          ALTER TABLE KDN
          ADD CONSTRAINT FK_KDN_ANR FOREIGN KEY (ANRID) REFERENCES ANR;
          COMMIT WORK;

          INSERT INTO KDN (KNDID,ANRID,Name1,Name2,Datum) VALUES (GEN_ID(GEN_KDN,1),1,'Manfred Mustermann','Malermeister','27.09.2002');
          INSERT INTO KDN (KNDID,ANRID,Name1,Name2,Datum) VALUES (GEN_ID(GEN_KDN,1),2,'Gerda Musterfrau','Managerin','27.09.2002');
          COMMIT WORK;

          /* Tabelle POS (Positionen) */

          CREATE TABLE POS (
          POSID INTEGER NOT NULL,
          KDNID INTEGER NOT NULL,
          PosText VARCHAR(20) NOT NULL,
          PosDatum DATE NOT NULL);
          ALTER TABLE POS
          ADD CONSTRAINT PK_POS PRIMARY KEY(POSID);
          ALTER TABLE POS
          ADD CONSTRAINT FK_POS_KDN FOREIGN KEY (KDNID) REFERENCES KDN;
          COMMIT WORK;

          INSERT INTO POS (POSID,KDNID,PosText,PosDatum) VALUES (GEN_ID(GEN_POS,1),1001,'Kunde1-Position','27.09.2002');
          COMMIT WORK;
          </pre>
          Schritt 2: Konfiguration im Objektinspektor
          <pre>
          object DM: TDM
          OldCreateOrder = False
          Left = 888
          Top = 794
          Height = 326
          Width = 552
          object IBDatabase1: TIBDatabase
          Connected = True
          DatabaseName =
          'C:\Konferenzen\EK2002\Workshops\InterBase\Datenba nk\ERSTERVERSUCH.OSGDB'
          Params.Strings = (
          'user_name=sysdba'
          'password=masterkey'
          'lc_ctype=WIN1252')
          LoginPrompt = False
          DefaultTransaction = IBTransaction1
          IdleTimer = 0
          SQLDialect = 3
          TraceFlags = []
          AllowStreamedConnected = False
          Left = 32
          Top = 16
          end
          object IBTransaction1: TIBTransaction
          Active = True
          DefaultDatabase = IBDatabase1
          Params.Strings = (
          'concurrency'
          'nowait')
          AutoStopAction = saNone
          Left = 32
          Top = 64
          end
          object IBDataSet1: TIBDataSet
          Database = IBDatabase1
          Transaction = IBTransaction1
          AfterPost = IBDataSet1AfterPost
          BufferChunks = 1000
          CachedUpdates = False
          DeleteSQL.Strings = (
          'delete from KDN'
          'where'
          ' KNDID = :OLD_KNDID')
          InsertSQL.Strings = (
          'insert into KDN'
          ' (KNDID, ANRID, NAME1, NAME2, DATUM)'
          'values'
          ' (:KNDID, :ANRID, :NAME1, :NAME2, ATUM)')
          RefreshSQL.Strings = (
          'Select '
          ' KNDID,'
          ' ANRID,'
          ' NAME1,'
          ' NAME2,'
          ' DATUM'
          'from KDN '
          'where'
          ' KNDID = :KNDID')
          SelectSQL.Strings = (
          'select KNDID, ANRID, NAME1, NAME2, DATUM from KDN')
          ModifySQL.Strings = (
          'update KDN'
          'set'
          ' KNDID = :KNDID,'
          ' ANRID = :ANRID,'
          ' NAME1 = :NAME1,'
          ' NAME2 = :NAME2,'
          ' DATUM = ATUM'
          'where'
          ' KNDID = :OLD_KNDID')
          GeneratorField.Field = 'KNDID'
          GeneratorField.Generator = 'GEN_KDN'
          Left = 112
          Top = 16
          object IBDataSet1KNDID: TIntegerField
          FieldName = 'KNDID'
          Origin = '"KDN"."KNDID"'
          Required = True
          end
          object IBDataSet1ANRID: TIntegerField
          FieldName = 'ANRID'
          Origin = '"KDN"."ANRID"'
          Required = True
          end
          object IBDataSet1NAME1: TIBStringField
          FieldName = 'NAME1'
          Origin = '"KDN"."NAME1"'
          Required = True
          Size = 35
          end
          object IBDataSet1NAME2: TIBStringField
          FieldName = 'NAME2'
          Origin = '"KDN"."NAME2"'
          Size = 35
          end
          object IBDataSet1DATUM: TDateField
          FieldName = 'DATUM'
          Origin = '"KDN"."DATUM"'
          Required = True
          end
          object IBDataSet1ANREDE: TStringField
          FieldKind = fkLookup
          FieldName = 'ANREDE'
          LookupDataSet = IBDataSetANR
          LookupKeyFields = 'ANRID'
          LookupResultField = 'ANREDE'
          KeyFields = 'ANRID'
          Size = 30
          Lookup = True
          end
          end
          object IBDataSet2: TIBDataSet
          Database = IBDatabase1
          Transaction = IBTransaction1
          AfterPost = IBDataSet2AfterPost
          OnNewRecord = IBDataSet2NewRecord
          BufferChunks = 1000
          CachedUpdates = False
          DeleteSQL.Strings = (
          'delete from POS'
          'where'
          ' POSID = :OLD_POSID')
          InsertSQL.Strings = (
          'insert into POS'
          ' (POSID, KDNID, POSTEXT, POSDATUM)'
          'values'
          ' (:POSID, :KDNID, :POSTEXT, :POSDATUM)')
          RefreshSQL.Strings = (
          'Select '
          ' POSID,'
          ' KDNID,'
          ' POSTEXT,'
          ' POSDATUM'
          'from POS '
          'where'
          ' POSID = :POSID')
          SelectSQL.Strings = (
          'select POSID, KDNID, POSTEXT, POSDATUM from POS '
          'where KDNID = :KNDID')
          ModifySQL.Strings = (
          'update POS'
          'set'
          ' POSID = :POSID,'
          ' KDNID = :KDNID,'
          ' POSTEXT = :POSTEXT,'
          ' POSDATUM = :POSDATUM'
          'where'
          ' POSID = :OLD_POSID')
          GeneratorField.Field = 'POSID'
          GeneratorField.Generator = 'GEN_POS'
          DataSource = FormMain.DataSource1
          Left = 112
          Top = 64
          object IBDataSet2POSID: TIntegerField
          FieldName = 'POSID'
          Origin = '"POS"."POSID"'
          Required = True
          end
          object IBDataSet2KDNID: TIntegerField
          FieldName = 'KDNID'
          Origin = '"POS"."KDNID"'
          Required = True
          end
          object IBDataSet2POSTEXT: TIBStringField
          FieldName = 'POSTEXT'
          Origin = '"POS"."POSTEXT"'
          Required = True
          end
          object IBDataSet2POSDATUM: TDateField
          FieldName = 'POSDATUM'
          Origin = '"POS"."POSDATUM"'
          Required = True
          end
          end
          object IBDataSetANR: TIBDataSet
          Database = IBDatabase1
          Transaction = IBTransaction1
          BufferChunks = 1000
          CachedUpdates = False
          SelectSQL.Strings = (
          'select ANRID, ANREDE from ANR order by ANREDE')
          Left = 192
          Top = 16
          object IBDataSetANRANRID: TIntegerField
          FieldName = 'ANRID'
          Origin = '"ANR"."ANRID"'
          Required = True
          end
          object IBDataSetANRANREDE: TIBStringField
          FieldName = 'ANREDE'
          Origin = '"ANR"."ANREDE"'
          Required = True
          Size = 30
          end
          end
          end
          </pre&gt

          Comment

          Working...
          X