Filtrage sur dbgrid

inginfo02 - 28 nov. 2012 à 10:54
 inginfo02 - 4 déc. 2012 à 08:26
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

pierrotk10d Messages postés 110 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 2 février 2024 3
30 nov. 2012 à 16:32
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
0
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 !?
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
2 déc. 2012 à 12:48
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
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
2 déc. 2012 à 13:08
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
2 déc. 2012 à 13:39
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
0
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));
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
2 déc. 2012 à 16:23
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
0
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.
0
Rejoignez-nous