首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi:如何通过delta访问客户数据集

Delphi:如何通过delta访问客户数据集
EN

Stack Overflow用户
提问于 2016-08-08 00:45:38
回答 2查看 1.2K关注 0票数 1

在TDatasetProvider.OnBeforeUpdateRecord上,如何访问发送的DeltaDS参数的源或原始客户端数据集?

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

发布于 2016-08-08 07:51:07

我认为SourceDS是正在寻找的。

发件人参数标识应用更新的提供程序。 SourceDS参数是数据来源的数据集。如果没有源数据集,则此值为零(Delphi)或NULL (C++)。当事件发生时,源数据集可能不是活动的,因此在尝试访问其数据之前,请将其活动属性设置为true。 DeltaDS参数是一个客户端数据集,包含正在应用的所有更新。当前记录表示即将应用的更新。 UpdateKind参数指示此更新是修改现有记录(ukModify)、要插入的新记录(ukInsert)还是要删除的现有记录(ukDelete)。 应用参数控制事件处理程序退出后发生的情况。如果事件处理程序将“应用为真”设置为“真”,则提供程序将忽略更新:它既不尝试应用更新,也不记录指示未应用更新的错误。如果事件处理程序离开应用为false,则提供程序尝试在事件处理程序退出后应用更新。

例如:

代码语言:javascript
复制
procedure TdmLoanPayment.dpLoanPaymentBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind:  TUpdateKind;
var Applied: Boolean);
begin
  ShowMessage(TClientDataSet(SourceDS).Name); // get source name
  ...
end;

编辑

代码语言:javascript
复制
  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;
票数 0
EN

Stack Overflow用户

发布于 2016-08-08 13:25:40

如果通过对DataSetProvider1BeforeUpdateRecord的调用进行跟踪,您将看到作为SourceDS参数传递的数据集是UpdateTreeSource数据集,也就是说,AFAICS是提供程序的DataSet属性设置到的数据集。当然,这是,而不是--三角洲是从它派生出来的CDS (在我的测试用例中,它实际上是一个TAdoQuery)。

查看Provider.Pas中的源代码,我无法立即找到Delta源CDS的标识。我不认为这特别令人惊讶,因为提供者的操作是由CDS调用的,而不是反之亦然,而且提供者从CDS需要的所有数据都是它的Delta。

另一方面,可以肯定的是,BeforeUpdateRecord事件是由最近在某个CDS上调用ApplyUpdates而触发的,因此,如果您在他们的BeforeApplyUpdates事件中记录了这一点,这可能会告诉您您想知道什么。我希望这种方法适用于单一级别的更新,但如果UpdateTree在嵌套的CDS上运行,则可能会更棘手。

如果您的CDS都有单独的提供程序,但是提供程序共享一个BeforeUpdateRecord事件,则可以使用如下代码来标识给定提供程序的CDS:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38819905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档