【问题标题】:Using LIKE statement for filtering使用 LIKE 语句进行过滤
【发布时间】:2012-07-21 18:16:00
【问题描述】:

我正在使用此代码过滤我的表:

Table.Filtered := False;
Table.Filter := '[' + Field_Search + '] LIKE ''%' + Edit_Search.Text + '%''';
Table.Filtered := True;

但它引发了这个异常:

“操作不适用。”

问题出在哪里?

【问题讨论】:

    标签: delphi delphi-7


    【解决方案1】:

    TTable.Filter 不是 SQL 查询。不支持LIKEIN 也不支持)。支持的运算符有=<>><>=、',AND,NOTandOR`,根据the documentation

    对于更复杂的过滤,使用TDataSet.OnFilterRecord事件:

    procedure TForm1.Table1FilterRecord(Dataset: TDataset; var Accept: Boolean);
    begin
      // Don't remember if D7 supports DataSet[FieldName] syntax; if not,
      // use DataSet.FieldByName instead, or a persistent field.
      Accept := Pos(Edit_Search.Text, DataSet[SearchField].AsString) > 0;
    end;
    

    【讨论】:

    • LIKE 在数据集过滤器中受支持。 docwiki.embarcadero.com/Libraries/en/Data.DB.TDataSet.Filter
    • 我认为肯是对的。部分数据库支持like运算符,如DBISAM(TDBISAMTable),但不支持TTable。
    • 你是对的。使用 BDE 时,TTable 不支持过滤器中的 LIKE 并提供与 OP 报告的相同的消息。他要么需要使用另一个数据集,要么在当前设置中使用客户端数据集。
    • @Bruce:或者使用我在答案中发布的代码,它不需要像更改到另一个数据集或客户端数据集那样多的工作。
    【解决方案2】:
    Table.Filtered := False;
    Table.Filter := Field_Search + ' LIKE ' + QuotedStr('*' + Edit_Search.Text + '*');
    Table.Filtered := True;
    

    【讨论】:

    • 你应该在你的答案中添加一些细节!
    【解决方案3】:

    你应该使用这个:

       DataModule.Table.Filtered := False;
       DataModule.Table.Filter := 'Field_Name' + ' LIKE ' + QuotedStr(Edt_SearchByCode.Text +'%');
       DataModule.Table.Filtered := True;
    

    并且将像魔术一样工作,不再使用 TQuery .... 如果你想匹配不考虑区分大小写。 您应该改用此代码:

       DataModule.Table.Filtered := False;
       DataModule.Table.FilterOptions := [foCaseInsensitive];
       DataModule.Table.Filter := 'Field_Name' + ' LIKE ' + QuotedStr(Edt_SearchByCode.Text +'%');
       DataModule.Table.Filtered := True;
    

    【讨论】:

      【解决方案4】:

      我发现这个主题正在寻找其他东西。我总是使用 TDataSet.OnFilterRecord 事件,并且在大多数情况下我使用 TEdit.OnChange 事件,因此搜索是“活动的”;

      var
      Criteria : string;
      ...
      ...
      
      procedure TForm1.Edit1Change(Sender: TObject);
      begin
        Table.Filtered := False;
        Criteria := Edit1.text;
        Table.Filtered := True;
      end;
      

      并使用 OnFilter 事件

      procedure TForm1.TableFilterRecord(DataSet: TDataSet;
        var Accept: Boolean);
      begin
        Accept := AnsiContainsStr(Table.Fields[xx].asString,Criteria);
      end;
      

      为我工作。

      【讨论】:

        【解决方案5】:

        以下代码也将像 Like 一样工作:

        if Edit1.Text <>'' then
        begin
        Query1.Filter :='FieldName ='+quotedstr('*'+ edit1.Text +'*');
        Query1.Filtered:=true;
        end
        else
        begin query1.Filtered :=false; end;
        

        【讨论】:

          【解决方案6】:

          我主要使用 TEdit 这里是代码

          if (EditSerarch.Text <> '') then
          begin
          FDQQuery.Filtered := false;
          FDQQuery.Filter:=   'Name LIKE'+ QuotedStr('%'+EditSerarch.Text+'%') +
                      ' OR Company LIKE '+ QuotedStr('%'+EditSerarch.Text+'%') +
                        ' OR Phone LIKE '+ QuotedStr('%'+EditSerarch.Text+'%') +
                       ' OR Mobile LIKE '+ QuotedStr('%'+EditSerarch.Text+'%');
          FDQQuery.Filtered:= True;
          end else FDQQuery.Filtered := false;
          

          【讨论】:

          • @kobik:糟糕,我的错误,评论已删除。谢谢]
          【解决方案7】:

          我建议使用 SQL 查询来执行此操作。

          例子:

          query1.SQL.Text:='Select * FROM table_name WHERE field like '+ QuotedStr(edit1.text+'%');
          query1.Active:=true;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-04
            • 1970-01-01
            • 1970-01-01
            • 2023-04-04
            • 2021-01-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多