線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1887
推到 Plurk!
推到 Facebook!

請問ClientDataSet中的Internalcalc欄位儲存的問題

尚未結案
Chengyan
一般會員


發表:5
回覆:8
積分:2
註冊:2007-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-08 18:12:33 IP:59.124.xxx.xxx 訂閱
請問一下各位先進

小弟使用ClientDataSet,DataSetProvider,dxdbgrid,dataSource,ADOQuery 這幾個元件作了一個供輸入的表格

我先將 DataSetProvider 的 DataSet 屬性指向 ADOQuery。

再將ClientDataSet 的 ProviderName 屬性指向 DataSetProvider。

接下來把dataSource 的 DataSet 屬性 ClientDataSet 。

最後我把設定好的 dataSource 放到 dxdbgrid 的 dataSource 屬性中。

接下來我依照我所需要的欄位類型,在ClientDataSet的Fields editor 中使用 New Fields 加上我所要的欄位

其中我有設定一個欄位類型為
Internalcalc (這個欄位為資料庫沒有的,我額外添加的虛擬欄位),型態是Smallint

然後我在 dxDBGrid 的欄位設定上設定這個欄位為TdxDBGridcheckcolumn的類型

而它的valuechecked = 1 valueunchecked = 0

接下來是我的問題(很抱歉上面打太長了,不過我想環境描述清楚點比較好@.@)

這樣做的話虛擬欄位可以打勾,而且顯示也不會有問題。

但是當我執行以下的程式的時候,我發現他選擇出來的數據不是我所想要的,而且他有時候會出現有時候不會

不過有時候卻是正確的(點個欄位跟戳戳樂一樣= =),似乎值是無法儲存進去的關係。

[code delphi]
while not cds1.Eof DO //cds1為 ClientDataSet
begin
if cds1.FieldByName('Checked').AsInteger = 1 then //Checked是新增的虛擬欄位
begin
Listbox1.Items.Add(cds1.FieldByName('ID').Asstring); //測試顯示的選擇是否正確
end;
cds1.Next;
end;
[/code]

我有看過站內文章,許多前輩建議是在oncalcfield中做處理,不過大多是用DBGrid

,我想套進去DXDBGrid卻不知道該如何著手。

或是我該在哪個地方做虛擬欄位的儲存動作(當然,這欄位數值是不需要回寫回資料庫的)。

可以的話能給我一個範例讓我能夠更加明白我的錯誤在那兒。 感謝!
Chengyan
一般會員


發表:5
回覆:8
積分:2
註冊:2007-03-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-09 10:55:05 IP:59.124.xxx.xxx 訂閱
這個問題我有找出方式解決嚕,以下是我的解決方法。

可能是我太執著於"儲存"了,所以一開始都在找這個欄位值可能儲存的地點。

後來找了站內文章看了看之後,發現大部分的前輩都將值儲存於另外一個TStringList中,然後在作額外的分析

這讓我想到另外一個方式來作,所以我先生成一個 TStringList 叫做 Savestr 來做儲存的容器

然後在這個ClientDataSet的OnAfterPost中,輸入以下的程式碼


[code delphi]
if dxDBGrid.FocusedColumn = 0 then
begin
if savestr.IndexOf(cds1.FieldByName('ID').Asstring) = -1 then
begin
if dxDBGrid.FocusedNode.Strings[dxDBGrid.FocusedColumn] = '1' then
savestr.Add(cds1.FieldByName('ID').Asstring);
end
else
begin
if dxDBGrid.FocusedNode.Strings[dxDBGrid.FocusedColumn] = '0' then
savestr.Delete(savestr.IndexOf(cds1.FieldByName('ID').Asstring));
end;
end;

[/code]

然後我將這個StringList的結果放置到Memo中

[code delphi]
cds1.Edit;
cds1.Post;
memo1.Text :=savestr.Text ;
[/code]

這樣Memo的Lines就是我所想要的數據了。

PS:在程式碼中的...好像是沒有辦法消除說,我試了幾次都失敗 =.=

編輯記錄
Chengyan 重新編輯於 2008-12-09 10:58:39, 註解 無‧
Chengyan 重新編輯於 2008-12-09 11:01:31, 註解 無‧
系統時間:2024-05-15 22:48:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!