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

adoquery的多重查詢問題?

尚未結案
hungling10
一般會員


發表:2
回覆:4
積分:1
註冊:2002-12-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-22 16:32:49 IP:210.200.xxx.xxx 未訂閱
我想做多重查詢,故需要去考慮多層面的問題。 如:批號:___至____ 料號:___至____ 1、如果填了(批號1和批號2) OR 填了(料號1和料號2),則我於CLIENT做以下程式碼的判斷 procedure TMT1Form.Button3Click(Sender: TObject); begin with ClientDataSet1 do begin Close; if (el_prno1.Text > el_prno2.Text) and (el_prno2.Text <> '') then begin Params.ParamByName('el_prno1').AsString := el_prno2.Text; Params.ParamByName('el_prno2').AsString := el_prno1.Text; end else Params.ParamByName('el_prno1').AsString := el_prno1.Text; Params.ParamByName('el_prno2').AsString := el_prno2.Text; Open; end; end; 這是可以RUN的,但是後來在(批號1和批號2) OR (料號1和料號2)填了值後,就出現以下的錯誤訊息:Multiple-step OLE DB operation generated errors.Check each OLE DB status value,if available,No work was done. 煩請知道的人,解答一下,謝謝!
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-22 18:28:55 IP:218.163.xxx.xxx 未訂閱
您可不可以將ADOQuery中的SQL語法,Post上來?
------
~小弟淺見,參考看看~
hungling10
一般會員


發表:2
回覆:4
積分:1
註冊:2002-12-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-02-25 14:46:01 IP:210.200.xxx.xxx 未訂閱
ADOQuery中的SQL語法 procedure TSerdep.RemoteDataModuleCreate(Sender: TObject); begin with OS1Query do begin Close; SQL.Clear; SQL.Add('select a.od_serno,b.od_no from ieod01h a left join ieod01d1 b on a.od_serno=b.od_serno'); SQL.Add(' where 1=1'); if Parameters.ParamByName('od_serno1').Value <> '' then SQL.Add(' and a.od_serno >= :od_serno1'); else Parameters.ParamByName('od_serno2').Value <> '' SQL.Add(' and a.od_serno <= :od_serno2'); SQL.Add(' order by b.od_no'); Open; end; nd;
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-02-25 17:00:08 IP:211.21.xxx.xxx 未訂閱
引言: with OS1Query do begin Close; SQL.Clear; SQL.Add('select a.od_serno,b.od_no from ieod01h a left join ieod01d1 b on a.od_serno=b.od_serno'); SQL.Add(' where 1=1'); if Parameters.ParamByName('od_serno1').Value <> '' then SQL.Add(' and a.od_serno >= :od_serno1'); else Parameters.ParamByName('od_serno2').Value <> '' SQL.Add(' and a.od_serno <= :od_serno2'); SQL.Add(' order by b.od_no'); Open; end;
基本上在紅色部份,跟本不會觸發,因為此時的Parameters.ParamByName('od_serno1').Value及Parameters.ParamByName('od_serno2').Value <> ''一定是為空。 我建議您可以將語法改為
with OS1Query do
begin
  Close;
  SQL.Clear;
  SQL.Add('select a.od_serno,b.od_no from ieod01h a left join ieod01d1 b on a.od_serno=b.od_serno');
  SQL.Add(' (a.od_serno >= :od_serno1) or (0 = :switch1)');
  SQL.Add(' and a.od_serno <= :od_serno2' or (0 = :switch2));
  SQL.Add(' order by b.od_no');
  //當switch1、switch2=0時,表條件不成立
  Params.ParamByName('switch1').AsInteger := 0;
  Params.ParamByName('switch2').AsInteger := 0;
  //例查詢劃面為 批號:edit1edit2
  if edit1.Text <> '' then//表條件成立
  begin
    Params.ParamByName('switch1').AsInteger := 1;
    Params.ParamByName('od_serno1').AsString := edit1.Text;
  end;
  if edit2.Text <> '' then//表條件成立
  begin
    Params.ParamByName('switch2').AsInteger := 1;
    Params.ParamByName('od_serno2').AsString := edit2.Text;
  end;
  Open;
end;
如此應該就可以了。 ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-02-25 17:19:39 IP:211.74.xxx.xxx 未訂閱
看了你post的 if Parameters.ParamByName('od_serno1').Value <> '' then SQL.Add(' and a.od_serno >= :od_serno1'); else Parameters.ParamByName('od_serno2').Value <> '' SQL.Add(' and a.od_serno <= :od_serno2'); 我想請問一下你的 od_serno1的值由el_prno1.Text來取得 od_serno2的值由el_prno2.Text來取得 RIGHT???
引言: ADOQuery中的SQL語法 . . .
hungling10
一般會員


