Filter中怎样过滤字符串字段?(25分)

  • 主题发起人 主题发起人 ldwolf
  • 开始时间 开始时间
L

ldwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用TTABLE控件联接一个ACCESS的表来让用户修改,
但想让用户在浏览数据前可以输入过滤条件以滤掉不想看到的行,
可是涉及字符字段的条件总是不起作用,比如只要姓名中含有“大”字的人的行,
该怎样写条件?

另外,过滤英文字符串该怎么办?我只能办到过滤一个字母开头的,用*通配符的话,比如(K*)
整个表中的记录就都没了

 
查找是程序中的一个重要部分,在这种时候我一定不会偷懒,我会弄一个更友好的界面
供用户操作,最后提交到数据库。我永远不用TTable或者什么过滤器。我一切只用SQL。
如果SQL中的Like子句难以搞定的,当然自己写代码。
我有一大堆使用通配符的函数,字符串可以使用*和?,数字可以使用1-3,4,7-9或者
1.234-6.546等等这样的串,日期可以使用99-1-12~00-9-27之类的串。然后变成一个列
表。然后可以使用二分或快速搜索。因为我不直接操作数据,而是实体对象。
 
我真的是无能为力,这样操作数据,与我的一贯方法相距太远了。
你从以前的贴子上大概能够找到我同huizhang先生的一番争论。搞Delphi这么多年,我都没有用过
一次TTable。我认为它是为不懂SQL的人设计的。
 
呵呵,我帮你查到了一个方法:使用OnFilterRecord事件!
 
function Match(const Source, Target: string): Boolean;
function DoMatchSubtine(Index: Integer; const SubStr: string): Boolean;
var
I, N: Integer;
begin
Result := False;
N := Length(SubStr);
if Index > Length(Source) then
Result := N = 0
else if Length(Source) > 0 then
begin
if Source[Index] = '*' then
begin
if N = 0 then
Result := DoMatchSubtine(Index + 1, '')
else
for I := 1 to N + 1 do
begin
Result := DoMatchSubtine(Index + 1, Copy(SubStr, I, N + I - 1));
if Result then
Break;
end;
end
else if Source[Index] = '?' then
begin
if N > 0 then
Result := DoMatchSubtine(Index + 1, Copy(SubStr, 2, N - 1))
end
else
begin
if N > 0 then
if Source[Index] = SubStr[1] then
Result := DoMatchSubtine(Index + 1, Copy(SubStr, 2, N - 1));
end;
end;
end;
begin
Result := DoMatchSubtine(1, Target);
end;
 
agree with above
 
我看见别人的是这样的
table1.filtered := false ;
table1.filter := 'field1 = ' + '''' + '中国' + '''' ;
table1.filtered := true ;
不过看不明白,BARTON能解释一下吗?谢谢
 
不是呀。你这用的是类似SQL中WHERE语句的方法,只能用一个表达式,如果要用
一个复杂的过程来解决的话,一定要用事件的。
你可以这样写:(假设你要比较的字段名是KK)
procedure TForm1.Table1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept := Match('中国*', Dataset.FieldByName['kk'].AsString);
end;
这和用表达式没有什么区别。
 
我在ParaDox里是用这种写法,不知道你用Access怎样
Table1.filtered:=False;
Table1.filter:='field=''+C*+''';
Table1.filtered:=True;
 
try this!!!

with tTable1 do
begin
filtered:=false;
filter:='Name like '名字'';
filtered:=true;
end;



 
多人接受答案了。
 

Similar threads

回复
0
查看
867
不得闲
回复
0
查看
1K
不得闲
回复
0
查看
819
不得闲
D
回复
0
查看
842
DelphiTeacher的专栏
D
D
回复
0
查看
848
DelphiTeacher的专栏
D
后退
顶部