Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/09/2011, 11h07   #1
Membre habitué
 
quentin massé
Inscription : janvier 2010
Messages : 251
Détails du profil
Informations personnelles :
Nom : quentin massé
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2010
Messages : 251
Points : 125
Points : 125
Par défaut aide à la réalisation de filtre

Bonjour,

Comme le dis le titre j'aurai besoin d'aide pour faire mes filtre.

J'ai un formulaire qui comporte 2 case à cocher.
L'une pour des filtre en cascade et l'autre pour des filtre unique.

Prenons le premier cas les filtre en cascade.
Lorsqu'il clic dessus 5 listes déroulante s'affiche.
(Poste certu, Sous poste certu, Poste MOA, Sous Poste MOA et Désignation).

On pourra sélectionner soit:
_Poste certu, Sous poste certu
_Poste Certu, Sous poste Certu et Désignation
_Poste MOA, Sous Poste MOA
_Poste MOA,SOUS poste MOA et Désignation

Ce qui nous fait 4 requête différente.
Je voudrai selon les choix des lsite créer une requête pour m'afficher les résultat.

Je pensais faire les 4 choix possible en vba et selon si les liste sont vide ou pas créer la requête.

Expl:

sSQL="Select...." (Choix1)
sSQL1="..." (choix 2)
Etc

Et ensuite selon si les lsite sont vide ou pas affecter le bon sSQL a ma création de requête.

Mais je trouve ca lourd.
Y a t'il un moyen d'optimalisé mon besoin?

Merci
rob1son76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 11h17   #2
Membre habitué
 
quentin massé
Inscription : janvier 2010
Messages : 251
Détails du profil
Informations personnelles :
Nom : quentin massé
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2010
Messages : 251
Points : 125
Points : 125
La deuxième case à cocher permet d'afficher les mêmes liste déroulante (mais non liés entre elle cette fois).

On pourra alors choisir soit le poste certu, MOA, le Sous Poste ou la Désignation
Soit en choisir plusieurs voir toute.

Et dans ce cas la prévoir tous les cas possible risque d'être très long et pas très optimal.

Je n'arrive pas a trouver la solution pour créer mon "where" selon les choix possible.

J'avais pensé (et c'est la que je me dis que ma réflexion n'est peut être pas la bonne) de mettre dans un tableau les valeur des liste sélectionné et de les mettre dans une variable texte en disant que si le tableau est vide ma variable text est vide, si le tableau ne comporte qu'une ligne ma variable text prend la valeur du tableau jusque la ca va) mais si il y a plusieurs valeurs je doit mettre le "AND" entre chaque valeur.

Je sais que ce n'est pas très claire car ca ne l'est pas dans ma tête .
En faite je cherche une réflexion plus qu'une solution pour résoudre mon problème de filtre le plus optimal possible.

Merci pour vos suggestions.
rob1son76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 14h54   #3
Membre habitué
 
quentin massé
Inscription : janvier 2010
Messages : 251
Détails du profil
Informations personnelles :
Nom : quentin massé
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2010
Messages : 251
Points : 125
Points : 125
Bon pour que vous compreniez mieux voici comment j'ai fait pour le premier cas (cas des listes en cascade)

lmd_PC: liste déroulante du poste certu
lmd_SPC: liste déroulante du sous poste certu (dépend du choix du poste certu)
lmd_PMOA: liste déroulante du poste MOA
lmd_SPMOA: liste déroulante du sous poste MOA (dépend du poste MOA)
Lmd_D: liste déroulante de la désignation (dépend de Lmd_SPC ou de lmd_SPMOA)

Lmd_PC et Lmd_PMOA ne peuvent être sélectionné ensemble.

Code :
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Private Sub Commande25_Click()
 
Dim C, SC, M, SM, D As String
 
If Nz(Me.Lmd_PC, "") <> "" And Nz(Me.Lmd_SPC, "") = "" Then
MsgBox ("Veuillez saisir un sous poste certu ou cocher la case filtre unique")
Exit Sub
End If
 
If Nz(Me.Lmd_PMOA, "") <> "" And Nz(Me.Lmd_SPMOA, "") = "" Then
MsgBox ("Veuillez saisir un sous poste MOA ou cocher la case filtre unique")
Exit Sub
End If
 
If Nz(Me.Lmd_PC, "") <> "" Then
    C = Me.Lmd_PC.Column(1)
Else
 C = "Vide"
End If
 
If Nz(Me.Lmd_SPC, "") <> "" Then
    SC = Me.Lmd_SPC.Column(1)
Else
 SC = "Vide"
End If
 
If Nz(Me.Lmd_PMOA, "") <> "" Then
    M = Me.Lmd_PMOA.Column(1)
Else
 M = "Vide"
End If
 
If Nz(Me.Lmd_SPMOA, "") <> "" Then
    SM = Me.Lmd_SPMOA.Column(1)
