bonsoir, s'ils vous plait je voudrai appliquer un filtre a plusieurs critères sur plusieurs table dans Delphi avec l'ADOQuery
![]()
bonsoir, s'ils vous plait je voudrai appliquer un filtre a plusieurs critères sur plusieurs table dans Delphi avec l'ADOQuery
![]()
Bonjour et bienvenue,
Vous avez du remarquer que j'ai déplacé votre discussion. Pourquoi ? parce que d'il s'agit d'un "filtre" et même s'il s'agit d'ADO , vous brancher à une vieille discussion n'est pas une bonne idée, ouvrir un nouveau sujet sur votre problème est une meilleure idée.
Pour ce qui est du "filtre" (personnellement j'ai horreur de ce terme), étant donné que vous utilisez une Query je pense qu'il est plus simple de bâtir une clause WHERE
mais pour cela, plutôt qu'un image écran de sélection de critères il aurait été mieux de fournir la structure de la table à interroger.
Avec le peu d'informations données, je propose quelque chose de ce genre (je pars du principe que les boite de choix sont en fait des DBLookupComboBox) :
Inconvénient de la seconde méthode, s'il s'agit de colonnes dates ou numériques flottantes cela pose des soucis : format des dates ou virgule décimale.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 procedure filtrer; Const SelectPart = ' SELECT * FROM LATABLE WHERE 1=1'; { le 1=1 permet d'obtenir tous les enregistrements mais dans ce cas surtout de ne pas avoir à gérer l'apparition de la clause WHERE, Tout filtre supplémentaire commence donc par un AND } begin ADoQuery1.Close; ADoQuery1.SQL.Text:=Selectpart; ... if Sexe.Checked then begin // deux choix, // utiliser des paramètres {1} ADoQuery.SQL.Add('AND COLSEXE=:S' ); // il faudra alors écrire ceci avant l'ouverture de la requête ADOQuery.Params.ParambyName('S').asxxxxxxx:=ComboBoxSexe.KeyValue; // ou utiliser une chaine (par exemple) {2} ADOQuery.SQ.Add(Format('AND SEXE=%s',[QuotedStr(ComboBoxSexe.KeyValue)]); // s'il s'agit d'une colonne texte {2'}ADOQuery.SQ.Add(Format('AND SEXE=%d',[ComboBoxSexe.KeyValue]); // s'il s'agit d'une colonne numérique (entier) end; ....// idem pour les autres critères ADOQuery.Active:=True; end;
Une autre technique consiste à implémenter l'évènement OnFilterRecord et du coup cela devient de la "simple" programmation
P.S. A propos d'informations données, il est bon d'indiquer aussi : la version de Delphi et le SGBD voire l'OS ,bien que dans ce cas cela ne joue pas vraiment cela pourrait être déterminant lors d'autres questions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure TMainForm.ADOQuery1FilterRecord(DataSet: TDataSet; var Accept: Boolean); begin Accept:=True; if Sexe.Checked then Accept:=Accept AND (ADOQuery.FieldByname('SEXE').asxxxx =ComboBoxSexe.KeyValue); if Wilaya.Checked then Accept:=Accept AND (ADOQuery.FieldByname('WILAYA').asxxxx =ComBoxWilaya.KeyValue; // à noter que ADOQuery1.FieldByname('Colonne') peut se remplacer par DataSet['Colonne'] .... end;
Bonjour,
Merci pour votre réponse, je dis dire que je n'en attendais pas vue la discussion est ancienne comme vous l'avais mentionné, je suis nouvelle alors j'ai pas sue comment faire, et encore merci...
Bon pour ce qui est des version que j'utilise c'est SQL Server 2008R2 et Delphi 7, voici la structure de mes tables:
Les boites de choix sont des TsComboBox, voici la méthode que j'ai utiliser:
Je ne sais pas comment ajouter les autres critères vue que quoique je fasse ça ne marche pas...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Procedure TFrameRechercheClients.sSpeedButton1Click(Sender: TObject); Begin Dm.QueryRech.Close; Dm.QueryRech.SQL.Clear; If Wilaya.Text <> '' Then Begin Dm.QueryRech.SQL.Add('Select * From Clients Where IdCommun '); Dm.QueryRech.SQL.Add(' In (Select IdCommun From Communes Where IdWilaya ='+QuotedStr(Wilaya.Text)+')'); If Cat.Text <> '' Then Begin Dm.QueryRech.SQL.Add('And CatCli='+QuotedStr(Cat.Text)); End; ...[/Je dois ajouter les autres critères] End Else Begin Dm.QueryRech.SQL.Add('Select * From Clients Where '); If Cat.Text <> '' Then Begin Dm.QueryRech.SQL.Add('CatCli='+QuotedStr(Cat.Text)); End; ... End;
Et encore merci
Re,
Il y a un problème dans votre code, trop de begin end else ....
je vous propose
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Procedure TFrameRechercheClients.sSpeedButton1Click(Sender: TObject); Begin Dm.QueryRech.Close; Dm.QueryRech.SQL.Clear; Dm.QueryRech.SQL.Add('Select * From Clients where 1=1'); If Wilaya.Text <> '' Then Begin // à revoir il faut éviter ce genre de SQL (clause IN) utiliser plutôt une jointure entre clients et communes Dm.QueryRech.SQL.Add('AND IDCOMMUN In (Select IdCommun From Communes Where IdWilaya ='+QuotedStr(Wilaya.Text)+')'); End If Cat.Text <> '' Then Begin Dm.QueryRech.SQL.Add('AND CatCli='+QuotedStr(Cat.Text)); End; ....
salut
pour moi le in n'est pas une bonne solution dans une requette SQL
il serait preferable de travailler avec le jointure directe pour ce faire nous avons besoin
des noms de table et des noms de propriete qui les relis
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 StSelect := 'Select CLI.* ' StFrom := ' From %S '; StTable := 'Clients CLI '; StWhere :='Where %S' If Wilaya.Text <> '' Then Begin StTable := StTable+',Communes COM'; StLien :=' CLI.IDCOMMUN = COM.IdCommun ' // à revoir il faut éviter ce genre de SQL (clause IN) utiliser plutôt une jointure entre clients et communes StLien :=StLien +Format(' And ( COM.IdWilaya = %s )',[QuotedStr(Wilaya.Text)]); End If Cat.Text <> '' Then if Trim(StLien ) = '' Then StLien := Format(' ( CLI.CatCli = %s )',[QuotedStr(Cat.Text)]); else StLien :=StLien +Format(' And ( CLI.CatCli = %s )',[QuotedStr(Cat.Text)]); .... StQuery := StSelect + Format(StFrom,[StTable ]) + Format(StWhere,[StLien]); Dm.QueryRech.SQL.Clear; Dm.QueryRech.SQL.Add(StQuery);
bonjour,
désolé pour le retard ..![]()
et merci pour vos repenses
voici comment j'ai fait et ça a marché
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 Dm.QueryRech.Close; Dm.QueryRech.SQL.Clear; If wilaya.Text <> '' then Begin If Dm.Wilayas.Locate('Wilaya', Wilaya.Text, [loCaseInsensitive]) Then Begin XWil := Dm.WilayasIdWilaya.AsInteger; End; Dm.QueryRech.SQL.Add('Select * From Clients Where IdCommun '); Dm.QueryRech.SQL.Add(' In (Select IdCommun From Communes Where IdWilaya =' +QuotedStr(inttostr(Xwil))+')'); If cat.Text <> '' Then Begin Dm.QueryRech.SQL.Add(' and catcli='+quotedStr(cat.Text)); End; If comm.Text <> '' Then Begin Dm.QueryRech.SQL.Add(' and idcommun in (select idcommun from communes where commune='+quotedstr(comm.Text)+')'); End; ... End Else Begin Dm.QueryRech.SQL.Add('Select * From Clients Where '); If cat.Text <> '' Then Begin Dm.QueryRech.SQL.Add(' catcli='+quotedStr(cat.Text)); End; If comm.Text <> '' Then Begin Dm.QueryRech.SQL.Add(' and idcommun in (select idcommun from communes where commune='+quotedstr(comm.Text)+')'); End; ... End ; Dm.QueryRech.Open;
et encore merci pour votre aide![]()
![]()
![]()
![]()
Partager