关于多项条件查询的问题 |
答題得分者是:cashxin2002
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
如图所示
查询条件有好多条,我就在图上显示了三条,反正懂了三条如何做也就知道其它的了。
查询时有可能是按其中一个条件查询,也可能几个同时查询,供查询的数据在同一个数据表中(不是在几个数据表中同时取资料来查)
我的初步的设想是放一个query,用SQL语句来操作查询,用DBGRID来显示查询结果,不知道我的思路是否正确,如果正确的话代码如何写比较好,是不是如果有十个条件查询的话,要把所有的多选条件的可能都要想到写到代码里,那样的话有很多种条件组合方式,是不是就显得太复杂了?哪位前辈写个代码例子看看?谢谢!
------
我的编程起步于ktop,我将永远支持ktop |
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 您的思路是對的﹐比如說﹐在您的圖示中﹐按科室查詢對應的是ComboBox元件﹐按票据號查詢對應的是Edit元件﹐按時間段查詢的是DateTimePicker元件﹐範例如下﹕
begin ADOQuery1.Close; ADOQuery1.SQL.Clear; if CheckBox1.Checked then begin ADOQuery1.SQL.Add('Select * From 資料表 Where '); ADOQuery1.SQL.Add('科室='''+ComboBox1.Text+''''); end else if CheckBox2.Checked then begin ADOQuery1.SQL.Add('Select * From 資料表 Where '); ADOQuery1.SQL.Add('票据號 between :Number1 and :Number2'); ADOQuery1.Parameters.ParamByName('Number1').Value := StrToInt(Edit1.Text); ADOQuery1.Parameters.ParamByName('Number2').Value := StrToInt(Edit2.Text); end else if CheckBox3.Checked then begin ADOQuery1.SQL.Add('Select * From 資料表 Where '); ADOQuery1.SQL.Add('時間段 between :Time1 and :Time2'); ADOQuery1.Parameters.ParamByName('Time1').Value := DateTimePicker1.Time; ADOQuery1.Parameters.ParamByName('Time2').Value := DateTimePicker2.Time; end; ADOQuery1.Open; end;照以上的程式碼﹐在實做中﹐還需要加入一些判斷語法﹐如使用者輸入或選擇的地方不允許空白等等﹒ ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟 |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi nttr, 借花獻佛,將 cashxin2002 大大的程式碼調整一下
begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('Select * From 資料表 Where 1 = 1'); if CheckBox1.Checked then begin ADOQuery1.SQL.Add('and 科室=''' ComboBox1.Text ''''); end; if CheckBox2.Checked then begin ADOQuery1.SQL.Add('and 票据號 between :Number1 and :Number2'); ADOQuery1.Parameters.ParamByName('Number1').Value := StrToInt(Edit1.Text); ADOQuery1.Parameters.ParamByName('Number2').Value := StrToInt(Edit2.Text); end; if CheckBox3.Checked then begin ADOQuery1.SQL.Add('and 時間段 between :Time1 and :Time2'); ADOQuery1.Parameters.ParamByName('Time1').Value := DateTimePicker1.Time; ADOQuery1.Parameters.ParamByName('Time2').Value := DateTimePicker2.Time; end; ADOQuery1.Open; end;發表人 -
------
Fishman |
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 上篇回覆的範例中有些筆誤﹐是針對RadioButton元件﹐而不是CheckBox元件﹐因為在您的專案中是使用RadioButton元件﹐RadioButton元件的特性是同一Parent的RadioButton元件只能選擇一個(即單選作用)﹐所以就不存在复選的問題﹒
如果是使用CheckBox元件﹐或其它具備复選作用的元件﹐來完成您的要求的話﹐您可用參考Fishman前輩的方法﹒ =================================
有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗
================================
------
忻晟 |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
如果不限定user可以幾個條件複合查詢(就是user可以挑一個,二個或三個條件查詢),可以用以下做法:
var ss:TStringList; begin ss.Add('select * from TableName'); ss.Add(' where 1=1'); if CheckBox1.Check then ss.Add(' and 科室 = ''' ComboBox1.Text ''''); if CheckBox2.Check then ss.Add(' and 票据號 between ' Edit1.Text ' and ' Edit2.Text); //如果你的票据號是char/varchar,就要加"'"符號,比照科室模式 //餘此類推,最後ss.Text即為SQL指令.如果是用TClientdataSet,就可以直接把SQL指令直接給DataSet, //如果用TQuery之類的,其SQL指令本來即可TStrings,可以直接取代ss end; |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
var ss:TStringList; begin ss.Add('select * from TableName'); ss.Add(' where 應收金額<>0'); //<--應收金額不為0的記錄 if CheckBox1.Check then ss.Add(' and 科室 = ''' ComboBox1.Text ''''); if CheckBox2.Check then ss.Add(' and 票据號 between ' Edit1.Text ' and ' Edit2.Text); //如果你的票据號是char/varchar,就要加"'"符號,比照科室模式 //餘此類推,最後ss.Text即為SQL指令.如果是用TClientdataSet,就可以直接把SQL指令直接給DataSet, //如果用TQuery之類的,其SQL指令本來即可TStrings,可以直接取代ss end; |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select * From 資料表 Where 1 = 1');
ADOQuery1.SQL. Add(' where 應收金額<>0');
if .......then .......
是不是这样?
如果点查询时一个没选怎么提示法?
是不是要写if not checkbox1.checked or checkbox2............,是不是要一个一个checkbox都要写,有没有简单的一句就能说明所有的checkbox没选中就怎么提示的?
------
我的编程起步于ktop,我将永远支持ktop |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
仍有两个问题1.
ADOQuery1.SQL. Add(' where 應收金額<>0');
ADOQuery1.SQL.Add('Select * From 資料表 Where 1 = 1');
这两个条件如何结合起来用?
2.if CheckBox7.Checked then
begin
ADOQuery1.SQL.Add('and 票据號 between :Number1 and :Number2');
ADOQuery1.Parameters.ParamByName('Number1').Value := StrToInt(Edit5.Text);
ADOQuery1.Parameters.ParamByName('Number2').Value := StrToInt(Edit6.Text);
end;
if CheckBox8.Checked then
begin
ADOQuery1.SQL.Add('and 收费日期 between :Time1 and :Time2');
ADOQuery1.Parameters.ParamByName('Time1').Value := DateTimePicker1.time;
ADOQuery1.Parameters.ParamByName('Time2').Value := DateTimePicker2.time;
end;
所有查询条件都好正常单选或复选运行了,上面两个有问题,票据号上填好后提示“至少一个参数没有被指定值”收费日期查询时提示标准表达式中数据类型不匹配。我其实查询的是日期,我注意了一下都是短日期格式,我把最后的参数改成了.date也不行
------
我的编程起步于ktop,我将永远支持ktop |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
其中的一个票据号的问题解决了,是由于在拷贝过程中的繁简写没转过来。一个日期问题改成这样了if CheckBox8.Checked then
begin
ADOQuery1.SQL.Add('and 收费日期 between :Date1 and :Date2');
ADOQuery1.Parameters.ParamByName('Date1').Value := DateTimePicker1.Datetime;
ADOQuery1.Parameters.ParamByName('Date2').Value := DateTimePicker2.Datetime;
end;
好正常运行了,不过好象查询的还有一些问题,DGGRID中假如是30号到30号的,当天的记录好象就不出来,要29号到30号的,收费时间也错的,本来数据库中是7:11,到了DBGRID中显示为99-12-30 7:11:12,变多了(收费日期是对的)
另外就是如何在查询条件前先把应收金额为0的记录去掉
ADOQuery1.SQL. Add(' where 應收金額<>0');
ADOQuery1.SQL.Add('Select * From 資料表 Where 1 = 1');
if .....then....
这样的代码不好运行。
------
我的编程起步于ktop,我将永远支持ktop |
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 時間欄位的顯示問題﹐請見如下連接﹕
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=72127 如果在先決條件中﹐就把[應收金額]<>0的條件寫在最初處就可以了﹕
begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('Select * From 資料表 Where 應收金額<>0'); if CheckBox1.Checked then begin ADOQuery1.SQL.Add(' and 科室='''+ComboBox1.Text+''''); end; if CheckBox2.Checked then begin ADOQuery1.SQL.Add(' and 票据號 between :Number1 and :Number2'); ADOQuery1.Parameters.ParamByName('Number1').Value := StrToInt(Edit1.Text); ADOQuery1.Parameters.ParamByName('Number2').Value := StrToInt(Edit2.Text); end; if CheckBox3.Checked then begin ADOQuery1.SQL.Add(' and 時間段 between :Time1 and :Time2'); ADOQuery1.Parameters.ParamByName('Time1').Value := DateTimePicker1.Time; ADOQuery1.Parameters.ParamByName('Time2').Value := DateTimePicker2.Time; end; ADOQuery1.Open; end;================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |