关于ClientDataSet的Filter中文支持问题,再次发贴

TOMWLD 2003-08-18 05:55:15
今天碰到一个怪现象:设置ClientDataSet的Filter属性时如果用下面这样语句的话:
ClientDataSet1.Filter:='CustName like '+#39+'%泉%'+#39时查找不到任何内容,
而用
ClientDataSet1.Filter:='CustName like '#39+'%泉州%'+#39时可查找到符合的内容

经反复试验,发现:
如果用一个汉字的话,如 %泉% 的Filter查不到任何内容,但数字和英文都没有问题。
如果用两个汉字的话,如 %泉州% 的Filter可以查到符合的内容
如果去掉开始的通配符的话,如 泉% 也可查到符合的内容

怪,怪,如何解决,看各位的了

此贴曾发过,但未获得需要的答案,参见:http://expert.csdn.net/Expert/topic/1361/1361289.xml?temp=.6720087
...全文
287 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
深宇 2003-09-20
  • 打赏
  • 举报
回复
不好意思,漏了一个函数
procedure TFilterForm.FilterRecord(DataSet: TDataSet;var Accept: Boolean);
begin
if pos(StrLower(pchar(trim(edit1.text))),StrLower(pchar(dataset.FieldByName(fieldname).asstring)))>0 then
accept:=true
else
accept:=false;
end;
深宇 2003-09-20
  • 打赏
  • 举报
回复
我的解决方法(暂时只支持一个字段):
case DataSet.Fieldbyname(fieldname).DataType of
ftString,ftWideString:
begin
if not checkbox1.Checked then
begin
dataset.Filtered:=false;
dataset.Filter:='';
end;
dataset.OnFilterRecord:=FilterRecord;
dataset.Filtered:=true;
end;
ftSmallint,ftInteger,ftWord,ftLargeint,ftFloat,ftBCD:
begin
if not checkbox1.Checked then
dataset.Filtered:=false;
dataset.Filter:=fieldname+'='+trim(edit1.text);
dataset.Filtered:=true;
end;
else
begin
raise exception.Create('该字段类型不可识别!');
end;
end;
深宇 2003-09-20
  • 打赏
  • 举报
回复
如果字段的类型是ftstring就不会不现问题,但如果是ftwidestring就不行了
sncel 2003-09-20
  • 打赏
  • 举报
回复
做一下广告。
http://snpack.fykj.com
sncel 2003-09-20
  • 打赏
  • 举报
回复
//要想在过滤事件中进行过滤,Filter需为空
frmBldcMain->ClientDataSet2->Filtered=false;
frmBldcMain->ClientDataSet2->Filter="";
frmBldcMain->ClientDataSet2->Filtered=true;

void __fastcall TfrmBldcMain::ClientDataSet2FilterRecord(TDataSet *DataSet,
bool &Accept)
{
TStringList *sList=new TStringList();
AnsiString tmpStr;

tmpStr=frmFindTag->txtEdit2->Text; //多条件过滤中间用,号分隔
//分隔过滤条件
while(tmpStr.Pos(",")>0)
{
if(tmpStr.Pos(",")!=1)
{
sList->Add(tmpStr.SubString(1,tmpStr.Pos(",")-1));
}
tmpStr=tmpStr.SubString(tmpStr.Pos(",")+1,tmpStr.Length());
}
if(tmpStr.Length()!=0)
{
sList->Add(tmpStr);
}

//参数名称
for (int i=0;i<sList->Count;i++)
{
Accept=DataSet->FieldByName("参数名称")->AsString.Pos(sList->Strings[i])>=1;
// Accept is true 表示当前记录是符合过滤条件的
if (!Accept)
break;
}

//参数描述
// if (!Accept)
// {
// for (int i=0;i<sList->Count;i++)
// {
// Accept=DataSet->FieldByName("参数描述")->AsString.Pos(sList->Strings[i])>=1;
// if (!Accept)
// break;
// }
// }

sList->Free();

}
//---------------------------------------------------------------------------
你自己改成delphi的吧,改不了再找我。
sncel 2003-09-20
  • 打赏
  • 举报
回复
晕,很简单的呀。
TOMWLD 2003-09-20
  • 打赏
  • 举报
回复
这个问题已经浪费了我400大元了
zhoutian618 2003-09-02
  • 打赏
  • 举报
回复
怎么我测试的是只能后面加通配符啊.

奇怪!
bodhi 2003-09-02
  • 打赏
  • 举报
回复
摆脱,楼上的朋友,你开心的太早了,你仔细测试一下再发帖子
tellyes 2003-08-23
  • 打赏
  • 举报
回复
我解决了,access数据库的字符串型字段到dephi中后都是twildestrinfield,需要把他们都一一改成tstringfield.这样就可以过滤了
具体修改方法如下:
1:双击adotable,在出来的东西里面右键,“add all fields”;
2:在form或moudle(即你放adotable的地方)右键,“vies as text”,把里面的所有的TWideStringField更改成TStringField,然后你再试试过滤中文,一定可以的了。

哈哈哈,开心,我又帮助别人了。
TOMWLD 2003-08-19
  • 打赏
  • 举报
回复
楼上的,那样子不合我的要求,那种情况我也声明过的
<<<
如果去掉开始的通配符的话,如 泉% 也可查到符合的内容
>>>
TOMWLD 2003-08-19
  • 打赏
  • 举报
回复
楼上的,那样子不合我的要求,那种情况我也声明过的
<<<
如果去掉开始的通配符的话,如 泉% 也可查到符合的内容
>>>
xgy88 2003-08-18
  • 打赏
  • 举报
回复
ClientDataSet1.Filter:='CustName like '+#39+'泉%'+#39
TOMWLD 2003-08-18
  • 打赏
  • 举报
回复
在d6和d7中均如此,d5中我没有试过

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