AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Dataset ADOQuery in ein Clientdataset kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dataset ADOQuery in ein Clientdataset kopieren

Ein Thema von SusiT · begonnen am 6. Okt 2023 · letzter Beitrag vom 11. Okt 2023
 
SusiT

Registriert seit: 15. Mai 2014
40 Beiträge
 
#8

AW: Dataset ADOQuery in ein Clientdataset kopieren

  Alt 8. Okt 2023, 11:16
Hallo, ich muss euch doch nochmal belästigen.

Grundsätzlich dachte ich, dass es funktioniert. Das tut es auch allerdings nur im ersten Durchlauf. Danach wird das ZielCds nicht erneut aktualisiert.

Folgende 2 Varianten habe ich erstellt:

Einmal mit einem CDS das global erstellt wurde und bei jedem Durchlauf geleert werden soll:

Delphi-Quellcode:

testCDS_global : TClientDataSet;
...
testCDS_global := TClientDataSet.Create(self);
Delphi-Quellcode:
procedure TDataContainer.fillupdataset;
var
  a,b : Integer;
begin
  try
    if testCDS_global.Active then
    begin
      testCDS_global.Open;
      testCDS_global.EmptyDataSet;
    end;
  except
    a:=a;
  end;

  try
    // a = Anzahl der Einträge im ADOquery dataset
    a := fDataContainerDbThread.ADOQuery.RecordCount;

    CopyDataSetToCDS(
      fDataContainerDbThread.ADOQuery,
      testCDS_global,
      false
    );

    b := testCDS_global.RecordCount;
  finally

  end;
end;
Diese Prozedur füllt das testCds nur beim ersten Durchlauf, sobald das CDS einmal erstellt, gefüllt und beim Durchlauf EmptyDataSet gemacht wurde, dann klappt das nicht mehr.


Folgende Prozedur führt zu einer Aktualisierung bei jedem Durchlauf:

Delphi-Quellcode:
procedure TDataContainer.fillupdataset2;
var
  a,b : Integer;
  testCDS_lokal : TClientDataSet;
begin
  testCDS_lokal := TClientDataSet.Create(nil);

  try
    // a = Anzahl der Einträge im ADOquery dataset
    a := fDataContainerDbThread.ADOQuery.RecordCount;

    CopyDataSetToCDS(
      fDataContainerDbThread.ADOQuery,
      testCDS_lokal,
      false
    );

    b := testCDS_lokal.RecordCount;
  finally
    FreeAndNil(testCDS_lokal);
  end;
end;
Heißt, es muss einen Unterschied zwischen einem neu createden CDS und einem CDS das mit EmptyDataSet behandelt wurde geben.
Ich komme nicht drauf


Vollständigkeitshalber:

Delphi-Quellcode:
procedure TDataContainer.CopyDataSetToCDS(Source: TDataSet; Dest: TClientDataSet; CloseSource: boolean);
var
  dsProvider: TDataSetProvider;
  a,b : Integer;
begin
  dsProvider := TDataSetProvider.Create(nil);
  try
    Source.First;
    dsProvider.DataSet := Source;

    dsProvider.GetRecords(-1, a, 0); // !!! Lade alle Records !!!

    Dest.SetProvider(dsProvider);
    Dest.Open;
  finally
    FreeAndNil(dsProvider);
  end;
  if CloseSource then
    Source.Close;
end;
Zusatzfrage:
Wenn die Variable dsProvider auf FreeAndNil gesetzt wird, woher kennt das das Sourcedataset im Anschluss dann noch seinen Provider? Das scheint an dieser Stelle egal zu sein? Der dsProvider ist ja ohnehin nur in dieser Prozedur verfügbar..
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz