2013-08-10 3 views
1

У меня есть таблица клиентов, и я хочу, чтобы фильтр в поле, выбранном пользователем, все поля таблицы, включенные в компонент combobox во время выполнения, если поле/элемент является строковым типом, независимо от типа пользователя в EdtSearch. текст работы фильтра, однако, если пользователь выбрал идентификатор, который Жар целого поля 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; 

что правильный способ, чтобы получить работу фильтра на целочисленном поле благодарственного-х

+3

Вы знаете о событии OnFilterRecord? Это даст вам больше контроля, чем строка фильтра. –

+0

Uwe Raabe спасибо, я попробую попробовать, прежде чем спросить здесь, но никто не указывает на событие OnFilterRecord. Некоторое решение сказал, что я должен добавить вычисленное поле asString и фильтрацию с ним, это решение не убедило меня .... –

+1

Вы тоже что вы не можете использовать подстановочные знаки 'LIKE' с числовыми полями? (Попытка фильтровать на номер 'LIKE 1 *' не имеет никакого смысла, но это также не является допустимым условием SQL или фильтра.) –

ответ

1

лучшее решением является использование OnFilterRecord события из документации:

OnFilterRecord события, генерируемого в наборе данных для каждой записи он извлекает

события имеет параметр по ссылке Accept, которые определяют, является ли запись (пример: включить его в DBGride) или нет, но вы не можете использовать подстановочный знак и другие функции фильтра фильтра.

Если ClientDataSet уже отфильтрован, вы должны изменить свойство на False, затем True в orde r, чтобы фильтр работал правильно.

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;