Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:如何通过delta访问clientdataset_Delphi_Tclientdataset - Fatal编程技术网

Delphi:如何通过delta访问clientdataset

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

在TDatasetProvider.OnBeforeUpdateRecord上,如何 访问的源或源clientdataset 发送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派生一个组件,并在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;

你似乎有点困惑<代码>源代码<