我用ACCESS数据库 客户端用ADOQuery1+DataSetProvider1+ClientDataSet1+DataSource1+DBGridEh1 关联好后我想用DBGridEh1自带的筛选功能(也就是在头部输入关键字然后按回车,他就会自动筛选出记录),但我输入条件按回车后他提示“Type mismatch in expression”,但如果我把中间层去掉ADOQuery1+DataSource1+DBGridEh1 按这样的结构来设置他又可以正常的筛选出记录,这是为何?是不是中间层要设置什么地方呀,麻烦各位大哥帮看看,小弟万分感谢

解决方案 »

  1.   

    你要在uses部分加入單元:EhLibCDS
      

  2.   

    to Oraclers
    我加了EhLibCDS还是不行呀,他还是报“Type mismatch in expression”,我筛选数字字段又可以,筛选字符字段就不行,麻烦再帮看看,万分感谢
      

  3.   

    字符型字段过滤条件是怎么输入的?是否加入了单引号?如='abc'.
      

  4.   

    用了ClientDataSet的filter的属性吗,这里有个clientdataset的bug,没办法解决的,
    我遇到过。
      

  5.   

    to xujin3000我把filtered 设置成了 true,是跟这个有关系吗?但不设置成true是不能筛选的呀,有没有什么其他的解决方法
      

  6.   

    http://topic.csdn.net/u/20110506/18/2ba968db-bc49-48fe-a502-ef919b50f065.html?79315
    麻烦看看我这个帖子,可以的话请指点一二。怎么实现的筛选呀?
      

  7.   

    to as8876
    我知道怎么设置呀,如果我直接用ADOQuery1+DataSource1+DBGridEh1连接是可以正常赛选的,但如果 ADOQuery1+DataSetProvider1+ClientDataSet1+DataSource1+DBGridEh1就会报“Type mismatch in expression“错误,(这种模式用sql server数据库是正常的,但用access就不正常了,而且更奇怪的是赛选数字是正常的,但筛选字符串就会提示“Type mismatch in expression“)。麻烦各位再帮我想想,谢谢!
      

  8.   

    to zhihui521
    输入的字符没问题,只要把中间层去掉一切筛选就很正常了
      

  9.   

    你在窗体最后面加上这句代码试下,
    initialization
      DBGridEhCenter.FilterEditCloseUpApplyFilter := True;
      

  10.   

    to jiangxmsoft
    还是不行呀
      

  11.   

    string的前面要加"="DBGridEh.pas:function TSTColumnFilterEh.ParseExpression(Exp: String): String;
    begin
      if (Column.Field <> nil) then
        FExpression.ExpressionType := STFldTypeMapEh[Column.Field.DataType];
      if (Column.KeyList.Count > 0) and (Column.PickList.Count > 0) then
        FExpression.ExpressionType := botString;
      ParseSTFilterExpressionEh(Exp, FExpression);
      CheckRecodeKeyList(FExpression);
      Result := GetExpressionAsString;
    end;进入ParseSTFilterExpressionEh(Exp, FExpression)这个过程内部看看就明白了
      

  12.   

    不想输入等号的话
    就改一下DbUtilsEh.pasParseSTFilterExpressionEh(Exp, FExpression)
    ...
    begin
      
      ...
      if op = foValue then
      begin
        if VarIsArray(v) then
          FExpression.Operator1 := foIn
        //else if FExpression.ExpressionType = botString then
        //  FExpression.Operator1 := foLike
        else
          FExpression.Operator1 := foEqual;
        FExpression.Operand1 := v;
      end
      ...end;