我在ADOQuery中添加了一个计算字段,字段名为:货物简码,
然后在 计算事件里加入如下代码:
  ADOQuery1.FieldByName('货物简码').AsString:=
      GetHeadPyOfHz(ADOQuery1.FieldByName('货物名称').AsString);
// GetHeadPyOfHz 的功能是得到指定汉字的拼音首字母。
然后我再在其他地方设置过滤条件,如下:
  ADOQuery1.Filter:='货物简码 like ''%'+Edit1.Text+'%''';
  ADOQuery1.Filtered:=True;
结果却发生错误:项目在所需的名称或序数的集合中未被发现!我在查看资料时看到 TDataSet 有一个保护属性:InternalCalcFields 而且是只读的。
它表示内部计算的字段是否包含在数据集中。
我想,既然有这么个属性,那么是不是我添加的计算字段没有包含在数据集中,
从而才发生这样的错误呢?
那么问题又来了,如何才能访问到这个既是保护又是只读的属性呢?总之我的目的是用我创建的计算字段进行过滤操作,只要解决这个问题就万事OK!
当然这个问题不能用SQL的方法来解决,因为这样的话,ADOQuery1要频繁的打开关闭,
速度很慢,就不能在Edit1的OnChange事件中适时的过滤。

解决方案 »

  1.   

    ADOQuery1.Filter:='货物名称 like '+GetHeadPyOfHz(Edit1.Text)+'%'
      

  2.   

    FILTER 不支持 LIKE,动态添加SQL语句吧sql.add('货物名称 like '''+GetHeadPyOfHz(Edit1.Text)+'%''');
      

  3.   

    filter不支持like,你如果想实现like这样的filter可以如下处理:
    1.ADOQuery1.onFilterRecord中加入以下代码:
    begin
      with ADOQuery1 do
        begin
        if Pos(GetHeadPyOfHz(Edit1.Text) ,fieldByName('货物名称').asString)>0 then
          accept:=true
        end;
    end;
    2.ADOQuery1.filtered:=true;//设置使打开。
    ADOQuery1.close;
    ADOQuery1.open;
    这样写就可以了
      

  4.   

    Filter 怎么会不支持 like !!? 我经常用啊!!!大家好像对我的意思有所误解! 
    在我的数据库里,货物名称自段是一些汉字,如:“三极管”、“接触器”等,
    我是想通过计算自段,计算出货物名称的简码,如:“三极管”简码:SJG;“接触器”简码:JCQ
    然后,在Edit1里 输入简码,如输入“JCQ”,就过滤出货物名称是“接触器”的记录,这样就给用户极大的方便,只需要输入货物名称的拼音首字母,就可以检索出这个货物。非常方便。现在的问题是:我在Filter里引用我创建的计算自段时出错!
    我总不能在Filter里这样写吧:Filter:=GetHeadPyOfHz(货物名称)like ...
      

  5.   

    谢谢大家!我已经用dickeybird888(于伟刚)老兄的办法解决了问题!