Delphi 如何使用TClientDataSet定位包含字符串

Delphi 如何使用TClientDataSet定位包含字符串,delphi,delphi-2007,datasnap,Delphi,Delphi 2007,Datasnap,我使用的是Delphi2007 我知道我可以使用TClientDataSet的.locate方法来定位记录,如下所示: locate('name','John',[loPartialKey,locaseSensitive]) 但假设我想找到任何名称中包含“John”的记录,例如 像“%John%”这样的名称 将在正则SQL表达式中执行 是否可以使用.locate方法进行此操作 似乎[loPartialKey]的作用是以开头,而不是包含。否。第一部分的内容可以部分匹配。如“使用定位”的帮助中所述

我使用的是Delphi2007

我知道我可以使用TClientDataSet的.locate方法来定位记录,如下所示:

locate('name','John',[loPartialKey,locaseSensitive])

但假设我想找到任何名称中包含“John”的记录,例如

像“%John%”这样的名称

将在正则SQL表达式中执行

是否可以使用.locate方法进行此操作


似乎[loPartialKey]的作用是以开头,而不是包含。

否。第一部分的内容可以部分匹配。如“使用定位”的帮助中所述

Locate将光标移动到与指定的一组属性匹配的第一行 搜索条件。在最简单的形式中,您可以传递并定位 要搜索的列、要匹配的字段值和选项标志 指定搜索是不区分大小写还是可以使用 部分密钥匹配。(当标准 字符串只需要是字段值的前缀。)例如 下面的代码将光标移动到CustTable中的第一行 公司栏中的值为“专业潜水员有限公司”:


参考:

第一部分的编号可以部分匹配。如“使用定位”的帮助中所述

Locate将光标移动到与指定的一组属性匹配的第一行 搜索条件。在最简单的形式中,您可以传递并定位 要搜索的列、要匹配的字段值和选项标志 指定搜索是不区分大小写还是可以使用 部分密钥匹配。(当标准 字符串只需要是字段值的前缀。)例如 下面的代码将光标移动到CustTable中的第一行 公司栏中的值为“专业潜水员有限公司”:


ref:

在.Locate中,loPartialKey与字段值中的第一个字符相匹配,因此您无法仅使用.Locate执行所需操作

但是,TClientDataSet的Filter属性可以包含类似于的
,如中所示
将CD的筛选器属性设置为

AField like '%w%'  // matches all AField values containing `w`
或者,在代码中

  ClientDataset1.Filtered := False;
  ClientDataset1.Filter :=  'AField like ' + QuotedStr('%' + edFilter.Text + '%');
  ClientDataset1.Filtered := True;

因此,您可以使用筛选器缩小行数,并使用Locate查找特定行,或者简单地迭代筛选的行以查找所需的精确行。

在.Locate中,loPartialKey与字段值中的第一个字符匹配,因此您无法仅使用.Locate执行所需操作

但是,TClientDataSet的Filter属性可以包含类似于
,如中所示
将CD的筛选器属性设置为

AField like '%w%'  // matches all AField values containing `w`
或者,在代码中

  ClientDataset1.Filtered := False;
  ClientDataset1.Filter :=  'AField like ' + QuotedStr('%' + edFilter.Text + '%');
  ClientDataset1.Filtered := True;

因此,您可以使用筛选器缩小行数,并使用Locate查找特定行,或者简单地迭代筛选出的行以找到您想要的确切行。

LocaateRecord内部使用DSCursor.LocaateWithFilter,因此我相信可以编写自定义方法来做您想做的事情。

LocaateRecord内部使用DSCursor.LocaateWithFilter,因此我相信可以编写自定义方法来做您想做的事情更好地使用.FindFirst和.FindNext:

myDataset.Filter := 'CustomerName LIKE ' + ('*' + edtSearch.Text + '*').QuotedString;
myDataset.Filtered := False;
Found :=  myDataset.FindFirst

if Found then
当您要搜索知道确切值的密钥时,请使用.Locate


对于您不介意其他记录是否会在dbGrid上消失的情况,使用just Filtered:=true将有效。

最好使用.FindFirst和.FindNext:

myDataset.Filter := 'CustomerName LIKE ' + ('*' + edtSearch.Text + '*').QuotedString;
myDataset.Filtered := False;
Found :=  myDataset.FindFirst

if Found then
当您要搜索知道确切值的密钥时,请使用.Locate


对于您不介意其他记录是否会在dbGrid上消失的情况,使用just Filtered:=true将有效。

是否尝试使用查找方法不确定是否在2007中?您是否尝试过使用查找方法不确定是否在2007年?你确定“阿菲尔德”
?@Sami:是的,阿菲尔德就是这个字段的名字。它在D7中当然有效。是的,我知道你的意思,但它应该是一个字符串
'FieldName'
,并且你还应该使用
QuotedStr()
来表示
'%w%'
。类似于
:='AField-like'+QuotedStr(“%w%”)@Sami,抱歉,我引用的内容,如果使用propertt编辑器输入,则不在Affield周围引用也可以。谢谢你能听到。我不能马上看出QuotedStr对RHS有什么影响,但这是漫长的一天。我想你累了:)。但是
过滤器
属性是一个字符串,因此当您按照建议传递字符串时,它将是
“类似于%w%的字段”
。这有效吗?你确定“阿菲尔德”
?@Sami:是的,阿菲尔德是该字段的名称。它在D7中当然有效。是的,我知道你的意思,但它应该是一个字符串
'FieldName'
,并且你还应该使用
QuotedStr()
来表示
'%w%'
。类似于
:='AField-like'+QuotedStr(“%w%”)@Sami,抱歉,我引用的内容,如果使用propertt编辑器输入,则不在Affield周围引用也可以。谢谢你能听到。我不能马上看出QuotedStr对RHS有什么影响,但这是漫长的一天。我想你累了:)。但是
过滤器
属性是一个字符串,因此当您按照建议传递字符串时,它将是
“类似于%w%的字段”
。这有效吗?