gpt4 book ai didi

delphi - 合并列上的AdoDB筛选器

转载 作者:行者123 更新时间:2023-12-03 18:35:11 26 4
gpt4 key购买 nike

所以我有一个连接到数据库(mdb)的AdoTable和使用它的DataSource。 DBGrid使用此数据源...

我试图根据用户输入过滤AdoTable。有3个重要的列:名称,姓氏和ID。我想出了一些类似的方法作为临时解决方案:

AdoTable.filter:='surname like ' +
QuotedStr('%'+edit1.text+'%')+' or name like ' +
QuotedStr('%'+edit1.text+'%')+' or ID like ' +
QuotedStr('%'+edit1.text+'%');
AdoTable.filtered:=true;


它确实可以工作,但是并不能完全满足我的要求……(当搜索名称和surename时,仅在一列中找不到任何内容)。
因此,稍后我将代码修改为:

AdoTable.filter:='surname & " " & name like ' +
QuotedStr('%'+edit1.text+'%')+' or name & " " & surname like ' +
QuotedStr('%'+edit1.text+'%')+' or ID like ' +
QuotedStr('%'+edit1.text+'%');
AdoTable.filtered:=true;


现在,这完全可以执行我想要的操作,但是会引发异常(EOleException:参数类型错误,超出可接受范围或彼此冲突)。
这让我感到非常惊讶,因为我认为它应该像sql命令中的where子句一样工作(并且可以完美地用作命令)。

我尝试将“&”替换为“ +”。
我可以分割输入文本,但我不想这样做(如果您有Robin Robin Per Perie,Ahmad ibn Hanbal等名字,那么效果会很差。)

或者,我可以重写整个程序以使用查询而不是表,但是我真的不想这样做(这也意味着我将获得新的recordSet EVERYTIME用户将更改edit1.text而不是仅过滤)。

有任何想法吗?

编辑:
所以有效的命令看起来像这样

select * from person where surname & " " & name like '%John Smith%' or name & " " & surname like '%John Smith%' or ID like '%John Smith%'


过滤器看起来像这样(并触发异常)

surname & " " & name like '%John Smith%' or name & " " & surname like '%John Smith%' or ID like '%John Smith%'


请注意,可能会有“ hn Smith”而不是“ John Smith”,因此也会找到“ Kahn Smithers”等。

最佳答案

下面的代码与AdoTable可以很好地配合使用,该AdoTable访问Delphi employee数据库中的dbdemos.mdb表。我的AdoConnection正在使用Microsoft Jet 4.0 OLE DB驱动程序。

procedure TForm1.Button1Click(Sender: TObject);
var
FilterExpr : String;
begin
AdoTable1.Filtered := not AdoTable1.Filtered;
if AdoTable1.Filtered then begin
FilterExpr := 'FirstName like ' + QuotedStr('%' + Edit1.Text + '%') + ' or LastName like ' + QuotedStr('%' + Edit1.Text + '%');
AdoTable1.Filter := FilterExpr;
end;
end;


我认为您的错误可能是使用了您提到的特定于Access的语法。您正在通过ADO层访问该表,并且AFAIK期望使用与您使用的语法相同的语法,例如用于Sql Server后端。

从您的评论看来,您似乎想涵盖用户在Edit1中键入文本的情况,先输入一个名字的片段,然后是一个空格,再跟随一个片段或姓氏。将执行以下操作:

procedure TForm1.Button1Click(Sender: TObject);
var
FilterExpr : String;
P : Integer;
S1,
S2 : String;
begin
AdoTable1.Filtered := not AdoTable1.Filtered;
if AdoTable1.Filtered then begin
P := Pos(' ', Trim(Edit1.Text));
if P > 0 then begin
S1 := Copy(Trim(Edit1.Text), 1, P - 1);
S2 := Copy(Trim(Edit1.Text), P + 1, MaxInt);
FilterExpr := '(FirstName like ' + QuotedStr('%' + S1 + '%') + ')';
FilterExpr := FilterExpr + ' or (LastName like ' + QuotedStr('%' + S2 + '%') + ')';
end
else
FilterExpr := 'FirstName like ' + QuotedStr('%' + Edit1.Text + '%') + ' or LastName like ' + QuotedStr('%' + Edit1.Text + '%');
AdoTable1.Filter := FilterExpr;
end;
end;


更新:如果要允许用户输入类似

史密斯

那么您可以使用像这样的FilterRecord事件代替上面的代码。

procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
var
S : String;
begin
S := LowerCase(DataSet.FieldByName('FirstName').AsString + ' ' + DataSet.FieldByName('LastName').AsString);
Accept := Pos(LowerCase(Edit1.Text), S) > 0;
end;


转换为LowerCase显然是忽略用户可能使用的任何大写字母。

关于delphi - 合并列上的AdoDB筛选器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41931948/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com