the best solution is to use OnFilterRecord Event from the documentation:
OnFilterRecord events generated by the dataset for each record it retrieves
the event has parameter by reference Accept which determine whether the record is accepted (Example: include it in the DBGride) or not however you can't use wildcard character and other filter method features
If the ClientDataSet already filtered then you must change the property to False then True in order to make the filter work properly.
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;