表结构
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;但是什么反应也没有.
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;但是什么反应也没有.
*:多个
?:还像是单个,我不记得了
filter:='orderNo=??a*'
2
filter:='inDate=''2004-07-09''';
filter:='inDate>=''2004-07-09'' and inDate<=''2004-07-09'' ';
第三个问题不清楚,这些不固定条件的过滤还是写成SQL语句比较合适。
2、标准sql好像没有formatdatetime函数,所以Filter肯定也不支持。不知道是否支持DateDiff函数,尽管试一试,不行的话可以在ADOQuery1FilterRecord中来写代码
3、当设置Filtered := True时,每一行记录会触发一次ADOQuery1FilterRecord事件
inDate=2004-07-09 12:32:15
他的格式包括时分秒我如何搜索 inDate 在 2004-05-06 到 2004-08-10 的记录.
比如
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;
1)TO_DATE,TO_CHAR的反复使用
2)利用YEAR(),MONTHE(),DAY()函数的处理
直接用sql语句多好!
比如第一个
select * form table1 where order like %a%;
以下同上