[VBA] OpenForm avec filtre et GROU BY

mpom -  
 manon -
Bonjour,

Je travaille sur Access 2007 et je souhaite ouvrir un formulaire en appliquant un filtre et en regroupant mes entrées par ID

J'ai crée un premier formulaire qui me permet de sélectionner mes critères et un deuxième formulaire qui me permet de restituer mes résultats.

Grâce à une commande sur un bouton, je parviens à appliquer le filtre à mon formulaire de restitution mais mes résultats sont démultipliés à cause de l'utilisation des nouveaux champs de recherche Access 2007.

De façon simplifié, voici mon code

StDocName = "Contactos Consulta"
StSimpleCriteria = " "

If IsNull(Me![Diplomas]) = False Then StSimpleCriteria = "[Diplomas]=" & Me![Diplomas]
DoCmd.OpenForm StDocName, , , StSimpleCriteria

Si je choisis de modifier StSimpleCriteria en ajoutant à la fin GROUP BY [ID], Access me génère une erreur de compilation

J'ai aussi essayé de résoudre mon problème en créant toute une requête SQL

StFIltre = "SELECT [Diplomas], [ID] FROM [Contactos] WHERE " & StSimpleCriteria & " GROUP BY [ID]"
DoCmd.OpenForm StDocName
DoCmd.RunSQL (StFiltre)

Mais ça marche pas non plus

Est-ce que quelqu'un a une idée?

Merci de votre aide
Configuration: Windows XP
Firefox 2.0.0.14

3 réponses

  1. manon
     
    salut!
    j'ai le même problème que toi, as-tu trouvé une réponse?
    0
  2. mpom
     
    Bonjour,

    Je ne me souviens plus exactement comment je me suis débrouillée pour résoudre ce programme, mais voici mon code ci dessous.

    Au final ma requête est la suivante:
    stSQL = "SELECT * FROM Contactos WHERE " & StSimpleCriteria & " GROUP BY [ID] ORDER BY [ID]"

    Dis moi si ça t'aide sinon envoi moi un mail, il est possible que ça soit dans les propriétés du formulaire de restitution (mon access est en espagnol alors je t'enverrais des copies d'écran pour ne pas faire d'erreur de traduction)

    Dans mon formulaire de critères de recherche, il y a plusieurs champs et un bouton CHERCHER
    Lorsque je clique sur ce bouton, voilà le code que j'ai mis en place
    ' Prise en compte dans le filtre, uniquement des champs simples non null
    ' Ajout de la commande AND lorsque le filtre contient déjà un critère
    ' Pas de commande AND lorsque le filtre ne contient pas d'autre critère
    ' Le diplome étant le premier critère qui est vérifié pas besoin d'appeler la fonction Verif_And (voir code de la fonction à la fin en PS

    Option Compare Database
    Public StDocName As String
    Public StSimpleCriteria As String
    Public StFiltre As String
    Public stSQL As String
    Public StVar As String
    Public Var2 As Variant

    StDocName = "Resultado de busquedad"
    ´Correspond au formulaire de restitution des résultats
    StSimpleCriteria = " "
    StVar = " "

    If IsNull(Me![Diplomas]) = False Then StSimpleCriteria = "[Diplomas]=" & Me![Diplomas]

    ' Vérifie si le candidat a déjà été descartado ou non
    If Me![Descartado] <> "Tous" Then
    If Me![Descartado] = "Oui" Then StVar = "[Descartado]= True" Else: StVar = "[Descartado]= False"
    Else: StVar = " "
    End If
    Verif_And

    'Vérifie su le candidat a déjà de l'expérience dans un cabinet de conseil
    If Me![¿En consultoría?] <> "Tous" Then
    If Me![¿En consultoría?] = "Oui" Then StVar = "[¿En consultoría?]= True" Else: StVar = "[¿En consultoría?]= False"
    End If
    Verif_And

    ' La réinitialisation de StVar est nécessaire pour pouvoir effectuer le test Verif_And correctement
    StVar = " "
    If IsNull(Me![Idioma 2]) = False Then StVar = "([Idioma 1]=" & Me![Idioma 2] & " OR [Idioma 2]= " & Me![Idioma 2] & " OR [Idioma 3]= " & Me![Idioma 2] & ")"
    Verif_And

    StVar = " "
    If IsNull(Me![Nivel de Experiencia]) = False Then StVar = "[Nivel de experiencia]= " & Me![Nivel de Experiencia]
    Verif_And

    stSQL = "SELECT * FROM Contactos WHERE " & StSimpleCriteria & " GROUP BY [ID] ORDER BY [ID]"

    If StSimpleCriteria <> " " Then
    StVar2 = DCount("ID", "Contactos", StSimpleCriteria)
    If StVar2 > 0 Then
    MsgBox (StVar2 & " candidats trouvés avec les critères sélectionnés")
    DoCmd.OpenForm StDocName
    DoCmd.ApplyFilter stSQL
    Else:
    MsgBox ("Aucun candidat ne correspond à vos critères, veuillez faire une autre recherche")
    Comando50_Click
    End If
    Else: MsgBox ("Veuillez indiquer vos critères de recherche")
    End If

    End Sub

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    La fonction Verif_And est très importante pour construire ma requête:

    Sub Verif_And()

    ' Cette fonction permet de vérifier et de rajouter la commande AND lorsque le filtre contient déjà un critère
    ' Elle sera appelée à chaque fois qu'il faut ajouter un critère dans filtre

    If StSimpleCriteria <> " " Then
    If StVar <> " " Then StSimpleCriteria = StSimpleCriteria & " AND " & StVar
    Else: If StVar <> " " Then StSimpleCriteria = StVar
    End If

    End Sub
    0
  3. manon
     
    je vois ce que tu veux dire mais j'ai l'impression que ma situation est un peu plus complexe, je m'explique :

    j'ai une table cahier et une table feuille
    chaque cahier peut contenir plusieurs feuilles
    chaque feuille peut être de n'importe quelle couleur

    grace a des cases a cocher, je choisis la(les) couleur(s) des feuilles qui m'interesse(nt)
    ce sont les cahiers qui contiennent ces feuilles qui doivent être affichés

    si un cahier contient une feuille jaune et une feuille rouge, ce cahier sera affiché deux fois et ainsi de suite...

    je pensais regrouper par id_cahier mais j'ai peur que ma recherche ne prenne plus en compte la totalité des feuilles

    qu'en pensez-vous?

    Private Sub FiltrageParCouleur()

    Dim sClauseWhere As String

    sClauseWhere = "(CouleurParam = 'bidon'" ' cas qui n'existe pas, c'est juste pour le OR d'après
    If chkRouge Then
    sClauseWhere = sClauseWhere + " OR CouleurParam = 'Rouge'"
    End If
    If chkJaune Then
    sClauseWhere = sClauseWhere + " OR CouleurParam = 'Jaune'"
    End If
    If chkVert Then
    sClauseWhere = sClauseWhere + " OR CouleurParam = 'Vert'"
    End If
    If chkBlanc Then
    sClauseWhere = sClauseWhere + " OR CouleurParam = 'Blanc'"
    End If

    sClauseWhere = sClauseWhere + ")"

    DoCmd.ApplyFilter , sClauseWhere
    Me.Refresh

    End Sub
    0