Announcement

Collapse
No announcement yet.

Verlust Master-Detail Beziehung bei ADODatasets?

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

  • Verlust Master-Detail Beziehung bei ADODatasets?

    Folgende Situation:<br>
    Ich greife mittels ADODB auf Access97 - Datenbank über Microsoft.Jet.OLEDB.4.0 zu. <br>
    Im ObjectInspektor wurde ADOConnection, Mastertabelle (T_TRADE) und Detailtabelle (T_FST) je als ADODataset (cmdText) angelegt. <br>
    T_FST hat als Datasource S_TRADE (Source für T_TRADE) Masterfields ist IFST, das in beiden Tabellen gleich heißt.
    Zunächst erscheint bei einer einfachen SQL (select * from TRADE bzw. select * from FST) alles normal. <br>
    Wenn ich beide Abfragen jedoch so erweitere, das Parameter einbezogen werden, die zur Laufzeit zugewiesen werden,<br>
    erscheint zwar das richtige Abfrageergebnis, jedoch werden in der T_FST alle Sätze angezeigt, die die Parameter befriediegen, <br>
    aber eben ALLE, nicht nur die die gleiche IFST wie inder Mastertabelle haben?
    Kann mir jemand weiterhelfen? Das betreffende Teil sieht so aus:<br>
    <pro>
    var TP:TParameter;
    C_Text:='select * from FSTS';
    C_Text:=C_Text + ' where BEGINN<=:QVON';
    C_Text:=C_Text + ' and ENDE>=:QBIS';
    T_FST.CommandText := C_Text;
    T_FST.Parameters.Clear;
    TP:=T_FST.Parameters.AddParameter;
    TP.Name :=QVON;
    TP.DataType :=ftDateTime;
    TP.Value := dat1;
    TP:=T_FTS.Parameters.AddParameter;
    TP.Name :=QBIS;
    TP.DataType :=ftDateTime;
    TP.Value := dat2;
    T_FST.Open;
    </pro> <br>
    Wie gesagt, die Query funktioniert, bloß die Detailbeziehung ist irgendwie verloren gegangen!<br>
    Hendrik

  • #2
    Hallo,

    ich kann den Effekt mit der Beispieldatenbank DBDEMOS.MDB nicht reproduzieren:
    <pre>
    object DBGrid1: TDBGrid
    Left = 16
    Top = 48
    Width = 473
    Height = 121
    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 = 16
    Top = 232
    Width = 489
    Height = 137
    DataSource = DataSource2
    TabOrder = 1
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    end
    object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
    'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\BO' +
    'RLAND\Gemeinsame Dateien\Borland Shared\Data\dbdemos.mdb;Mode=Sh' +
    'are Deny None;Extended Properties="";Jet OLEDB:System database="' +
    '";Jet OLEDB:Registry Path="";Jet OLEDBatabase Password="";Jet ' +
    'OLEDB:Engine Type=5;Jet OLEDBatabase Locking Mode=1;Jet OLEDB:' +
    'Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;J' +
    'et OLEDB:New Database Password="";Jet OLEDB:Create System Databa' +
    'se=False;Jet OLEDB:Encrypt Database=False;Jet OLEDBon'#39't Copy L' +
    'ocale on Compact=False;Jet OLEDB:Compact Without Replica Repair=' +
    'False;Jet OLEDB:SFP=False'
    LoginPrompt = False
    Mode = cmShareDenyNone
    Provider = 'Microsoft.Jet.OLEDB.4.0'
    Left = 16
    Top = 8
    end
    object ADODataSet1: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorType = ctStatic
    CommandText = 'select CustNo, Addr1, City from customer WHERE City > :sAnfang'
    Parameters = <
    item
    Name = 'sAnfang'
    Attributes = [paNullable]
    DataType = ftFixedChar
    NumericScale = 255
    Precision = 255
    Size = 510
    Value = 'H'
    end>
    Left = 64
    Top = 8
    end
    object DataSource1: TDataSource
    DataSet = ADODataSet1
    Left = 96
    Top = 8
    end
    object ADODataSet2: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorType = ctStatic
    CommandText = 'orders'
    CommandType = cmdTableDirect
    DataSource = DataSource1
    IndexFieldNames = 'CustNo'
    MasterFields = 'CustNo'
    Parameters = <>
    Left = 64
    Top = 192
    end
    object DataSource2: TDataSource
    DataSet = ADODataSet2
    Left = 104
    Top = 192
    end
    end
    </pre&gt

    Comment


    • #3
      Hallo Hr. Kosch,<br>
      erstmal danke für Ihre Bemühungen. Die Beispieldatenbank trifft jedoch nicht ganz den Kern des Problems: Auch das 2. DataSet ist bei mir vom Typ cmdText. Gerade hier (also beim DetailDataset und nur hier) tritt das Problem auf. Wie schon erwähnt, bei einem normalen "select * from FSTS" wird die richtige Master - Detailbeziehung wiedergegeben.<br>
      Wird jedoch während der Laufzeit eine parametriesierte SQL - Abfrage zum Öffnen der T_FST geschickt, werden alle Datensätze angezeigt.<br>
      Hendri

      Comment


      • #4
        Hallo,

        was spricht dagegen, in diesem Fall die JOIN-Verbindung selbst in diese SELECT-Anweisung einzubinden? Der Automatismus von ADO macht nur dann Sinn, wenn der Entwickler seine SELECTs nicht selbst definiert (sondern sich auf ADO verlässt). Sobald man selbst eingreift, hält sich ADO aus der Sache raus ("... viele Köche verderben den Brei..."). Man muss nur dafür sorgen, dass der Parameter-Name für die JOIN-Verknüpfung exakt dem Spaltennamen der übergeordneten Tabelle entspricht.
        &#10

        Comment


        • #5
          Ja, das Problem mußte einige Tage liegen bleiben. Ich hab jetzt alle Master_Detail Beziehungen aus dem Objektinspektor entfernt und folgende SQL - formuliert:
          <pre>
          C_Text:='select a.IFST, a.KST, a.FST, a.AP, a.BEGINN, a.ENDE,';
          C_Text:=C_Text + ' b.IFST, b.TOINCL';
          C_Text:=C_Text + ' from FSTS a, ARBEIT b where a.IFST = b.IFST';
          C_Text:=C_Text + ' and b.TOINCL = true';
          C_Text:=C_Text + ' and a.BEGINN<=:QVONF';
          C_Text:=C_Text + ' and a.ENDE>=:QBISF';
          T_FST.CommandText := C_Text;
          T_FST.Parameters.Clear;
          AddParam(T_FST,'QVONF',Bis);
          AddParam(T_FST,'QBISF',von);
          T_FST.Open;
          </pre>
          Leider bekomme ich nun zur Laufzeit die Fehlermeldung "T_FST: Field 'IFST' not found" obwohl das Feld natürlich da ist, es ist primary und auch im Objektinspektor sichtbar! Was mache ich da nur falsch?<br>
          Hendri

          Comment


          • #6
            Hallo,<br>
            vergesst die letzte Frage, Problem gelöst<br>
            Hendri

            Comment

            Working...
            X