在TDatasetProvider.OnBeforeUpdateRecord上,如何访问发送的DeltaDS参数的源或原始客户端数据集?
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派生一个组件并分配一个默认的OnBeforeUpdateRecord。
发布于 2016-08-08 07:51:07
我认为SourceDS是正在寻找的。
发件人参数标识应用更新的提供程序。 SourceDS参数是数据来源的数据集。如果没有源数据集,则此值为零(Delphi)或NULL (C++)。当事件发生时,源数据集可能不是活动的,因此在尝试访问其数据之前,请将其活动属性设置为true。 DeltaDS参数是一个客户端数据集,包含正在应用的所有更新。当前记录表示即将应用的更新。 UpdateKind参数指示此更新是修改现有记录(ukModify)、要插入的新记录(ukInsert)还是要删除的现有记录(ukDelete)。 应用参数控制事件处理程序退出后发生的情况。如果事件处理程序将“应用为真”设置为“真”,则提供程序将忽略更新:它既不尝试应用更新,也不记录指示未应用更新的错误。如果事件处理程序离开应用为false,则提供程序尝试在事件处理程序退出后应用更新。
例如:
procedure TdmLoanPayment.dpLoanPaymentBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
ShowMessage(TClientDataSet(SourceDS).Name); // get source name
...
end;编辑
或
procedure TdmLoanPayment.dpLoanPaymentBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
if SourceDS.Name = 'Name1'then
...do something ...
if SourceDS.Name = 'Name2'then
...do something ...
end;发布于 2016-08-08 13:25:40
如果通过对DataSetProvider1BeforeUpdateRecord的调用进行跟踪,您将看到作为SourceDS参数传递的数据集是UpdateTree的Source数据集,也就是说,AFAICS是提供程序的DataSet属性设置到的数据集。当然,这是,而不是--三角洲是从它派生出来的CDS (在我的测试用例中,它实际上是一个TAdoQuery)。
查看Provider.Pas中的源代码,我无法立即找到Delta源CDS的标识。我不认为这特别令人惊讶,因为提供者的操作是由CDS调用的,而不是反之亦然,而且提供者从CDS需要的所有数据都是它的Delta。
另一方面,可以肯定的是,BeforeUpdateRecord事件是由最近在某个CDS上调用ApplyUpdates而触发的,因此,如果您在他们的BeforeApplyUpdates事件中记录了这一点,这可能会告诉您您想知道什么。我希望这种方法适用于单一级别的更新,但如果UpdateTree在嵌套的CDS上运行,则可能会更棘手。
如果您的CDS都有单独的提供程序,但是提供程序共享一个BeforeUpdateRecord事件,则可以使用如下代码来标识给定提供程序的CDS:
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;https://stackoverflow.com/questions/38819905
复制相似问题