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