1

我有客户端表,如果字段/项目是字符串类型,无论用户在 EdtSearch.Text 中输入什么类型,我想过滤用户选择的字段上的表,所有表字段包含在组合框组件中。用户选择的 id 是 firebird 整数 auto_inc 字段获取异常:

Exception class EVariantTypeCastError with message 'Could not convert variant of type (OleStr) into type (Boolean)'.

代码:

procedure Tfrm_Personnes.EdtSearchChange(Sender: TObject);
var
  Pattern: string;
begin
  if CbxSearchOptions.Text = 'Commence' then Pattern := QuotedStr(EdtSearch.Text +     '*');
  if CbxSearchOptions.Text = 'Contient' then Pattern := QuotedStr('*' + EdtSearch.Text + '*');
  with TClientDataSet(dts_Tableau_Personnes.DataSet) do
  begin
    if EdtSearch.Text <> EmptyStr then
    begin
      Filter := DisplayToOriginName(dts_Tableau_Personnes, CbxField.Text)+' = ' +     Pattern;
      Filtered := True;
    end else
      Filtered := False;
  end;
end;

function DisplayToOriginName(DataSource: TDataSource; DisplayName: string): string;
var
  I: Integer;
begin
  with TClientDataSet(DataSource.DataSet) do
  for I := 0 to FieldCount - 1 do
  begin
    if SameStr(Fields[i].DisplayName, DisplayName) then
      Result  := Fields[i].FieldName;
  end;
end;

什么是让过滤器在整数字段上工作的正确方法谢谢

4

1 回答 1

1

最好的解决方案是使用文档中的 OnFilterRecord 事件:

数据集为其检索的每条记录生成的 OnFilterRecord 事件

该事件具有通过引用 Accept 确定是否接受记录的参数(例如:将其包含在 DBGride 中)但是您不能使用通配符和其他过滤方法功能

如果 ClientDataSet 已经过滤,那么您必须将属性更改为 False 然后 True 才能使过滤器正常工作。

procedure Tfrm_Personnes.EdtSearchChange(Sender: TObject);
begin
  MyClientDataSet.Filtered := False;
  MyClientDataSet.Filtered := True;
end;

procedure TDM_Tableau.cds_ClientsFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
var
  s, SubStr: string;
begin
  s := DataSet.FieldByName('ID_ClIENT').AsString;
  SubStr := frm_Clients.EdtSearch.Text;
  Accept := Pos(SubStr ,s) > 0;
end;
于 2013-08-10T23:22:23.630 回答