表结构
creare table InOrder       --入库单
(
    orderNo char(4), --入库单号
    supplierNo char(6),--供货商编码
    inDate  date      --入库时间
)AdoQuery1.sql.text:='select orderNo,supplierNo,inDate  from InOrder';
我现在想实现几个过滤,可是不会写:1、搜索入库单号中第2个字母为'a'的记录
  也就是 filter:=' copy(orderNo,2,1)=''a''';
   但是这种写法不对,不知道正确的写法是什么?2、搜索入库时间 在 '2004-07-09'   的记录
 也就是 filter:=' formatdatetime(inDate,'yyyy-mm-dd')=''2004-07-09''';
    但是这种写法也不对,不知道正确的写法是什么?上边这两个问题其实就是说 过滤字段,如何加函数处理?
3、据说在OnFilterRecord事件里能实现复杂一点的过滤,不知道具体如何使用OnFilterRecord事件
  我写下面的语句:
procedure TFrmIn.ADOQuery1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
   
  Accept:=false;
   Accept := DataSet.Fields[0].AsString[1] = 'a';end;
  
但是不知道如何触发该事件。想了一个笨方法:
procedure TFrmIn.button1Click(Sender: TObject);
var Accept:boolean;
begin
   ADOQuery1FilterRecord(adoquery1,Accept);
end;但是什么反应也没有. 

解决方案 »

  1.   

    1,可以用匹配*,?
    *:多个
    ?:还像是单个,我不记得了
    filter:='orderNo=??a*'
    2
    filter:='inDate=''2004-07-09''';
    filter:='inDate>=''2004-07-09'' and inDate<=''2004-07-09'' ';
      

  2.   

    dacong(大聪) 所说的“?”是“_”下划线,表示一个字符,但是这种方法能在FILTER中使用吗??关注!
    第三个问题不清楚,这些不固定条件的过滤还是写成SQL语句比较合适。
      

  3.   

    1、Filter也支持like语法,试一下就知道了
    2、标准sql好像没有formatdatetime函数,所以Filter肯定也不支持。不知道是否支持DateDiff函数,尽管试一试,不行的话可以在ADOQuery1FilterRecord中来写代码
    3、当设置Filtered := True时,每一行记录会触发一次ADOQuery1FilterRecord事件
      

  4.   

    其实,我现在觉得最困难的是,如何给字段加函数.比如:
    inDate=2004-07-09 12:32:15 
     他的格式包括时分秒我如何搜索 inDate 在  2004-05-06 到 2004-08-10 的记录.
      

  5.   

    http://www.delphibbs.com/delphibbs/dispq.asp?lid=2762204http://bbs.2ccc.com/topic.asp?topicid=111298
      

  6.   

    据说在OnFilterRecord事件里能实现复杂一点的过滤,
    比如
    procedure TForm1.ADOQuery1FilterRecord(DataSet: TDataSet;
      var Accept: Boolean);
    begin
          Accept :=(pos('a', DataSet.Fields[0].AsString)>0)
    end;
    但是我不知道具体如何触发OnFilterRecord事件比如在edit1里的数据发生变化时就触发一次OnFilterRecord事件。我是用的下面一种方法,但是我觉得不太好,
    因为要关闭Filtered一次,在打开Filtered一次.
    明显的看到Dbgrid一次刷新的过程。应该有更好的方法触发OnFilterRecord事件
    procedure TForm1.edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      adoquery1.Filtered:=FALSE;
      adoquery1.Filtered:=true;
    end;
      

  7.   

    时间处理上有两种办法:
    1)TO_DATE,TO_CHAR的反复使用
    2)利用YEAR(),MONTHE(),DAY()函数的处理
      

  8.   

    用*是在filter中.用%是在SQL语句中.
      

  9.   

    过滤什么呀,
    直接用sql语句多好!
    比如第一个
    select * form table1 where order like %a%;
    以下同上