我有一个带有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上使用它。
答案 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;