Else
 SM = "Vide"
End If
 
If Nz(Me.Lmd_D, "") <> "" Then
    D = Me.Lmd_D.Column(1)
Else
 D = "Vide"
End If
 
 
sSQL = " SELECT Tbl_Modif_Data.Num_Certu2, Tbl_Modif_Data.Nom_Certu2, Tbl_Modif_Data.Montant_PCertu2, Tbl_Modif_Data.ID_SP_Certu2, Tbl_Modif_Data.Nom_SP_Certu2, Tbl_Modif_Data.Montant_SP_Certu2, Tbl_Modif_Data.ID_PMOA2, Tbl_Modif_Data.Nom_PMOA2, Tbl_Modif_Data.Montant_PMOA2, Tbl_Modif_Data.ID_SPMOA2, Tbl_Modif_Data.Nom_SPMOA2, Tbl_Modif_Data.Montant_SPMOA2, Tbl_Modif_Data.ID_Desig2, Tbl_Modif_Data.Nom_Desig2, Tbl_Modif_Data.Montant_Desig2, Tbl_Modif_Data.CE2, Tbl_Modif_Data.Etape2, Tbl_Modif_Data.Indice2, Tbl_Modif_Data.ID_Data2, Tbl_Modif_Data.Unité2, Tbl_Modif_Data.PU2, Tbl_Modif_Data.Qté2, Tbl_Modif_Data.Peraleas2, Tbl_Modif_Data.Remarque2, Tbl_Modif_Data.Offreur2"
sSQL = sSQL & " FROM Tbl_Modif_Data"
sSQL = sSQL & " WHERE (((Tbl_Modif_Data.Nom_Certu2)='" & C & "') AND ((Tbl_Modif_Data.Nom_SP_Certu2)='" & SC & "'));"
 
sSQL1 = " SELECT Tbl_Modif_Data.Num_Certu2, Tbl_Modif_Data.Nom_Certu2, Tbl_Modif_Data.Montant_PCertu2, Tbl_Modif_Data.ID_SP_Certu2, Tbl_Modif_Data.Nom_SP_Certu2, Tbl_Modif_Data.Montant_SP_Certu2, Tbl_Modif_Data.ID_PMOA2, Tbl_Modif_Data.Nom_PMOA2, Tbl_Modif_Data.Montant_PMOA2, Tbl_Modif_Data.ID_SPMOA2, Tbl_Modif_Data.Nom_SPMOA2, Tbl_Modif_Data.Montant_SPMOA2, Tbl_Modif_Data.ID_Desig2, Tbl_Modif_Data.Nom_Desig2, Tbl_Modif_Data.Montant_Desig2, Tbl_Modif_Data.CE2, Tbl_Modif_Data.Etape2, Tbl_Modif_Data.Indice2, Tbl_Modif_Data.ID_Data2, Tbl_Modif_Data.Unité2, Tbl_Modif_Data.PU2, Tbl_Modif_Data.Qté2, Tbl_Modif_Data.Peraleas2, Tbl_Modif_Data.Remarque2, Tbl_Modif_Data.Offreur2"
sSQL1 = sSQL1 & " FROM Tbl_Modif_Data"
sSQL1 = sSQL1 & " WHERE (((Tbl_Modif_Data.Nom_Certu2)='" & C & "') AND ((Tbl_Modif_Data.Nom_SP_Certu2)='" & SC & "') AND ((Tbl_Modif_Data.Nom_Desig2)='" & D & "'));"
 
sSQL2 = " SELECT Tbl_Modif_Data.Num_Certu2, Tbl_Modif_Data.Nom_Certu2, Tbl_Modif_Data.Montant_PCertu2, Tbl_Modif_Data.ID_SP_Certu2, Tbl_Modif_Data.Nom_SP_Certu2, Tbl_Modif_Data.Montant_SP_Certu2, Tbl_Modif_Data.ID_PMOA2, Tbl_Modif_Data.Nom_PMOA2, Tbl_Modif_Data.Montant_PMOA2, Tbl_Modif_Data.ID_SPMOA2, Tbl_Modif_Data.Nom_SPMOA2, Tbl_Modif_Data.Montant_SPMOA2, Tbl_Modif_Data.ID_Desig2, Tbl_Modif_Data.Nom_Desig2, Tbl_Modif_Data.Montant_Desig2, Tbl_Modif_Data.CE2, Tbl_Modif_Data.Etape2, Tbl_Modif_Data.Indice2, Tbl_Modif_Data.ID_Data2, Tbl_Modif_Data.Unité2, Tbl_Modif_Data.PU2, Tbl_Modif_Data.Qté2, Tbl_Modif_Data.Peraleas2, Tbl_Modif_Data.Remarque2, Tbl_Modif_Data.Offreur2"
sSQL2 = sSQL2 & " FROM Tbl_Modif_Data"
sSQL2 = sSQL2 & " WHERE (((Tbl_Modif_Data.Nom_PMOA2)='" & M & "') AND ((Tbl_Modif_Data.Nom_SPMOA2)='" & SM & "'));"
 
