adoquery的多重查詢問題? |
尚未結案
|
hungling10
一般會員 ![]() ![]() 發表:2 回覆:4 積分:1 註冊:2002-12-18 發送簡訊給我 |
我想做多重查詢,故需要去考慮多層面的問題。
如:批號:___至____
料號:___至____ 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 發送簡訊給我 |
|
hungling10
一般會員 ![]() ![]() 發表:2 回覆:4 積分:1 註冊:2002-12-18 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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; //例查詢劃面為 批號:edit1 至 edit2 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 發送簡訊給我 |
看了你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 發送簡訊給我 |
我試了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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
我就是不知道該如何去表示前端的值(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 發送簡訊給我 |
會出現 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 發送簡訊給我 |
依你的需求或許可考慮由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走一遭 ========================= |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |