调用disablecontrols时,Delphi clientdataset不会导航

时间:2014-09-05 19:25:02

标签: delphi tclientdataset

我有一个带有3个clientdatasets的数据模块,它们都通过数据集提供程序耦合到一个adoquery。 PacketRecords在每个clientdataset上设置为-1。 cds2有一个带有cds1的masterdetail cds3有一个带有cds2

的masterdetail

所以在我的表格中,当我移动到cds1中的另一条记录而不是cds2和cds3时,按照预期进行。

现在我需要循环遍历cds3的所有记录以构建一些字段的总和。 使用下面的代码没问题,就像魅力一样。 (任何时候最多5条记录)

cds2.First;
while not cds2.Eof do
begin
  cds3.First;
  while not cds3.Eof do
  begin
    TotalExcl := TotalExcl + cds3TotalExcl.AsCurrency;
    TotalIncl := TotalIncl + cds3TotalIncl.AsCurrency;

    cds3.Next;
  end;

  cds2.Next;
end;

但是当然我不想让dbgrids在每次调用first和next之后移动,所以我在cds2和cds3上调用了disablecontrols

问题是不仅dbgrids停止了移动,而且clientdatasets也不再移动了!在我删除禁用控件之前,在cds2或cds3上先调用第一个和下一个就绝对没有任何意义。

在masterdetail关系中使用clientdatasets时这是正常的行为吗? 如果是这样,是否有解决方法绕过这个“功能”?

我一直使用disablecontrols,从来没有遇到过问题,但这是我第一次在3个设置了masterdetails的clientdatase上使用它。

1 个答案:

答案 0 :(得分:2)

Sertac Akyuz已经给了我一个解决方案。

似乎在clientdataset上调用DisableControls也会禁用主/详细信息关系。

因此,如果要循环遍历主/明细关系中的clientdataset的所有记录,则不能调用DisableControls。 您可以将属性BlockReadSize设置为正值,该值与disablecontrols具有相同的效果,但不会禁用主/详细信息关系

我现在的工作代码是:

cds2.BlockReadSize := 10;
cds3.BlockReadSize := 10;

try
  cds2.First;
  while not cds2.Eof do
  begin
    cds3.First;
    while not cds3.Eof do
    begin
      TotalExcl := TotalExcl + cds3TotalExcl.AsCurrency;
      TotalIncl := TotalIncl + cds3TotalIncl.AsCurrency;

      cds3.Next;
    end;

    cds2.Next;
  end;
finally
  cds2.BlockReadSize := 0;
  cds3.BlockReadSize := 0;
end;