全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1677
推到 Plurk!
推到 Facebook!

請問 Filter 出現 EOleException,不能用 NOT IN 嗎?

尚未結案
jimmygump
一般會員


發表:8
回覆:12
積分:4
註冊:2003-09-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-18 16:49:02 IP:61.71.xxx.xxx 未訂閱
EOleException: 引數中可能發生類型錯誤、超過可接受的定義範圍、或與其他引數發生衝突    Delphi 7.0 + d7_ent_upd1_1 + Access 2000 mdb    程式:
with adoqrySelect do
begin
  Filtered := False;
  // GetSelectedList 取得 ClientDataSet 中已新增進去的記錄主鍵值
  Filter := 'ID NOT IN '+GetSelectedList;
  Filtered := True;
  ....
end;
請問,Filter 如果是類似 'ID NOT IN (8, 17,35, 99)' 這樣不行嗎? 這語法在 Query 或直接在 Access 中並不會有錯,唯有 Filter 時才出錯。 查了很多人也遇到相同的錯誤訊息,到底 Filter 有沒有什麼語法限制?和 SQL 的 WHERE 不完全相容嗎?我目前還查不到 Filter 語法限制的相關資訊說...如果都要改寫成 WHERE 加上
 ' AND ID NOT IN'+GetSelectedList;
的方式,那麼都得再做 adoqrySelect.ReQuery....那就和 Close, Open 一樣....蠻傷的
------
Jimmy Gump
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-18 17:07:28 IP:219.80.xxx.xxx 未訂閱
你好:
  filter 並不能使用太複雜的條件.下面節錄自 ADO Version 2.6 的 Help
<> >, <=, >=, <>, =, >    < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
        
jimmygump
一般會員


發表:8
回覆:12
積分:4
註冊:2003-09-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-19 00:22:37 IP:61.71.xxx.xxx 未訂閱
唉...如果是這樣,那最壞打算,就是 merge 那一道 WHERE 條件,免不了要重新 Query 了。 討論一下這樣的設計風格好了...故事是這樣的... 這是為了設計一個 master-detail 的 detail 輔助輸入公用畫面,不同於一般帶回一筆的輔助選取,這次的需求是提供一次帶回多筆的功能。 所以那個畫面的需求為: 1. 第一階段 .接受呼叫者的 SQL,然後用 ADOQuery1,顯示在一個 DBGrid1。 .提供各顯示欄位的 incremental serach,直接移動 DBGrid1 到該筆。 (一個選擇欄位的 ComboBox1,一個輸入查詢值的 Edit1,OnChange 做 ADOQuery1.Locate) .DBGrid1 可以 MultiSelect 2. 第二階段 .本來是 MultiSelect 之後,按個確定鈕就帶回了。但因為候選的記錄可能很多,用 ctrl click 之後的 MultiSelect 反白可能很分散,最後使用者可能搞不清楚選了哪些記錄。所以再提供一個 "已選取" 的機制,比較能讓已選取的記錄集中顯示。 .以 ClientDataSet1 複製一個和 ADOQuery1 相同欄位定義的記憶體 dataset,供另一個 DBGrid2 顯示。 .同時複製 DBGrid1 的 Columns 定義到 DBGrid2,讓兩個 DBGrid 看起來欄位都相同。 .在 DBGrid1 和 DBGrid2 之間,提供三個按鈕: .Select:將 DBGrid1 的 MultiSelect Rows 新增到 ClientDataSet,並從 DBGrid1 中消失。 .UnSelect:將 DBGrid2 的 MultiSelect Rows 自 ClientDataSet 刪除,並在 DBGrid 中重新顯示。 .ClearAll:將 ClientDataSet 的記錄全部刪除,DBGrid1 中回復到剛呼叫時的狀態。 .按任何一個按鈕,都必須在兩個 DBGrid 之間反應出記錄的移動。這也就是為什麼想要在 DBGrid1 的 ADOQuery 做 Filter 的原始想法!因為無法預期使用者按這三個按鈕的頻率,如果ADOQuery 都實際去 ReQuery 的話,後果不知如何。 .最後當按下確定鈕,則由呼叫者自行依 ClientDataSet 最終結果做 detail 的整批新增。 目前我手頭上沒有測試資料,據使用者估計,經過 detail 的 OnEditButtonClick 呼叫此畫面,傳入 SQL 已有部份 WHERE 條件,初估平均 DBGrid1 會顯示 5000~7000 筆。每張 master-detail 的 detail 筆數不管帶回幾次,總數不會超過 120 筆。(i.e. 幾萬筆中 query 出 5000 筆,然後總共選出 120 筆) 希望這樣的操作不會因為 ReQuery 而使 user 覺得太慢。 這樣的畫面應該很常見,同樣這樣的功能,不知道大家怎麼實作的? Jimmy Gump
------
Jimmy Gump
系統時間:2024-06-02 18:10:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!