Delphi:如何通过delta访问clientdataset
在TDatasetProvider.OnBeforeUpdateRecord上,如何 访问的源或源clientdataset 发送DeltaDS参数Delphi:如何通过delta访问clientdataset,delphi,tclientdataset,Delphi,Tclientdataset,在TDatasetProvider.OnBeforeUpdateRecord上,如何 访问的源或源clientdataset 发送DeltaDS参数 procedure TdmLoanPayment.dpLoanPaymentBeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boo
procedure TdmLoanPayment.dpLoanPaymentBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
var
sourceCDS: TClientDataset;
begin
sourceCDS := DeltaDS.???;
...
end;
我需要从相应的clientdataset访问一些属性。设置为TSQLDataset/TDatasetProvider/TClientDataset
编辑:
所有这些麻烦的原因是,我想从TDatasetProvider派生一个组件,并在BeforeUpdateRecord上指定一个默认值。我认为
SourceDS
就是我们要找的
Sender参数标识应用更新的提供者
SourceDS参数是数据来源的数据集。
如果没有源数据集,则该值为nil(Delphi)或NULL
(C++)。事件发生时,源数据集可能不处于活动状态,因此
在尝试访问其数据之前,请将其Active属性设置为true
DeltaDS参数是包含所有更新的客户端数据集
这些都在应用中。当前记录表示要更新的更新
即将申请
UpdateKind参数指示此更新是否为
修改现有记录(ukModify),插入新记录
(ukInsert),或要删除的现有记录(ukDelete)
应用的参数控制退出事件后发生的情况
处理程序。如果事件处理程序将Applied设置为true,则提供程序
忽略更新:它既不尝试应用更新,也不记录更新
指示未应用更新的错误。如果事件处理程序
如果将应用保留为false,则提供程序将在
事件处理程序退出
例如:
procedure TdmLoanPayment.dpLoanPaymentBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
ShowMessage(TClientDataSet(SourceDS).Name); // get source name
...
end;
编辑
或
我认为
SourceDS
是我们正在寻找的
Sender参数标识应用更新的提供者
SourceDS参数是数据来源的数据集。
如果没有源数据集,则该值为nil(Delphi)或NULL
(C++)。事件发生时,源数据集可能不处于活动状态,因此
在尝试访问其数据之前,请将其Active属性设置为true
DeltaDS参数是包含所有更新的客户端数据集
这些都在应用中。当前记录表示要更新的更新
即将申请
UpdateKind参数指示此更新是否为
修改现有记录(ukModify),插入新记录
(ukInsert),或要删除的现有记录(ukDelete)
应用的参数控制退出事件后发生的情况
处理程序。如果事件处理程序将Applied设置为true,则提供程序
忽略更新:它既不尝试应用更新,也不记录更新
指示未应用更新的错误。如果事件处理程序
如果将应用保留为false,则提供程序将在
事件处理程序退出
例如:
procedure TdmLoanPayment.dpLoanPaymentBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
ShowMessage(TClientDataSet(SourceDS).Name); // get source name
...
end;
编辑
或
如果在重新更新数据记录之前跟踪调用您的
datasetprovider 1b,您将
请参见,作为SourceDS参数传递的数据集是的Source
数据集
UpdateTree
,即AFAICS,dataset
属性所属的数据集
提供程序设置为。当然,这是而不是从中提取增量的CD
已经导出(在我的测试用例中,它实际上是一个TAdoQuery)
查看Provider.Pas中的源代码,我无法立即看到
找到增量源CD标识的方法。我认为这并不特别令人惊讶,因为提供者的操作是由CDS调用的,而不是由CDS调用的,提供者从CDS中需要的所有数据都是其增量
另一方面,BeforeUpdateRecord事件已经发生了,这是一个相当公平的赌注
由最近一次仍在等待中的对某个CDS上的ApplyUpdate的调用触发,因此如果
您在应用更新之前的事件中记下这一点,这可能会
告诉你你想知道的。我希望这对单级更新有效,但如果UpdateTree
在嵌套的CDS上运行,可能会更棘手
如果您的CDS都有单独的提供程序,但这些提供程序共享BeforeUpdateRecord事件,则可以使用以下代码为给定的提供程序标识CD:
function TCDSForm.FindCDSForProvider(DataSetProvider: TDataSetProvider):
TClientDataSet;
var
i : Integer;
begin
Result := Nil;
for i := 0 to ComponentCount - 1 do begin
if Components[i] is TClientDataSet then
if TClientDataSet(Components[i]).ProviderName = DataSetProvider.Name then begin
Result := TClientDataSet(Components[i]);
Exit;
end;
end;
end;
如果在重新更新数据记录之前跟踪调用您的datasetprovider 1b,您将
请参见,作为SourceDS参数传递的数据集是的Source
数据集
UpdateTree
,即AFAICS,dataset
属性所属的数据集
提供程序设置为。当然,这是而不是从中提取增量的CD
已经导出(在我的测试用例中,它实际上是一个TAdoQuery)
查看Provider.Pas中的源代码,我无法立即看到
找到增量源CD标识的方法。我认为这并不特别令人惊讶,因为提供者的操作是由CDS调用的,而不是由CDS调用的,提供者从CDS中需要的所有数据都是其增量
另一方面,BeforeUpdateRecord事件已经发生了,这是一个相当公平的赌注
由最近一次仍在等待中的对某个CDS上的ApplyUpdate的调用触发,因此如果
您在应用更新之前的事件中记下这一点,这可能会
告诉你你想知道的。我希望这对单级更新有效,但如果UpdateTree
在嵌套的CDS上运行,可能会更棘手
如果您的CDS都有单独的提供程序,但这些提供程序共享BeforeUpdateRecord事件,则可以使用以下代码为给定的提供程序标识CD:
function TCDSForm.FindCDSForProvider(DataSetProvider: TDataSetProvider):
TClientDataSet;
var
i : Integer;
begin
Result := Nil;
for i := 0 to ComponentCount - 1 do begin
if Components[i] is TClientDataSet then
if TClientDataSet(Components[i]).ProviderName = DataSetProvider.Name then begin
Result := TClientDataSet(Components[i]);
Exit;
end;
end;
end;
你似乎有点困惑<代码>源代码<