我有客户端表,我想在运行时过滤用户选择的字段上的表,如果字段/项是字符串类型,无论EdtSearch中的用户类型是什么。过滤器工作但是如果用户选择了firebird整数auto_inc字段的id获取异常:
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;
在整数字段上使用过滤器的正确方法是什么?
答案 0 :(得分: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;