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

如何取消 ClientDataSet 的 Required 檢查

答題得分者是:Mickey
VICSYS
初階會員


發表:21
回覆:64
積分:32
註冊:2002-10-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-03 01:37:00 IP:219.68.xxx.xxx 訂閱
連接方式
ClientDataSet -> DataSetProvider -> TSQLQuery

假設資料表上有欄位 NO/ DATA , DATA 在 Table 為 Not Null.

如果我在 TSQLQuery 上設定欄位 DATAField Required 為 False
那麼 ClientDataSet 的 DATAField Required 會為 False, 這時 DATAField 為空時, 可以 POST

但是我想寫一個共用的無狀態元件, 是由 ClientDataSet 的 CommandText 傳出,
所以 TSQLQuery 不能產生欄位設定值!

請問如何設定, 才能讓 ClientDataSet 內的 cdsDATAField 不去檢查 Required!

當 TSQLQuery 不產生欄位時, TSQLQuery 會自動以 DataBase 的設定為準,
所以 TSQLQuery 在執行週期, DATAField Required 為 True

在CleintDataSet 直接設定 cdsDataField Required 為False, 也在 FieldDef 設為 False
POST 時出現 EDBClient Exception 訊息 Field value required.
註:SQLQuery 的 GetMetaData, DataSetProvider Contraints, DisableControls 跟這種情況應該無關, 也試過了一樣出錯.

出錯的地方都在這段程式碼
procedure TCustomClientDataSet.InternalPost;
begin
inherited;
if State = dsEdit then
Check(FDSCursor.ModifyRecord(ActiveBuffer)) else
Check(FDSCursor.InsertRecord(ActiveBuffer));
if AggregatesActive then
DoAggUpdates(State = dsEdit);
end;

似乎 Midas.dll 把這個機制給限制住了?

如果把 CommandText 加工, 這時不會去檢查 Required! 可以 POST, 但這必須去修改 Query!
SELECT NO||'' NO, DATA||'' DATA FROM TABLE

可以用 DSBase.SetProp 來解決嗎? 那裡有 DSBase 的參考資料?

謝謝!
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-20 14:29:17 IP:218.163.xxx.xxx 訂閱
你好:

我沒有試過...

不知可否從 TDataSetProvider.OnGetDataSetProperties Event...Run Time 改掉 DataSet.Field.Required ....給它 "騙"過去
VICSYS
初階會員


發表:21
回覆:64
積分:32
註冊:2002-10-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-20 17:46:22 IP:219.68.xxx.xxx 訂閱
OnGetDataSetProperties 用 Google 找出的資料大多是增加 TableName!
這個事件, 應該是增加額外的資訊! Delphi 7 Help 的說明是 取得 Appserver 的時間!

好像不能去改變 Field 的 Required!
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-21 09:07:55 IP:218.163.xxx.xxx 訂閱
你好:

為了違反 DB Not Null Field 的限制, 而去改底層的東西, 個人不是很認同.

剛剛試了一下, 在 AfterOpen 改掉 Required Property, 參考看看.

procedure TForm1.SQLQuery1AfterOpen(DataSet: TDataSet);
var I: integer;
begin
for I := 0 to DataSet.FieldCount - 1 do
if DataSet.Fields[I].Required then
DataSet.Fields[I].Required := False;
end;
Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-21 12:53:05 IP:60.248.xxx.xxx 未訂閱
個人的作法是...    <textarea class="delphi" rows="10" cols="60" name="code"> procedure TForm1.Button3Click(Sender: TObject); var S: String; begin S:= ClientDataSet1.XMLData; StringReplace(S,'Required="True"','',[rfReplaceAll]); ClientDataSet1.XMLData:= S; end; </textarea>
如此便可以將 Required 設為 False
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
VICSYS
初階會員


發表:21
回覆:64
積分:32
註冊:2002-10-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-21 15:02:06 IP:219.68.xxx.xxx 訂閱
感謝各位版主的幫忙, Mickey 版大的方式最合乎我的需求!
Midas.dll 在 client 寫死了! 那麼去改 DSP 之前的 Dataset ...
真是太厲害了.


===================引 用 Mickey 文 章===================
你好:

為了違反 DB Not Null Field 的限制, 而去改底層的東西, 個人不是很認同.

剛剛試了一下, 在 AfterOpen 改掉 Required Property, 參考看看.

略 ...
系統時間:2024-05-02 5:55:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!