Filtrage sur dbgrid

Signaler
-
 inginfo02 -
bonjour j'ai un probleme au filtrage sur un dbgrid aide moi si possible voici mon code:
procedure TFidentp.Edit3Change(Sender: TObject);
begin
Datamodule1.ADOmaladeadmis.Open;
Datamodule1.ADOmaladeadmis.Filtered:=false;
//if edit3.text<>''then
//begin
Datamodule1.ADOmaladeadmis.Filter:='Nom ='+Quotedstr(Edit3.text);
//Datamodule1.ADOmaladeadmis.Filter:='Nom'+Quotedstr((Edit3.text)+'*');
Datamodule1.ADOmaladeadmis.Filtered:= true;
// end;
end;

9 réponses

Messages postés
103
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
9 avril 2020
2
Bonjour,
Chaque changement de caractère dans le TEdit3 déclenche un évènement OnChange. Imagine ce qui se passe avec ton code!
Si tu veux appliquer un filtre sur un nom complet ce n'est pas dans cet évènement que le filtrage de ta table doit s'appliquer.
Je ne sais avec quelle version de Delphi tu travailles mais regardes dans les exemples tu devrais trouver ton bonheur

pierrot
merci pierrot pour ta réponse, je travaille avec delphi 5
quelle exemple j'ai pas comprit ce que tu dit quelle événement dit moi svp quelle est erreur dans mon code !?
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
9
Bonjour,
tu veux filtrer "table1" sur le champ "K1REC". pour cela tu utilise "Edit1" pour saisir ton filtre. exemple:
1 table1.filtered = true (toujours, ne change jamais)

2 Even table1.onfiltererecord:

procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
var filt : string;
lng : integer;
begin
filt := trim(edit1.text); // on vire les spaces en deb et fin de filtre
lng := length(filt); // longueur du filtre
// on prend le record si - filtre vide
// ou si les "lng" 1er char de K1REC = edit1.text
accept:= (lng=0)
or (filt = copy( table1.fieldbyname('k1REC').asstring, 1, lng));
end;

3 Even edit1.Onchange:
procedure TForm1.Edit1Change(Sender: TObject);
begin
// à chaque saisie on ferme et réouvre la table
if table1.active then table1.close;
table1.open;
end;

4 on n'utilise pas le champ table1.filter, qui n'est utile que dans des sélections simples.

Donc à chaque char saisi dans Edit1, tu réouvres table1.
qui pour chaque record, executera filterrecord qui acceptera ou pas.

Salut
solilog
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
9
Re salut,

Mieux vaut faire comme ca pour la proc edit1.onchange:

procedure TForm1.Edit1Change(Sender: TObject);
begin
table1.filtered := false;
table1.filtered := true;
end;

C'est pareil mais à l'écran c'est plus propre.
Tu y es maintenant. Bon courage.

solilog
Merci beaucoup solilog tu a vraiment ma aidé mais j'ai une question est ce que je fais la meme chose pour filtrer le prenom je travaille sur une base medical l'orsque je saisie le nom et prenom je voulait un filtre sur un dbgrid qui affiche les resultats
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
9
Si dans ta table, le champs contient nom et prénom ça marchera,
si c'est 2 champs, tu dois modifier ainsi:

accept:= (lng=0) // filtre vide
// ou les "lng" 1er char de (K1NOM + ' ' + K1PRE )= edit1.text
or (filt = copy( table1.fieldbyname('k1Nom').asstring + ' '
+ table1.fieldbyname('k1Pre').asstring , 1, lng));


peut-être ajouter des Uppercase si des prob de majuscule
le nom et prenom sont deux champs le filtrage sur le nom marche bien mais sur le prénon ne marche pas si possible donne moi le code complet voisi mon code:
procedure TDataModule1.ADOmaladeadmisFilterRecord(DataSet: TDataSet;
var Accept: Boolean);

var filt : string;
lng : integer;
begin
filt := trim(Fidentp.edit3.text);// on vire les spaces en deb et fin de filtre
//filt := trim(Fidentp.edit2.text);
lng := length(filt); // longueur du filtre
// on prend le record si - filtre vide
// ou si les "lng" 1er char de nom = edit3.text
accept:= (lng=0)
//or (filt = copy( datamodule1.adomaladeadmis.fieldbyname('Nom').asstring+ ' '
//+ datamodule1.ADOmaladeadmis.fieldbyname('Prénom').asstring, 1, lng));
or (filt = copy( datamodule1.adomaladeadmis.fieldbyname('Nom').asstring,
1, lng));
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
9
Là tu te débrouilles,
Tu as toutes les infos, faut bosser pas seulement attendre que les autres fassent ton boulot.
Tu as tout, réfléchis.
solilog
bon bonjour solilog j’attends pas que vous faire mon travaille et je suis ingénieur en informatique je travaille avec php et java je suis débutant en delphi c pour ça je pose les question mais c tu veut pas ma aidé c pas une problème merci.