【问题标题】:Delphi TClientDataSet Filtering using LIKE and foCaseInsensitiveDelphi TClientDataSet 过滤使用 LIKE 和 foCaseInsensitive
【发布时间】:2013-07-22 06:09:20
【问题描述】:

使用 Delphi XE,我正在尝试对 TClientDataSet 进行一些过滤,但我无法让不区分大小写的过滤与 LIKE 运算符一起正常工作

考虑执行过滤的代码

cdsDocs.DisableControls;
try
  cdsDocs.Filtered := False;
  cdsDocs.FilterOptions := [foCaseInsensitive];
  cdsDocs.Filter := 'Product LIKE ''%' + txtFilter.Text + '%''';
  cdsDocs.Filtered := True;
finally
  cdsDocs.EnableControls;
end;

并认为此数据集的 Product 字段仅包含值“b”和“B”。

  1. 当 (txtFilter.Text = 'b') 我只得到 'b's(我期待 'b's 和 'B's)
  2. 当 (txtFilter.Text = 'B') 我只得到 'B'(同样,我期待 'b's 和 'B's)

好像 LIKE '%b%' 和 foCaseInsensitive 不能一起工作?我应该怎么做才能让它工作?我阅读了文档,但找不到我的错误(如果有的话)。 TIA。

【问题讨论】:

  • 对我来说看起来不错。否则你也可以使用 TClientDataSet 事件 OnFilterRecords,在这里你可以设置某些记录是否可见。
  • 这很有趣,只有当要搜索的文本(不区分大小写)与字段内容相似时,过滤器才会应用。解决方法可能是.Filter := 'Text LIKE ''%' + TextFilter.Text + '%'' or Text=' + QuotedStr(textFilter.Text);
  • @bummi 谢谢。你是说你能够重现我的问题吗?
  • 是的,显示的解决方法可以为我解决这个问题。
  • @bummi 我怀疑如果我使用真实的产品名称(超过 1 个字符)它会起作用。我担心 XE 中存在错误,或者我的代码中更糟(quelle horreur!)

标签: delphi delphi-xe tclientdataset


【解决方案1】:

一切正常,直到我尝试扩展过滤以允许不区分大小写的搜索(我尝试使用现有的 FilterOption foCaseInsensitive),现在突然我有一个错误?不,这对我来说没有意义。我决定以另一种方式实现所需的不区分大小写的过滤,并保持我的自我完整。

这是修改后的代码(完美运行)

cdDocs.DisableControls;
try
  cdDocs.Filtered := False;
  cdDocs.FilterOptions := [];

  if (cbCaseSensitive.Checked) then
    cdDocs.Filter := 'Product LIKE ''%' + txtFilter.Text + '%'''
  else
    cdDocs.Filter := 'UPPER(Product) LIKE ''%' + UPPERCASE(txtFilter.Text) + '%''';

  cdDocs.Filtered := True;
finally
  cdDocs.EnableControls;
end;

顺便说一句,这是使用 Delphi XE 附带的 Interbase DB Access 组件连接到 Interbase/Firebird 数据库。如果连接到不同的数据库,您可能需要将“UPPER”函数替换为您选择的 RDBMS 的等效函数(无论您将在等效 SQL WHERE 子句中使用什么)

【讨论】:

  • 谢谢你,但在我的情况下(ibdac TIBCTable with firebird 2.5.2)我得到以下异常:“找不到字段UPPER”......无论我做什么:“(UPPER(UTF8产品整理fr_fr) LIKE ''%'+str+'%'')" 也找不到上边。似乎它拒绝我对字段使用任何操作...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多