Announcement

Collapse
No announcement yet.

Delphi 7 - AdoDataSet.Clone() in Verbindung mit Lookup- und berechneten Feldern

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

  • Delphi 7 - AdoDataSet.Clone() in Verbindung mit Lookup- und berechneten Feldern

    Hallo,

    ab Delphi 7 kann die Clone Methode direkt über die VCL aufgerufen werden. Einige Tests des Methoden -Aufrufs waren erfolgreich.

    Nach dem Clonen müssen nun noch
    die Calc- und Lookupfields vom SourceDataSet in das CloneDataSet
    übertragen werden.

    Weis jemand, wie man das am besten anstellen kann ?

    <pre>
    var
    ASourceDateSet,
    ACloneDataSet : TAdoDataset;

    begin
    ACloneDataSet.Clone(ASourceDataSet)
    ...
    </pre>

    Gruß
    Mathias

  • #2
    Hallo,

    wenn die TADODataSet-Komponente im Objektinspektor entsprechend konfiguriert wurde, reicht es doch aus, wenn der Komponente zu Laufzeit die geclonte (gefüllte) Recordset-Objektinstanz untergeschoben wird:
    <pre>
    ...
    with ADODataSet2 do
    begin
    RecordSet := aRS;
    Active := True;
    end;
    ...
    </pre>
    Es wird in diesem Fall nicht die Konfiguration zur Laufzeit geclont, sondern nur die Datenmenge

    Comment


    • #3
      Hallo,

      ich habe das mal getestet. Leider ohne Erfolg.

      Wenn man mal kurz darüber Nachdenkt kann es ja auch eigentlich nicht funktionieren. In aRs werden nur echte Datenbankfelder gehalten. Calc und Lockupfelder werden erst später über die entsprechende Formulardatei (Form oder DataModule) von Delphi hinzugeführt. aRS kennt diese Informationen nicht.

      Auch die ab Delphi 7 implementierte VCL - Clone Methode zeigt im eigentlichen nur auf _RecordSet.Clone, Calc und Lookupfelder werden nicht berücksichtigt.

      Hier einmal die Problembeschreibung:

      ASourceDataSet wird statisch im Datenmodul gehalten, so kann ASourceDataSet auch ganz normal über die IDE verändert werden.

      Wenn nun ein Datensatz in ASourceDataSet geändert oder hinzugefügt wird. Soll dies nicht direkt in ASourceDataSet, sondern in einem Clone(ACloneDataset) durchgeführt werden. Da für das ändern oder anlegen des Datensatzes auch Calc- und Lookupfelder benötigt werden, reicht eine normales Clonen nicht aus.

      Gruß
      Mathia

      Comment


      • #4
        Hallo,

        &gt;aRS kennt diese Informationen nicht.

        ja eben - die berechneten Spalten tauchen nur im VCL-TDataSet auf, aber niemals im Recordset. Daher gelingt das Unterschieben auch. Das folgende Beispiel demonstriert dies:

        <pre>
        <b>USE</b> tempdb
        <b>GO</b>
        <br>
        <b>CREATE</b> <b>TABLE</b> CalcDemo
        (
        RecID <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>IDENTITY</b> <b>PRIMARY</b> <b>KEY</b>,
        Value1 <b>INTEGER</b> <b>NOT</b> <b>NULL</b>,
        Value2 <b>INTEGER</b> <b>NOT</b> <b>NULL</b>
        )
        <b>GO</b>
        <b>INSERT</b> <b>INTO</b> CalcDemo (Value1,Value2) <b>VALUES</b> (2,3)
        <b>INSERT</b> <b>INTO</b> CalcDemo (Value1,Value2) <b>VALUES</b> (3,4)
        <b>INSERT</b> <b>INTO</b> CalcDemo (Value1,Value2) <b>VALUES</b> (4,5)
        <b>INSERT</b> <b>INTO</b> CalcDemo (Value1,Value2) <b>VALUES</b> (5,6)
        <b>GO</b>
        </pre>
        Beim Anklicken des Buttons wird die Datenmenge geklont und der zweiten TADODataSet-Instanz untergeschoben, die ebenfalls über die Zwischenablage von der ersten Instanz "geklont" wurde: Beide TDBGrid-Instanzen zeigen die korrekten Daten in der berechneten Spalte an, obwohl es diese Spalte im gefüllten Recordset überhaupt nicht gibt.
        <pre>
        <b>unit</b> Unit1;
        <br>
        <b>interface</b>
        <br>
        <b>uses</b>
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls;
        <br>
        <b>type</b>
        TForm1 = <b>class</b>(TForm)
        DBGrid1: TDBGrid;
        ADOConnection1: TADOConnection;
        ADODataSet1: TADODataSet;
        DataSource1: TDataSource;
        ADODataSet1RecID: TAutoIncField;
        ADODataSet1Value1: TIntegerField;
        ADODataSet1Value2: TIntegerField;
        ADODataSet1CalcValue1Value2: TIntegerField;
        ButtonClone: TButton;
        ADODataSetCloneWithCalcField: TADODataSet;
        AutoIncField1: TAutoIncField;
        IntegerField1: TIntegerField;
        IntegerField2: TIntegerField;
        IntegerField3: TIntegerField;
        DBGrid2: TDBGrid;
        DataSourceClone: TDataSource;
        <b>procedure</b> ADODataSet1CalcFields(DataSet: TDataSet);
        <b>procedure</b> ButtonCloneClick(Sender: TObject);
        <b>procedure</b> ADODataSetCloneWithCalcFieldCalcFields(DataSet: TDataSet);
        <b>private</b>
        <font color="#003399"><i>{ Private-Deklarationen }</i></font>
        <b>public</b>
        <font color="#003399"><i>{ Public-Deklarationen }</i></font>
        <b>end</b>;
        <br>
        <b>var</b>
        Form1: TForm1;
        <br>
        <b>implementation</b>
        <br>
        <font color="#003399"><i>{$R *.dfm}</i></font>
        <br>
        <b>uses</b> ADOInt;
        <br>
        <b>procedure</b> TForm1.ADODataSet1CalcFields(DataSet: TDataSet);
        <b>begin</b>
        ADODataSet1CalcValue1Value2.Value := ADODataSet1Value1.Value *
        ADODataSet1Value2.Value;
        <b>end</b>;
        <br>
        <b>procedure</b> TForm1.ButtonCloneClick(Sender: TObject);
        <b>var</b>
        aCloneRS : RecordSet;
        <b>begin</b>
        aCloneRS := ADODataSet1.Recordset.Clone(adLockUnspecified);
        ADODataSetCloneWithCalcField.Recordset := aCloneRS;
        ADODataSetCloneWithCalcField.Active := True;
        <b>end</b>;
        <br>
        <b>procedure</b> TForm1.ADODataSetCloneWithCalcFieldCalcFields(Data Set: TDataSet);
        <b>begin</b>
        IntegerField3.Value := IntegerField1.Value *
        IntegerField2.Value;
        <b>end</b>;
        <br>
        <b>end</b>.
        </pre>
        Konfiguration des Formulars im Objektinspektor:
        <pre>
        <b>object</b> Form1: TForm1
        Left = 192
        Top = 114
        Width = 870
        Height = 640
        Caption = <font color="#9933CC">'Form1'</font>
        Color = clBtnFace
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = <font color="#9933CC">'MS Sans Serif'</font>
        Font.Style = []
        OldCreateOrder = False
        PixelsPerInch = 96
        TextHeight = 13
        <b>object</b> DBGrid1: TDBGrid
        Left = 8
        Top = 8
        Width = 377
        Height = 113
        DataSource = DataSource1
        TabOrder = 0
        TitleFont.Charset = DEFAULT_CHARSET
        TitleFont.Color = clWindowText
        TitleFont.Height = -11
        TitleFont.Name = <font color="#9933CC">'MS Sans Serif'</font>
        TitleFont.Style = []
        <b>end</b>
        <b>object</b> ButtonClone: TButton
        Left = 96
        Top = 200
        Width = 75
        Height = 25
        Caption = <font color="#9933CC">'Clone'</font>
        TabOrder = 1
        OnClick = ButtonCloneClick
        <b>end</b>
        <b>object</b> DBGrid2: TDBGrid
        Left = 8
        Top = 240
        Width = 377
        Height = 120
        DataSource = DataSourceClone
        TabOrder = 2
        TitleFont.Charset = DEFAULT_CHARSET
        TitleFont.Color = clWindowText
        TitleFont.Height = -11
        TitleFont.Name = <font color="#9933CC">'MS Sans Serif'</font>
        TitleFont.Style = []
        <b>end</b>
        <b>object</b> ADOConnection1: TADOConnection
        Connected = True
        ConnectionString =
        <font color="#9933CC">'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In'</font> +
        <font color="#9933CC">'fo=False;Initial Catalog=tempdb;Data Source=(local)'</font>
        LoginPrompt = False
        Provider = <font color="#9933CC">'SQLOLEDB.1'</font>
        Left = 120
        Top = 64
        <b>end</b>
        <b>object</b> ADODataSet1: TADODataSet
        Active = True
        Connection = ADOConnection1
        CursorType = ctStatic
        OnCalcFields = ADODataSet1CalcFields
        CommandText = <font color="#9933CC">'select RecID, Value1, Value2 from CalcDemo'</font>
        Parameters = &lt;&gt;
        Left = 160
        Top = 64
        <b>object</b> ADODataSet1RecID: TAutoIncField
        FieldName = <font color="#9933CC">'RecID'</font>
        ReadOnly = True
        <b>end</b>
        <b>object</b> ADODataSet1Value1: TIntegerField
        FieldName = <font color="#9933CC">'Value1'</font>
        <b>end</b>
        <b>object</b> ADODataSet1Value2: TIntegerField
        FieldName = <font color="#9933CC">'Value2'</font>
        <b>end</b>
        <b>object</b> ADODataSet1CalcValue1Value2: TIntegerField
        FieldKind = fkCalculated
        FieldName = <font color="#9933CC">'CalcValue1Value2'</font>
        Calculated = True
        <b>end</b>
        <b>end</b>
        <b>object</b> DataSource1: TDataSource
        DataSet = ADODataSet1
        Left = 192
        Top = 64
        <b>end</b>
        <b>object</b> ADODataSetCloneWithCalcField: TADODataSet
        CursorType = ctStatic
        OnCalcFields = ADODataSetCloneWithCalcFieldCalcFields
        CommandText = <font color="#9933CC">'select RecID, Value1, Value2 from CalcDemo'</font>
        Parameters = &lt;&gt;
        Left = 48
        Top = 296
        <b>object</b> AutoIncField1: TAutoIncField
        FieldName = <font color="#9933CC">'RecID'</font>
        ReadOnly = True
        <b>end</b>
        <b>object</b> IntegerField1: TIntegerField
        FieldName = <font color="#9933CC">'Value1'</font>
        <b>end</b>
        <b>object</b> IntegerField2: TIntegerField
        FieldName = <font color="#9933CC">'Value2'</font>
        <b>end</b>
        <b>object</b> IntegerField3: TIntegerField
        FieldKind = fkCalculated
        FieldName = <font color="#9933CC">'CalcValue1Value2'</font>
        Calculated = True
        <b>end</b>
        <b>end</b>
        <b>object</b> DataSourceClone: TDataSource
        DataSet = ADODataSetCloneWithCalcField
        Left = 88
        Top = 296
        <b>end</b>
        <b>end</b>
        </pre>
        Siehe auch http://www.entwickler.com/itr/features/psecom,id,104,nodeid,77.htm

        Comment

        Working...
        X