有关Table.Filter的小问题一个。 我在Table中将filter设为日期》=‘2004-01-01’And 日期《=‘2004-01-31’,为何日期为‘2004-01-31’的记录无法进入筛选的记录中呢?对了,该日期字段的时间全为0。另外有时出现“Filter handle is invaild”是什么原因导致的呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Table.Filter := '日期>=2004-01-01 And 日期 < 2004-02-01’试试看 简言之,table.filter如何对日期字段进行过滤? unit ufrmSelect;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ufrmPGRD, StdCtrls, Buttons, ExtCtrls, DBCtrls, ToolWin, ComCtrls, PrnDbgeh, DBSumLst, Menus, Grids, DBGridEh, wwDialog, Wwlocate, DBActns, ActnList, DB, Wwintl, wwSpeedButton, wwDBNavigator, wwclearpanel;type TfrmSelect = class(TfrmPGRD) tab: TToolBar; BitBtn1: TBitBtn; BitBtn2: TBitBtn; DataSource1: TDataSource; wwLocateDialog1: TwwLocateDialog; wwIntl1: TwwIntl; wwDBFilter: TwwDBNavigator; wwDBFilterFilterDialog: TwwNavButton; wwDBFilterLocateDialog: TwwNavButton; wwDBFilterSearchDialog: TwwNavButton; ToolButton1: TToolButton; pnlSearch: TPanel; edtSearch: TEdit; btnQuery: TBitBtn; procedure wwLocateDialog1InitDialog(Dialog: TwwLocateDlg); procedure grdlstDblClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormDestroy(Sender: TObject); procedure SbQueryClick(Sender: TObject); procedure grdlstKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormActivate(Sender: TObject); procedure btnQueryClick(Sender: TObject); procedure grdlstMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure edtSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private sqlstr : string; varArray : array of string;//解析时用到 procedure FilterRecord(DataSet: TDataSet;var Accept: Boolean); function bdsje(vstr : string) : boolean;//解析表达式 procedure adoKeyOneFilterRecord(DataSet: TDataSet;var Accept: Boolean); { Private declarations } public SelectList :TstringList; { Public declarations } end;var frmSelect: TfrmSelect;implementation{$R *.dfm}procedure TfrmSelect.wwLocateDialog1InitDialog(Dialog: TwwLocateDlg);begin inherited; Dialog.CancelBtn.Font.Name :='宋体'; Dialog.CancelBtn.Font.Size :=9; Dialog.Font.Name:='宋体'; Dialog.Font.Size :=9;end;procedure TfrmSelect.grdlstDblClick(Sender: TObject);begin inherited; frmSelect.ModalResult:=mrOK;end;procedure TfrmSelect.FormClose(Sender: TObject; var Action: TCloseAction);begin //inherited; SelectList.free; Action:=caFree;end;procedure TfrmSelect.FormDestroy(Sender: TObject);begin //inherited; grdlst.DataSource.DataSet.Filtered := FALSE; frmSelect:=nil;end;procedure TfrmSelect.SbQueryClick(Sender: TObject);begin inherited; if wwLocateDialog1.DataSource.DataSet.IsEmpty then exit; wwLocateDialog1.Execute;end;procedure TfrmSelect.grdlstKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);begin // inherited; if key=vk_return then ModalResult:=mrOK;end;procedure TfrmSelect.FormActivate(Sender: TObject);begin inherited; edtSearch.SetFocus ;end;procedure TfrmSelect.FilterRecord(DataSet: TDataSet; var Accept: Boolean);begin //Accept := dataSet.end;function TfrmSelect.bdsje(vstr: string): boolean;var i,iLen,iPos : integer; vstrCopy : string;begin result := false; i := 0; iPos := pos('*',vstr); if iPos = 0 then begin setLength(vararray,i+1); vararray[i] := vstr; result := false; exit; end; vstrcopy := vstr; while iPos <> 0 do begin inc(i); iPos := pos('*',vstrcopy); iLen := length(vstrCopy); setLength(vararray,i); vararray[i-1] := copy(vstrCopy,1,iPos - 1); vstrCopy := copy(vstrCopy,iPos+1,iLen - iPos); //是否为零 iPos := pos('*',vstrcopy); if iPos = 0 then begin inc(i); setLength(vararray,i); vararray[i-1] := vstrCopy; result := false; exit; end; end;end;procedure TfrmSelect.adoKeyOneFilterRecord(DataSet: TDataSet; var Accept: Boolean);var i : integer;begin //Accept := sqlstr := ''; for i := 0 to grdlst.DataSource.DataSet.Fields.Count -1 do sqlstr := sqlstr + grdlst.DataSource.DataSet.FieldDefs.Items[i].Name+' like ''%'+edtSearch.Text+'%'' or '; sqlstr := copy(sqlstr,1,length(sqlstr)-3); with grdlst.DataSource.DataSet do begin Filtered := false; if edtSearch.text <> '' then begin Filter := sqlstr; Filtered := true; end; end;end;procedure TfrmSelect.btnQueryClick(Sender: TObject);var i,j : integer;begin inherited; setLength(varArray,0); bdsje(edtSearch.Text); sqlstr := ''; for i := 0 to grdlst.DataSource.DataSet.Fields.Count -1 do begin for j := low(varArray) to High(varArray) do sqlstr := sqlstr +'(' +grdlst.DataSource.DataSet.FieldDefs.Items[i].Name+' like ''%'+varArray[j]+'%'') and '; if High(varArray) -low(varArray)>=1 then sqlstr := '('+copy(sqlstr,1,length(sqlstr)-6)+ ') or (' else sqlstr := copy(sqlstr,1,length(sqlstr)-6)+ ' or '; end; if High(varArray) -low(varArray)>=1 then begin sqlstr := copy(sqlstr,3,length(sqlstr)-6); if grdlst.DataSource.DataSet.Fields.Count <= 2 then sqlstr := '('+sqlstr //+ ')'; else if grdlst.DataSource.DataSet.Fields.Count = 3 then sqlstr := sqlstr else begin i := grdlst.DataSource.DataSet.Fields.Count-2; sqlstr := copy(sqlstr,i,length(sqlstr) -i+1); end; end else sqlstr := copy(sqlstr,1,length(sqlstr)-4); // sqlstr := sqlstr + grdlst.DataSource.DataSet.FieldDefs.Items[i].Name+' like ''%'+edtSearch.Text+'%'' or '; //sqlstr := copy(sqlstr,1,length(sqlstr)-3); with grdlst.DataSource.DataSet do begin Filtered := false; if edtSearch.text <> '' then begin Filter := sqlstr; Filtered := true; end; end;end;procedure TfrmSelect.grdlstMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var vAdr : string;begin inherited; if not grdlst.DataSource.DataSet.Active then exit; if (button = mbRight) and (grdlst.DataSource.DataSet.RecordCount > 0) then begin vAdr:=grdlst.DataSource.DataSet.Fields[0].AsString; if SelectList.IndexOf(vAdr) <> -1 then SelectList.Delete(SelectList.IndexOf(vAdr)) else SelectList.Add(vAdr); end; if (Button = mbLeft) and (grdlst.DataSource.DataSet.RecordCount > 0) then begin SelectList.Clear; grdlst.Refresh; end;end;procedure TfrmSelect.FormCreate(Sender: TObject);begin inherited; selectList := TstringList.Create;end;procedure TfrmSelect.edtSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);begin inherited; inherited; // inherited; if key=13 then btnQuery.SetFocus;end;end. 'BETWEEN ''2004-1-1'' AND ''2004-1-31''' Table1.Filtered := false;Table1.Filter := '日期>=2004-01-01 and 日期<= 2004-01-31';//或者Table1.Filter := '日期 >= ''2004-01-01'' and 日期 <= ''2004-01-31''';Table1.Filtered := true;再试试,我用ADOQuery就可以得到正确结果 怎么样把从数据库中读到的记录生成TXT文件啊? Delphi的日期时间类型,在线等待!! 大虾们注意了,请教关于乱码的问题。 如何加上电脑的ip地址? 关于deletefile() 帮忙找个小控件! 需要ActiveSkin控件的Crack (求教)为了使chart控件中曲线上的点更平滑,怎样在赋值的时候与前面几个点平均处理 下载控件哪儿最棒?我需要一个能够显示Tiff图片的控件。 如何锁定DBGRID中的某个单元格。 如何在DBGrid的最左边一列显示identity列 DbGrid中采用ApplyUpdate提交数据时,为何修改过的记录出现双行,手动刷新后才显示正常?
试试看
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ufrmPGRD, StdCtrls, Buttons, ExtCtrls, DBCtrls, ToolWin, ComCtrls,
PrnDbgeh, DBSumLst, Menus, Grids, DBGridEh, wwDialog, Wwlocate,
DBActns, ActnList, DB, Wwintl, wwSpeedButton, wwDBNavigator, wwclearpanel;type
TfrmSelect = class(TfrmPGRD)
tab: TToolBar;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
DataSource1: TDataSource;
wwLocateDialog1: TwwLocateDialog;
wwIntl1: TwwIntl;
wwDBFilter: TwwDBNavigator;
wwDBFilterFilterDialog: TwwNavButton;
wwDBFilterLocateDialog: TwwNavButton;
wwDBFilterSearchDialog: TwwNavButton;
ToolButton1: TToolButton;
pnlSearch: TPanel;
edtSearch: TEdit;
btnQuery: TBitBtn;
procedure wwLocateDialog1InitDialog(Dialog: TwwLocateDlg);
procedure grdlstDblClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure SbQueryClick(Sender: TObject);
procedure grdlstKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormActivate(Sender: TObject);
procedure btnQueryClick(Sender: TObject);
procedure grdlstMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure edtSearchKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
sqlstr : string;
varArray : array of string;//解析时用到
procedure FilterRecord(DataSet: TDataSet;var Accept: Boolean);
function bdsje(vstr : string) : boolean;//解析表达式
procedure adoKeyOneFilterRecord(DataSet: TDataSet;var Accept: Boolean);
{ Private declarations }
public
SelectList :TstringList;
{ Public declarations }
end;var
frmSelect: TfrmSelect;implementation{$R *.dfm}procedure TfrmSelect.wwLocateDialog1InitDialog(Dialog: TwwLocateDlg);
begin
inherited;
Dialog.CancelBtn.Font.Name :='宋体';
Dialog.CancelBtn.Font.Size :=9; Dialog.Font.Name:='宋体';
Dialog.Font.Size :=9;
end;procedure TfrmSelect.grdlstDblClick(Sender: TObject);
begin
inherited;
frmSelect.ModalResult:=mrOK;
end;procedure TfrmSelect.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//inherited;
SelectList.free;
Action:=caFree;
end;procedure TfrmSelect.FormDestroy(Sender: TObject);
begin
//inherited;
grdlst.DataSource.DataSet.Filtered := FALSE;
frmSelect:=nil;end;procedure TfrmSelect.SbQueryClick(Sender: TObject);
begin
inherited;
if wwLocateDialog1.DataSource.DataSet.IsEmpty then exit;
wwLocateDialog1.Execute;end;procedure TfrmSelect.grdlstKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// inherited;
if key=vk_return then ModalResult:=mrOK;end;procedure TfrmSelect.FormActivate(Sender: TObject);
begin
inherited;
edtSearch.SetFocus ;
end;procedure TfrmSelect.FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
//Accept := dataSet.
end;function TfrmSelect.bdsje(vstr: string): boolean;
var
i,iLen,iPos : integer;
vstrCopy : string;
begin
result := false;
i := 0;
iPos := pos('*',vstr);
if iPos = 0 then
begin
setLength(vararray,i+1);
vararray[i] := vstr;
result := false;
exit;
end;
vstrcopy := vstr;
while iPos <> 0 do
begin
inc(i);
iPos := pos('*',vstrcopy);
iLen := length(vstrCopy);
setLength(vararray,i);
vararray[i-1] := copy(vstrCopy,1,iPos - 1);
vstrCopy := copy(vstrCopy,iPos+1,iLen - iPos);
//是否为零
iPos := pos('*',vstrcopy);
if iPos = 0 then
begin
inc(i);
setLength(vararray,i);
vararray[i-1] := vstrCopy;
result := false;
exit;
end; end;
end;procedure TfrmSelect.adoKeyOneFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var
i : integer;
begin
//Accept :=
sqlstr := '';
for i := 0 to grdlst.DataSource.DataSet.Fields.Count -1 do
sqlstr := sqlstr + grdlst.DataSource.DataSet.FieldDefs.Items[i].Name+' like ''%'+edtSearch.Text+'%'' or ';
sqlstr := copy(sqlstr,1,length(sqlstr)-3);
with grdlst.DataSource.DataSet do
begin
Filtered := false;
if edtSearch.text <> '' then
begin
Filter := sqlstr;
Filtered := true;
end; end;
end;procedure TfrmSelect.btnQueryClick(Sender: TObject);
var
i,j : integer;
begin
inherited;
setLength(varArray,0);
bdsje(edtSearch.Text);
sqlstr := '';
for i := 0 to grdlst.DataSource.DataSet.Fields.Count -1 do
begin
for j := low(varArray) to High(varArray) do
sqlstr := sqlstr +'(' +grdlst.DataSource.DataSet.FieldDefs.Items[i].Name+' like ''%'+varArray[j]+'%'') and ';
if High(varArray) -low(varArray)>=1 then
sqlstr := '('+copy(sqlstr,1,length(sqlstr)-6)+ ') or ('
else
sqlstr := copy(sqlstr,1,length(sqlstr)-6)+ ' or ';
end;
if High(varArray) -low(varArray)>=1 then
begin
sqlstr := copy(sqlstr,3,length(sqlstr)-6);
if grdlst.DataSource.DataSet.Fields.Count <= 2 then
sqlstr := '('+sqlstr //+ ')';
else if grdlst.DataSource.DataSet.Fields.Count = 3 then
sqlstr := sqlstr
else
begin
i := grdlst.DataSource.DataSet.Fields.Count-2;
sqlstr := copy(sqlstr,i,length(sqlstr) -i+1);
end;
end
else
sqlstr := copy(sqlstr,1,length(sqlstr)-4); // sqlstr := sqlstr + grdlst.DataSource.DataSet.FieldDefs.Items[i].Name+' like ''%'+edtSearch.Text+'%'' or ';
//sqlstr := copy(sqlstr,1,length(sqlstr)-3);
with grdlst.DataSource.DataSet do
begin
Filtered := false;
if edtSearch.text <> '' then
begin
Filter := sqlstr;
Filtered := true;
end; end;
end;procedure TfrmSelect.grdlstMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
vAdr : string;
begin
inherited;
if not grdlst.DataSource.DataSet.Active then exit;
if (button = mbRight) and (grdlst.DataSource.DataSet.RecordCount > 0) then
begin
vAdr:=grdlst.DataSource.DataSet.Fields[0].AsString;
if SelectList.IndexOf(vAdr) <> -1 then
SelectList.Delete(SelectList.IndexOf(vAdr))
else
SelectList.Add(vAdr);
end;
if (Button = mbLeft) and (grdlst.DataSource.DataSet.RecordCount > 0) then
begin
SelectList.Clear;
grdlst.Refresh;
end;
end;procedure TfrmSelect.FormCreate(Sender: TObject);
begin
inherited;
selectList := TstringList.Create;
end;procedure TfrmSelect.edtSearchKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
inherited;
// inherited;
if key=13 then
btnQuery.SetFocus;
end;end.
Table1.Filter := '日期>=2004-01-01 and 日期<= 2004-01-31';
//或者Table1.Filter := '日期 >= ''2004-01-01'' and 日期 <= ''2004-01-31''';
Table1.Filtered := true;
再试试,我用ADOQuery就可以得到正确结果