У меня есть таблица клиентов, и я хочу, чтобы фильтр в поле, выбранном пользователем, все поля таблицы, включенные в компонент 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;
что правильный способ, чтобы получить работу фильтра на целочисленном поле благодарственного-х
Вы знаете о событии OnFilterRecord? Это даст вам больше контроля, чем строка фильтра. –
Uwe Raabe спасибо, я попробую попробовать, прежде чем спросить здесь, но никто не указывает на событие OnFilterRecord. Некоторое решение сказал, что я должен добавить вычисленное поле asString и фильтрацию с ним, это решение не убедило меня .... –
Вы тоже что вы не можете использовать подстановочные знаки 'LIKE' с числовыми полями? (Попытка фильтровать на номер 'LIKE 1 *' не имеет никакого смысла, но это также не является допустимым условием SQL или фильтра.) –