2013-08-10 2 views
1

J'ai table client et je veux filtrer la table sur le champ choisi par l'utilisateur tous les champs de table inclus dans le composant combobox à l'exécution si le champ/item est type de chaîne quel que soit le type d'utilisateur dans EdtSearch. texte du travail de filtre si l'utilisateur a choisi l'identifiant qui est un entier firebird champ auto_inc get exception:Filtre sur champ entier

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

code:

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; 

quelle est la bonne façon de faire le travail de filtre sur le champ entier remercient

+3

Connaissez-vous l'événement OnFilterRecord? Cela vous donnera plus de contrôle que la chaîne de filtre. –

+0

Uwe Raabe merci je vais essayer je recherche avant de demander ici, mais aucun point à l'événement OnFilterRecord une solution a dit que je devrais ajouter champ calculé asString et le filtrage avec elle la solution ne m'a pas convaincu .... –

+1

Êtes-vous aussi sachant que vous ne pouvez pas utiliser les caractères génériques 'LIKE' avec des champs numériques? (Essayer de filtrer sur un nombre 'LIKE 1 *' n'aurait aucun sens, mais ce n'est pas non plus un SQL valide ou une condition de filtre.) –

Répondre

1

la meilleure solution est d'utiliser OnFilterRecord événement de la documentation:

événements OnFilterRecord générés par l'ensemble de données pour chaque enregistrement, il récupère

l'événement a paramètre par référence Accepter qui déterminent si l'enregistrement est accepté (Exemple: l'inclure dans le DBGride) ou non, vous ne pouvez pas utiliser de caractères génériques et autres fonctions de méthode de filtrage

Si le ClientDataSet est déjà filtré, vous devez changer la propriété à False puis True dans orde r pour que le filtre fonctionne correctement.

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; 
Questions connexes