今天碰到一个怪现象:设置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

解决方案 »

  1.   

    在d6和d7中均如此,d5中我没有试过
      

  2.   

    ClientDataSet1.Filter:='CustName like '+#39+'泉%'+#39
      

  3.   

    楼上的,那样子不合我的要求,那种情况我也声明过的
    <<<
    如果去掉开始的通配符的话,如 泉% 也可查到符合的内容
    >>>
      

  4.   

    楼上的,那样子不合我的要求,那种情况我也声明过的
    <<<
    如果去掉开始的通配符的话,如 泉% 也可查到符合的内容
    >>>
      

  5.   

    我解决了,access数据库的字符串型字段到dephi中后都是twildestrinfield,需要把他们都一一改成tstringfield.这样就可以过滤了
    具体修改方法如下:
        1:双击adotable,在出来的东西里面右键,“add all fields”;
        2:在form或moudle(即你放adotable的地方)右键,“vies as text”,把里面的所有的TWideStringField更改成TStringField,然后你再试试过滤中文,一定可以的了。哈哈哈,开心,我又帮助别人了。
      

  6.   

    //要想在过滤事件中进行过滤,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的吧,改不了再找我。
      

  7.   

    做一下广告。
    http://snpack.fykj.com
      

  8.   

    如果字段的类型是ftstring就不会不现问题,但如果是ftwidestring就不行了
      

  9.   

    我的解决方法(暂时只支持一个字段):
      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;
      

  10.   

    不好意思,漏了一个函数
    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;