2014-09-05 38 views
0

我有一個包含3個clientdataset的數據模塊,所有數據模塊都通過datasetproviders耦合到一個adoquery。每個客戶端數據集上的PacketRecords設置爲-1。 CDS2與CDS1 CDS3一個masterdetail與CDS2當調用disablecontrols時,Delphi clientdataset無法導航

所以我的窗體上的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; 

但offcourse我不想dbgrids每次調用第一個和下後移動,所以我呼籲CDS2和CDS3 disablecontrols

的問題是,不僅dbgrid停止移動,而且clientdatasets不再移動!在我刪除禁用控件之前,先調用cds2或cds3絕對不會有任何東西。

在masterdetail關係中使用clientdatasets時,這是正常行爲嗎? 如果是這樣,是否有繞過此「功能」的解決方法?

我使用disablecontrols所有的時間,從來沒有問題,但這是我第一次使用它的3個clientdatasets有masterdetails設置。

+3

新聞F1在DisableControls上:*「如果數據集是主/關係關係的主數據庫,調用DisableControls也會禁用主/關係關係。設置BlockReadSize而不是調用DisableControls會在您滾動數據集時更新詳細數據集,但不會更新數據感知控件。*「 – 2014-09-05 19:34:42

+0

是的,這是有效的。非常感謝你。猜猜這是RTFM的另一種情況... – GuidoG 2014-09-05 19:39:53

+0

不客氣。如果你確定它能夠按照你的想法工作,請考慮發佈一個答案。 – 2014-09-05 19:43:43

回答

2

Sertac Akyuz給了我一個解決方案。

似乎在客戶端數據集上調用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;