sSQL3 = " SELECT Tbl_Modif_Data.Num_Certu2, Tbl_Modif_Data.Nom_Certu2, Tbl_Modif_Data.Montant_PCertu2, Tbl_Modif_Data.ID_SP_Certu2, Tbl_Modif_Data.Nom_SP_Certu2, Tbl_Modif_Data.Montant_SP_Certu2, Tbl_Modif_Data.ID_PMOA2, Tbl_Modif_Data.Nom_PMOA2, Tbl_Modif_Data.Montant_PMOA2, Tbl_Modif_Data.ID_SPMOA2, Tbl_Modif_Data.Nom_SPMOA2, Tbl_Modif_Data.Montant_SPMOA2, Tbl_Modif_Data.ID_Desig2, Tbl_Modif_Data.Nom_Desig2, Tbl_Modif_Data.Montant_Desig2, Tbl_Modif_Data.CE2, Tbl_Modif_Data.Etape2, Tbl_Modif_Data.Indice2, Tbl_Modif_Data.ID_Data2, Tbl_Modif_Data.Unité2, Tbl_Modif_Data.PU2, Tbl_Modif_Data.Qté2, Tbl_Modif_Data.Peraleas2, Tbl_Modif_Data.Remarque2, Tbl_Modif_Data.Offreur2"
sSQL3 = sSQL3 & " FROM Tbl_Modif_Data"
sSQL3 = sSQL3 & " WHERE (((Tbl_Modif_Data.Nom_PMOA2)='" & M & "') AND ((Tbl_Modif_Data.Nom_SPMOA2)='" & SM & "') AND ((Tbl_Modif_Data.Nom_Desig2)='" & D & "'));"
 
 
If testQuery("Rqt_Modif_Data_Filtre") = True Then
DoCmd.DeleteObject acQuery, "Rqt_Modif_Data_Filtre"
End If
 
        If C <> "Vide" And SC <> "Vide" And M = "Vide" And SM = "Vide" And D = "Vide" Then
            CurrentDb.CreateQueryDef "Rqt_Modif_Data_Filtre", sSQL
        ElseIf C <> "Vide" And SC <> "Vide" And M = "Vide" And SM = "Vide" And D <> "Vide" Then
            CurrentDb.CreateQueryDef "Rqt_Modif_Data_Filtre", sSQL1
        ElseIf C = "Vide" And SC = "Vide" And M <> "Vide" And SM <> "Vide" And D = "Vide" Then
            CurrentDb.CreateQueryDef "Rqt_Modif_Data_Filtre", sSQL2
        ElseIf C = "Vide" And SC = "Vide" And M <> "Vide" And SM <> "Vide" And D <> "Vide" Then
            CurrentDb.CreateQueryDef "Rqt_Modif_Data_Filtre", sSQL3
        End If
 
