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..