Announcement

Collapse
No announcement yet.

AdoDatSet in anderes AdoDataSet kopieren?

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

  • AdoDatSet in anderes AdoDataSet kopieren?

    Hallo,

    ich habe ein gefiltertes ADODataSet. Ich möchte nun die
    gefilterten (sichbaren) Datensätze in ein eigenständiges, von
    der Struktur gleichartiges, DataSet umkopieren.

    Dieses neu erzeugte Dataset soll als ReportQuelle dienen.
    Es wird also nur temporär benötigt.

    Gruß

    Pascal

  • #2
    hi,
    ich mach sowas immer mit einer Memory-Table

    gruß, günthe

    Comment


    • #3
      Hallo Günther,

      hast Du ein Bsp. für mich. Nimmst Du eine MemoryTable wie
      kbmTable oder kann ADO soetwas von sich aus, wie z.B. die
      BDE bei Abfragen?

      Gruß

      Pasca

      Comment


      • #4
        Hallo,

        es gibt unter ADO verschiedene Wege für diese Aufgabe: <br>
        a) RecordSet über die Methode <b>Clone</b> vervielfältigen <br>
        b) RecordSet "von Hand" als Kopie erzeugen <br>
        Für das Clonen sollten sich hier im Forum über die Suche einige Beispiele finden lassen. Der Weg b) könnte so aussehen:
        <pre>
        procedure TForm1.ButtonCopyClick(Sender: TObject);
        var
        i : Integer;
        begin
        // Schritt 1: Feldstruktur kopieren
        with ADODataSet2 do
        begin
        FieldDefs.Clear;
        for i := 0 to ADODataSet1.FieldDefs.Count - 1 do
        begin
        with FieldDefs.AddFieldDef do
        begin
        Name := ADODataSet1.FieldDefs[i].Name;
        DisplayName := ADODataSet1.FieldDefs[i].DisplayName;
        Attributes := ADODataSet1.FieldDefs[i].Attributes;
        DataType := ADODataSet1.FieldDefs[i].DataType;
        Precision := ADODataSet1.FieldDefs[i].Precision;
        Required := ADODataSet1.FieldDefs[i].Required;
        Size := ADODataSet1.FieldDefs[i].Size;
        end;
        end;
        // Schritt 2: RecordSet anlegen
        CreateDataSet;
        end;
        // Schritt 3: Daten kopieren
        with ADODataSet1 do
        begin
        First;
        while not Eof do
        begin
        ADODataSet2.Append;
        for i := 0 to ADODataSet2.FieldCount - 1 do
        begin
        ADODataSet2.Fields[i].Value := Fields[i].Value;
        end;
        ADODataSet2.Post;
        Next;
        end;
        end;
        // Schritt 4: Kopierte Daten anzeigen
        ADODataSet2.Active := True;
        end;
        </pre&gt

        Comment


        • #5
          Hallo Herr Kosch,

          vielen herzlichen Dank! Irre, wie Sie dieses Forum betreuen!

          Ich habe es mit meinen Adonis-ADO-Komponenten versucht probiert. Es klappt alles einwandfrei bis zu dem CreateDataSet. Adonis kennt
          kein CreateDataSet.

          with DSetAufRep do
          begin
          FieldDefs.Clear;
          for i := 0 to DMAuftrag.DSetAuf.FieldDefs.Count - 1 do
          .....

          DSetAufRep.Create(nil); // CreateDataSet gibt es unter ADONIS
          nicht

          .......

          Ich habe mal unter clone im Forum gesucht. Leider sind in den
          Artikeln keine richtigen Source-Bsp. vorhanden. Hätten Sie
          eines für mich?

          Danke!

          Gruß

          Pasca

          Comment


          • #6
            Hallo,

            bei den Adonis-ADO-Komponenten muss ich passen, die kenne ich nur vom Namen her. Aber auch dort muss es ja irgend einen Weg geben, um die Struktur zu erzeugen, zumal ja alle diese VCL-Kompnenten nur auf die Microsoft ADO-Objekte zugreifen. Somit wäre auch das denkbar - beim folgenden Beispiel wird direkt das RecordSet-Objekt (COM-Objekt) angefordert:
            <pre>
            procedure TForm1.InitializeRecordset;
            begin
            FRecordset := CreateComObject(CLASS_Recordset) as _Recordset;
            FRecordset.CursorLocation := adUseClient;
            // Recordset mit eigener Datenstruktur erstellen
            FRecordset.Fields.Append('Name', adVarChar, 25, adFldUnspecified);
            FRecordset.Fields.Append('Vorname', adVarChar, 25, adFldUnspecified);
            FRecordset.Fields.Append('eMail', adVarChar, 25, adFldUnspecified);
            // Recordset öffnen
            FRecordset.Open(EmptyParam, EmptyParam, adOpenUnspecified,
            adLockUnspecified, 0);
            end;
            </pre>
            Nach dem Öffnen können nun die Daten über <b>AddNew</b> etc. hineinkopiert werden

            Comment

            Working...
            X