我在Table中将filter设为日期》=‘2004-01-01’And 日期《=‘2004-01-31’,为何日期为‘2004-01-31’的记录无法进入筛选的记录中呢?对了,该日期字段的时间全为0。
另外有时出现“Filter handle is invaild”是什么原因导致的呢?

解决方案 »

  1.   

    Table.Filter := '日期>=2004-01-01 And 日期 < 2004-02-01’
    试试看
      

  2.   

    简言之,table.filter如何对日期字段进行过滤?
      

  3.   

    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.
      

  4.   

    'BETWEEN ''2004-1-1'' AND ''2004-1-31'''
      

  5.   

    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就可以得到正确结果