2011-01-24 17 views
1

我使用C++ Builder的6.0試圖修改只讀數據集字段

我用TADODataSet執行下面的SQL語句:

SELECT Id, SUM(Saldo) AS Saldo 
FROM Table 
GROUP BY Id 

我用這個數據集只用於報告。不需要更新數據庫。 當我嘗試修改現場「Saldo」

adospCard->Edit(); 
adospCard->FieldByName("Saldo")->AsFloat=0.0; 
adospCard->Post(); 

我得到錯誤: 場「Saldo」不能修改。 我加入這一行

adospCard->FieldByName("Saldo")->ReadOnly=false; 

和錯誤沒有更多的發生,但場「Saldo」並沒有改變。

adospCard->Edit(); 
//adospCard->FieldByName("Saldo")->AsFloat=1536.5 
adospCard->FieldByName("Saldo")->AsFloat=0.0; 
//adospCard->FieldByName("Saldo")->AsFloat=0 
adospCard->Post(); 
//adospCard->FieldByName("Saldo")->AsFloat=1536.5 

Howe要改變'Saldo'字段值嗎?

+0

你爲什麼要改變它?它實際上只是一個由db計算出的值,而不是「真正的」字段。 – 2011-01-24 12:15:09

+0

我知道'saldo'不是真正的字段,但是當Id爲...時,客戶端需要在某些報告中更改此值。 – SelvirK 2011-01-24 12:26:25

回答

2
  1. 計算字段添加到您的數據集。
  2. 計算Saldo 正確的價值在這個計算字段(您可以使用 作爲Saldo來源,如果你 想)
  3. 顯示此計算字段在報告中 取而代之的Saldo領域。

編輯: 有關如何添加計算字段,例如見hereherehere例子。

- jeroen

1

正如ldsandon所說,你不能修改它計算的「Saldo」字段。 如果您需要在Id爲「某些」時將該值設置爲零,則最好在查詢中完成該操作。最佳方法取決於將值設置爲零的標準。

或者,將原始查詢的結果保存在臨時表中,然後在將結果返回給報表之前進行修改。

最後,您使用的是哪種報告工具?渲染報告時可以改變「Saldo = 0」嗎?

+0

查詢結果(報告)以網格顯示。 Saldo = 0就是一個簡單的例子。真實報告非常複雜,有15-20個計算字段,而且非常複雜的邏輯計算字段將會改變,並且此邏輯取決於用戶輸入... 對渲染報告或SQL語句不可能做到這一點。 – SelvirK 2011-01-24 14:17:13

1

考慮將結果存儲在ClientDataset中 - 如果您可以放心,結果不會太大。

我不使用「TADODataSet」所以下面可能不適用:)...

當我用我的選擇DB相同(或類似)(即利用數據庫服務器),我會用INTO子句儘管有TSQLQuery組件(啓用了RequestLive屬性)。例如:

選擇ID,SUM(Saldo)AS Saldo INTO #TempTable從表GROUP BY標識