我想做一个查询,一个条件是模糊查询,可以输入‘工号’‘姓名’‘部门’,另一个条件是月份。意思是某个月份某个工号的查询,某个月份某个部门的查询,某个月份某个姓名的查询,我自己写的代码达不到着种效果。procedure TForm7.Button1Click(Sender: TObject);
begin
adoquery1.Close;
adoquery1.SQL.clear;
adoquery1.SQL.Add('select * from 工资管理 where  (工号 like '+QuotedStr('%'+edit1.text+'%')+' or 姓名 like '+QuotedStr('%'+edit1.text+'%')+' or 部门 like'+QuotedStr('%'+edit1.text+'%')+') and 月份='''+formatdatetime('yyyy-mm',datetimepicker1.date)+'''');
adoquery1.open;
end;

解决方案 »

  1.   

    是不是組合起來姓名+月份
    部門+月份
    工號+月份??
    還是 (姓名 or  部門  or  工號 )  and  月份
      

  2.   

    (姓名 or  部門  or  工號 )  and  月份
      

  3.   


    create procedure GetQueryData
    @workno VARCHAR(50),
    @workname VARCHAR(50),
    @workdept VARCHAR(50),
    @workdate DATETIME,
    @QueryType int
    as
    if @QueryType=1 
    begin
     select * from table3 where workno=@workno and workdate=@workdate
    end
    if @QueryType=2 
    begin
     select * from table3 where workname=@workname and workdate=@workdate
    end
    if @QueryType=3
    begin
     select * from table3 where workdept=@workdept and workdate=@workdate
    end
    MSSQL中创建以上存储过程,然后调用,里面很多细节处理我忽略了
      

  4.   

    是这样的,我有两个edit,第一个我想让它可以输入姓名 或者部門或者工號 ,然后在第二个edit‘月份’的条件下查询
      

  5.   


    那就簡單了,你應該還會一個 Combobox  來做對應的,比如 combobox 選擇部門,那麼後面的值就對應就是查部門的。我記得我上次幫你寫過。
    var
      vSQL : String;case combobox.itemindex of
      0: vSQL := ' 工号 like '+QuotedStr('%'+edit1.text+'%');
      1: vSQL := ' 姓名 like '+QuotedStr('%'+edit1.text+'%');
      2: vSQL := ' 部门 like '+QuotedStr('%'+edit1.text+'%');
    end;vSQL := 'select * from  工资管理 where 月份= Quotedstr(formatdatetime('yyyy-mm',datetimepicker1.date))+vSQL;
    adoquery1.Close;
    adoquery1.SQL.clear;
    adoquery1.SQL.text := vSQL ;
    adoquery1.open;
      

  6.   

          s:='SELECT  distinct A.*,sp.retail,sp.wholesale,sp.wholesale1,mi.simpname as Manuer, '
             +  ' pl.mid,pl.manuid,pl.trade,'
             +  ' pl.permission,permissonExpdate,Barcode,pl.country,pl.firstindate,'
             +  ' pl.lastincost,pl.useing as useing2,pl.QAPass,pl.QADate,pl.SaleRegion,'
             +  ' sp.PlanPrice,sp.moveprice FROM PROD AS A left JOIN salePRICE as sp ON A.id=sp.prodid left join prodsuppl as pl on a.id=pl.prodid '
             +  ' left join suppliers as mi on pl.Manuid = mi.Manuer '
             +  ' where ((A.CODE like ''%''+'+quotedstr(trim(ParaItemsIn[2]))+' ) OR '
             +  '(A.PYM LIKE ''%''+'+quotedstr(trim(ParaItemsIn[2])) +'+''%'')) or '
             +  '(pl.barcode like '+ quotedstr(trim(ParaItemsIn[2]))+')';
    我这个应该跟你的差不多。。
      

  7.   

    var
      vSQL : String;case combobox.itemindex of
      0: vSQL := ' 工号 like '+QuotedStr('%'+edit1.text+'%');
      1: vSQL := ' 姓名 like '+QuotedStr('%'+edit1.text+'%');
      2: vSQL := ' 部门 like '+QuotedStr('%'+edit1.text+'%');
    end;vSQL := 'select * from  工资管理 where 月份= '+ Quotedstr(formatdatetime('yyyy-mm',datetimepicker1.date))+vSQL;
    adoquery1.Close;
    adoquery1.SQL.clear;
    adoquery1.SQL.text := vSQL ;
    adoquery1.open;
      

  8.   

     showmessage(sql.text);
    看一下你執行時的SQL語句是什麽?然後在查詢分析器中執行一下看是什麽結果.
      

  9.   


     呵呵,我不太理解。。  你的是兩個EDIT,怎麼實現四個條件的輸入呢?? 我的腦子反應越來越慢了。
      

  10.   

    楼主想用一个edit来满足三个条件,也就是说这个edit里面的数据还要根据所填的内容进行判断是属于哪个类别的,这样实现起来是不是有点麻烦了?我看starluck的发放就不错!
      

  11.   

    大概明白了楼主的意思,你的代码本身没有什么问题,关键是两个or的地方要注意一下,自己测试了一个感觉还可以,楼主可以试试:procedure TForm1.Button2Click(Sender: TObject);
    begin
      qry1.Close;
      qry1.SQL.Text:='select * from tb1 where ((bm like '+QuotedStr('%'+Edit2.Text+'%')+')or(name like '+QuotedStr('%'+Edit2.Text+'%')+')or(id like '+QuotedStr('%'+Edit2.Text+'%')+')) and dj='''+edit3.Text+'''';
      qry1.open;
    end;注意:((bm like '+QuotedStr('%'+Edit2.Text+'%')+')or(name like '+QuotedStr('%'+Edit2.Text+'%')+')or(id like '+QuotedStr('%'+Edit2.Text+'%')+'))多加了一个括号。 
      

  12.   

    是的,你可以先到SQL下去测试好逻辑,再写