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

关于多项条件查询的问题

答題得分者是:cashxin2002
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-27 18:48:16 IP:222.184.xxx.xxx 未訂閱
如图所示 查询条件有好多条,我就在图上显示了三条,反正懂了三条如何做也就知道其它的了。 查询时有可能是按其中一个条件查询,也可能几个同时查询,供查询的数据在同一个数据表中(不是在几个数据表中同时取资料来查) 我的初步的设想是放一个query,用SQL语句来操作查询,用DBGRID来显示查询结果,不知道我的思路是否正确,如果正确的话代码如何写比较好,是不是如果有十个条件查询的话,要把所有的多选条件的可能都要想到写到代码里,那样的话有很多种条件组合方式,是不是就显得太复杂了?哪位前辈写个代码例子看看?谢谢!
------
我的编程起步于ktop,我将永远支持ktop
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-27 19:02:32 IP:202.62.xxx.xxx 未訂閱
您好﹗    您的思路是對的﹐比如說﹐在您的圖示中﹐按科室查詢對應的是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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-27 21:13:21 IP:222.184.xxx.xxx 未訂閱
我想再问一下前辈,如果三个条件同时选中的话,代码还是这么写就行吗?还是要再写一个IF?如果要写的话是否在IF中加几个AND就行了?能否取一个例?谢谢!
------
我的编程起步于ktop,我将永远支持ktop
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-28 08:37:53 IP:210.65.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-28 08:57:03 IP:202.62.xxx.xxx 未訂閱
您好﹗    上篇回覆的範例中有些筆誤﹐是針對RadioButton元件﹐而不是CheckBox元件﹐因為在您的專案中是使用RadioButton元件﹐RadioButton元件的特性是同一Parent的RadioButton元件只能選擇一個(即單選作用)﹐所以就不存在复選的問題﹒ 如果是使用CheckBox元件﹐或其它具備复選作用的元件﹐來完成您的要求的話﹐您可用參考Fishman前輩的方法﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-28 09:55:39 IP:61.218.xxx.xxx 未訂閱
如果不限定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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-28 18:01:27 IP:222.184.xxx.xxx 未訂閱
感谢各们位前辈指点,是我自己的控件放错了,我本意是想用CHECKBOX的。另外还有一个问题,在多条件查询前如果我想首先加入一个条件怎么办,就是说无论下面有多少种条件查询,我都是要在查询前将数据表中应收金额为0的记录都去掉,就是说只有字段应收金额不为0的记录资料才能让下面的条件进一步查询
------
我的编程起步于ktop,我将永远支持ktop
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-29 11:06:24 IP:61.229.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-29 17:23:54 IP:222.184.xxx.xxx 未訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-29 19:07:38 IP:61.229.xxx.xxx 未訂閱
要判斷是否三個都沒有選:    
  if (CheckBox1.Checked or CheckBox2.Checked or CheckBox3.Checked) = False then
    raise Exception.Create('沒有點選查詢條件,無法查詢');
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-05-29 22:40:38 IP:222.184.xxx.xxx 未訂閱
仍有两个问题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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-05-30 07:30:29 IP:222.184.xxx.xxx 未訂閱
其中的一个票据号的问题解决了,是由于在拷贝过程中的繁简写没转过来。一个日期问题改成这样了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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-05-30 18:30:16 IP:202.62.xxx.xxx 未訂閱
您好﹗    時間欄位的顯示問題﹐請見如下連接﹕ 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;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
系統時間:2024-06-22 4:07:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!