End Sub
Donc comme vous le voyez j'ai du faire mes 4 requêtes en sql et choisir la bonne selon le cas.
Ce qui est long.
Ici ca va encore car il n'y a que 4 choix possible.
Mais dans mon deuxième cas, les 5 listes déroulante (les même qu'ici) ne sont pas liées entre elle.
Donc il y a 5!(5 factoriel) cas (dsl jsuis pas sur du nombre).
Autant dire que c'est relou voir même très très chiant à écrire de la même manière que le cas ci-dessus.

Avez vous une idée pour optimaliser mon code?

Merci
rob1son76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 17h07   #4
Nouveau Membre du Club
 
Homme Mickaël
Dessinateur industriel
Inscription : décembre 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Industrie

Informations forums :
Inscription : décembre 2010
Messages : 61
Points : 31
Points : 31
Bonjour,

Je pense m'être confronté à un problème plus ou moins similaire.
Je ne sais pas si c'est une bonne manière de faire ou non. Cela dit, j'ai fais en sorte de créer ma requête en plusieurs petites parties paramétrées.

Je m'explique avec un peu de code..

Cette partie me définit la base de ma requête en fonction d'une combinaison de choix fait dans plusieurs combobox:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
Dim Querry as string
Dim Req as string
 
Select Case Querry
    Case "FamilleIP"
        cbCategorie.Visible = True
        lblCategorie.Visible = True
        PNRacine = DLookup("Code", "Famille", "ID= " & cbFamille.Value & "")
        lblPN.Caption = PNRacine
        Req = "SELECT PN, Status, Standard FROM Piece WHERE PN like '" & PNRacine & "*'"
        CreateAttribut = 0
    Case "Famille"
        cbCategorie.Visible = False
        lblCategorie.Visible = False
        cbSousCategorie.Visible = False
        lblSousCategorie.Visible = False
        PNEntite = DLookup("Code", "Famille", "ID= " & cbFamille.Value & "") & "10"
        lblPN.Caption = PNEntite
        Req = "SELECT PN, Status, Standard FROM Piece WHERE PN like '" & PNEntite & "*'"
        CodeFamille = cbFamille.Value
        CreateAttribut = 1
Je viens ensuite contrôler l'état de cases à cocher me servant de filtre:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Select Case chkOld
    Case -1         'coché
        Old = " AND Status = -1"
    Case 0          'décoché
        Old = " AND Status = 0"
End Select
 
Select Case chkStd
    Case -1         'coché
        Std = " AND Standard = -1"
    Case 0          'décoché
        'Std = " AND Standard = 0"
End Select
Je viens ensuite concaténer l'ensemble pour former ma requête:

Code :
lbPiece.RowSource = Req & Old & Std & " ORDER BY PN;"
Je ne suis pas sur que cette manière de faire réponde bien à ta demande et soit la plus judicieuse, mais dans mon cas, ça m'a bien aidé. En espérant que ça puisse au moins te faire avancer dans ta réflexion.

Cordialement,
Mickaël
Vhalar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 09h33   #5
Membre habitué
 
quentin massé
Inscription : janvier 2010
Messages : 251
Détails du profil
Informations personnelles :
Nom : quentin massé
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2010
Messages : 251
Points : 125
Points : 125
Merci Vhalar.

Je vais regarder ton code avec attention.
Pendant le we j'ai trouvé la solution à mon problème.
En faite selon si les liste déroulante sont vide ou pas je créé une variable qui récupère le nom de la liste déroulante (le même que celle du champs de la table correspondante) ainsi que sa valeur.
J'obtiens donc une variable texte qui correspond a mon where de ma requête sql.

Code :
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
Dim tab0, a, t, t1 As String
Dim b As Variant
Dim ctrl As Control
Dim i As Integer
i = 0
 
    For Each ctrl In Me.Controls
    If ctrl.Name Like "Mod*2" Then
        If Nz(ctrl.Value, "") <> "" Then
        a = ctrl.Name
        b = Split(a, "-")
        i = i + 1
            If i = 1 Then
            tab0 = "((Tbl_Modif_Data." & b(1) & ")=" & "'" & ctrl.Value & "')"
            Else
            tab0 = tab0 & " AND " & "((Tbl_Modif_Data." & b(1) & ")=" & "'" & ctrl.Value & "')"
            End If
        End If
    End If
    Next
 
sSQL = " SELECT Tbl_Modif_Data.Num_Certu2, Tbl_Modif_Data.Nom_Certu2, Tbl_Modif_Data.Montant_PCertu2, Tbl_Modif_Data.ID_SP_Certu2, Tbl_Modif_Data.Nom_SP_Certu2, Tbl_Modif_Data.Montant_SP_Certu2, Tbl_Modif_Data.ID_PMOA2, Tbl_Modif_Data.Nom_PMOA2, Tbl_Modif_Data.Montant_PMOA2, Tbl_Modif_Data.ID_SPMOA2, Tbl_Modif_Data.Nom_SPMOA2, Tbl_Modif_Data.Montant_SPMOA2, Tbl_Modif_Data.ID_Desig2, Tbl_Modif_Data.Nom_Desig2, Tbl_Modif_Data.Montant_Desig2, Tbl_Modif_Data.CE2, Tbl_Modif_Data.Etape2, Tbl_Modif_Data.Indice2, Tbl_Modif_Data.ID_Data2, Tbl_Modif_Data.Unité2, Tbl_Modif_Data.PU2, Tbl_Modif_Data.Qté2, Tbl_Modif_Data.Peraleas2, Tbl_Modif_Data.Remarque2, Tbl_Modif_Data.Offreur2"
sSQL = sSQL & " FROM Tbl_Modif_Data"
sSQL = sSQL & " WHERE ("
sSQL = sSQL & "" & tab0 & "" & ");"
 
If testQuery("Rqt_Modif_Data_Filtre") = True Then
DoCmd.DeleteObject acQuery, "Rqt_Modif_Data_Filtre"
CurrentDb.CreateQueryDef "Rqt_Modif_Data_Filtre", sSQL
ElseIf testQuery("Rqt_Modif_Data_Filtre") = False Then
CurrentDb.CreateQueryDef "Rqt_Modif_Data_Filtre", sSQL
End If
Pour le "AND" (c'est ce qui posait problème) je me sert d'un compteur.
Si celui si est a 1 je ne met pas de "AND" sinon j'en met 1 avant ma variable texte.

Merci encore pour ton aide.
rob1son76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h15.


 
 
 
 
Partenaires

Hébergement Web