發表:2
回覆:4
積分:1
註冊:2002-12-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-02-26 15:16:32 IP:210.200.xxx.xxx 未訂閱
我試了channel的方法,但仍是不行。 還有od_serno1的值是否由el_prno1.Text來取得、od_serno2的值是否由el_prno2.Text來取得,應該算是吧! 我是用三層式架構寫的,在前端放了clientdataset,然後用clientdataset的屬性params來接收edit的值,故如此寫    procedure TMT1Form.Button3Click(Sender: TObject); begin    with ClientDataSet1 do begin Close; if (od_serno1.Text > od_serno2.Text) and (od_serno2.Text <> '') then begin Params.ParamByName('od_serno1').AsString := edit2.Text; Params.ParamByName('od_serno2').AsString := edit1.Text; end else Params.ParamByName('od_serno1').AsString := edit1.Text; Params.ParamByName('od_serno2').AsString := edit2.Text; Open; end;    end;    然後在應用程式伺服器端 再用adoquery的屬性parameters設定兩個接收的參數(因為試過如果沒有設這兩個參數伺服器端就沒有辦法run),並下sql語法     with OS1Query do   begin   Close;   SQL.Clear;   SQL.Add('select a.od_serno,b.od_no from ieod01h a left join ieod01d1 b on a.od_serno=b.od_serno');   SQL.Add(' where 1=1');    if Parameters.ParamByName('od_serno1').Value <> '' then   ==>這裡是想判斷如果有接受到來自前端的值(od_serno1)才做查詢,但不知道該如此去抓出這個值,不知這樣下對不對,且也不能run      SQL.Add(' and a.od_serno >= :od_serno1')    else Parameters.ParamByName('od_serno2').Value <> ''   ==>這裡是想判斷如果有接受到來自前端的值(od_serno2)才做查詢       SQL.Add(' and a.od_serno <= :od_serno2');   SQL.Add(' order by b.od_no');   Open;   end;
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-02-26 15:28:31 IP:211.21.xxx.xxx 未訂閱
引言: with OS1Query do begin Close; SQL.Clear; SQL.Add('select a.od_serno,b.od_no from ieod01h a left join ieod01d1 b on a.od_serno=b.od_serno'); SQL.Add(' where 1=1'); if Parameters.ParamByName('od_serno1').Value <> '' then ==>這裡是想判斷如果有接受到來自前端的值(od_serno1)才做查詢,但不知道該如此去抓出這個值,不知這樣下對不對,且也不能run 您何不用變數去接受到來自前端的值(od_serno1) SQL.Add(' and a.od_serno >= :od_serno1') else Parameters.ParamByName('od_serno2').Value <> '' ==>這裡是想判斷如果有接受到來自前端的值(od_serno2)才做查詢 SQL.Add(' and a.od_serno <= :od_serno2'); SQL.Add(' order by b.od_no'); Open; end;
建議您用變數去接接受到來自前端的值,試試看吧… ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
hungling10
一般會員


發表:2
回覆:4
積分:1
註冊:2002-12-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-02-26 19:07:18 IP:210.200.xxx.xxx 未訂閱
我就是不知道該如何去表示前端的值(od_serno1)呀?可以舉例說明嗎?還有呀,我在伺服器端下宣告,不能compiler,可以告訴我原因嗎?以下這樣做可以嗎? var s1,s2 :string; s1=:od_serno1; s2=:od_serno2; if s1<>'' then SQL.Add('a.od_serno >= :od_serno1') else if s2<>'' then SQL.Add(' and a.od_serno <= :od_serno2');
soonly
一般會員


發表:19
回覆:15
積分:6
註冊:2002-12-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-02 10:32:53 IP:203.73.xxx.xxx 未訂閱
會出現 Multiple-step operation generated errors. Check each status value error 這種問題.多半是填入資料庫的資料型態與定義型態不符,請大大仔細檢查. 1. A string value is being inserted into a numeric field. 2. An invalid date expression is being inserted into a date field. 3. A string value being inserted is longer than the size of the string field. 4. A null value is being inserted into a field that does not allow nulls.
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-02 11:16:10 IP:220.134.xxx.xxx 未訂閱
依你的需求或許可考慮由CLIENT直接下SQL語法,如
procedure TMT1Form.Button3Click(Sender: TObject);
Var
 s1, s2 : String;
begin
 If Trim(el_prno1.Text) <> '' Then s1 :=el_prno1.Text;
 If Trim(el_prno1.Text) <> '' Then s2 :=el_prno2.Text;
 with ClientDataSet1 do
  begin
    Close;
    CommandText:='select a.od_serno,b.od_no from ieod01h a left join ieod01d1 b on a.od_serno=b.od_serno where 1=1 ';
    if s1 > s2 then
    begin
      CommandText := CommandText  ' and a.od_serno >= ''' s1''' And a.od_serno <= ''' s2''' ';
    else
      CommandText := CommandText  ' and a.od_serno >= ''' s2''' and a.od_serno <= ''' s1''' ';
    End;
    CommandText := CommandText   ' order by b.od_no' ;
    Open;
  end;
end;
有錯請指正 ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
系統時間:2024-05-19 6:25:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!