IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Procédure multiparamètres utilisé pour plusieurs formulaires


Sujet :

VBA Access

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut Procédure multiparamètres utilisé pour plusieurs formulaires
    Bonjour...
    Voici mon problème:
    J'ai créé une procédure que j'aimerai utiliser plusieurs fois dans mes différents formulaires.
    La procédure reçoit en paramètres le nom de la table, le nom du formulaire, et du sous formulaire(non lié au formulaire) afin d'exécuter une recherche.J'ai mis ma procédure dans un module et j'ai des erreurs de compilation(Erreur de compilation:Erreur de Syntaxe) lors de l'appel de cette procédure dans le formulaire.
    Voici le code dans mon module:

    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
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    Public Sub P_RefreshQuery(NomTable As String, NomForm As String, NomSousForm As String)
     
    Dim SQL As String
    Dim SQLWhere As String
    Dim strSQL As String
    Dim premier As Boolean
     
    premier = True
     
     
    SQL = "SELECT * FROM " & NomTable & ""
     
        If Forms! & NomForm & .Form.chkDefectueux Then
            If premier Then
                SQL = SQL & " WHERE " & NomTable & "!STATUT = 2"
                premier = False
            Else
                SQL = SQL & " or " & NomTable & "!STATUT = 2"
            End If
        End If
     
         If Forms! & NomForm & .Form.chkStock Then
            If premier Then
                SQL = SQL & " WHERE " & NomTable & "!STATUT = 3"
                premier = False
            Else
                SQL = SQL & " or " & NomTable & "!STATUT = 3"
            End If
        End If
     
        If Forms! & NomForm & .Form.chkTransfert Then
            If premier Then
                SQL = SQL & " WHERE " & NomTable & "!STATUT = 4"
                premier = False
            Else
                SQL = SQL & " or " & NomTable & "!STATUT = 4"
            End If
        End If
     
         If Forms! & NomForm & .Form.chkVente Then
            If premier Then
                SQL = SQL & " WHERE " & NomTable & "!STATUT = 5"
                premier = False
            Else
                SQL = SQL & " or " & NomTable & "!STATUT = 5"
            End If
        End If
     
        If Forms! & NomForm & .Form.chkVol Then
            If premier Then
                SQL = SQL & " WHERE " & NomTable & "!STATUT = 6"
                premier = False
            Else
                SQL = SQL & " or " & NomTable & "!STATUT = 6"
            End If
        End If
     
        If Forms! & NomForm & .Form.chkOut Then
            If premier Then
                SQL = SQL & " WHERE " & NomTable & "!STATUT = 7"
                premier = False
            Else
                SQL = SQL & " or " & NomTable & "!STATUT = 7"
            End If
        End If
     
        If Forms! & NomForm & .Form.chkLocation Then
            If premier Then
                SQL = SQL & " WHERE " & NomTable & "!STATUT = 8"
                premier = False
            Else
                SQL = SQL & " or " & NomTable & "!STATUT = 8"
            End If
        End If
     
       SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
        'SQL = SQL & ";"
     
     
        'on indique la source des enregistrements à afficher dans le sous-form. SF_PC
        'En même temps cela permet de mettre un filtre sur le sous-form. affiché !!!
     
        Forms!NomSousForm.Form.RecordSource = SQL
        Forms!NomSousForm.Form.Requery
     
    End Sub
    Merci d'avance pour vos réponses.

  2. #2
    Membre Expert Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Par défaut
    Hello !

    Je vois plusieurs choses que je ne saisis pas bien :

    1. Tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Forms! & NomForm & .Form.chkDefectueux Then
    Ne serait-ce pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Forms! & NomForm & .Form.chkDefectueux = True Then
    ?

    2. Tu écris : ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If premier = quoi (False/True)... then
    3. Tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NomTable & "!STATUT = 2"
    alors qu'il me semble que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NomTable & ".STATUT = 2"
    serait plus correct


    4. Dans tes clauses "Else", tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL & " or " & NomTable & "!STATUT = 2"
    Donc, en concaténant ton string, cela donnera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL = "SELECT * FROM " & NomTable & "" & " or " & NomTable & "!STATUT = 2"...
    Il n'y a donc aucune clause "Where"... ?

    Voilà, j'espère faire avancer le smilblick...

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Bonjour Bernard et merci ta réponse.
    pour répondre un tout petit peu...

    point 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Forms! & NomForm & .Form.chkDefectueux Then
    exprime simplement la condition:si chkDefectueux=true, c'est une autre syntaxe,quoique la tienne soit plus explicite.

    point 2:"premier" a été déclaré comme booléen...dont même chose qu'au point 1

    point 3:la syntaxe avec le "!" est typique Access(que j'utilise), même si la sybtaxe générale en vb est le "." .

    point 4:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL & " or " & NomTable & "!STATUT = 2"
    C'est vrai que là il ya un souci ! mais comment mieux reformuler ma syntaxe???je débute seulement en vba...
    J'ai rectifié les points ci-dessus,mais pour le reste je ne sais toujours pas pourquoi j'ai des erreurs de compilation dans la syntaxe !
    Merci d'avance et encore pour vos réponses !

  4. #4
    Expert confirmé
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Par défaut
    Bonjour,

    Sous Option Compare Database, tu rajoutes, si ce n'est déjà fait, Option Explicit.

    Ensuite, tu compiles ton code et tu postes les lignes qui sont en jaune.

    Ca donnera déjà une meilleure idée du problème.

    Domi2

  5. #5
    Membre Expert Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Par défaut
    Hello !

    Si une seule et unique condition peut être réalisée à la fois, pourquoi ne pas écrire tes conditions sous la forme suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        sql = "SELECT * FROM " & NomTable & ""
     
        If Forms! & NomForm & .Form.chkDefectueux Then
            If premier Then premier = False
            sql = sql & " WHERE " & NomTable & "!STATUT = 2"
        End If

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    En fait ma procédure utilise 3 paramètres:une table,un formulaire et 1 sous formulaire.Et comme j'en ai besoin pour plusieurs autres formulaires, j'aimerai pouvoir en rentrant juste les nom de mes trois paramètres dans ma procédure,que les noms de mes variables soit remplacés automatiquement aux bon endroits, au lieu de retaper toute la procédure dans le code du formulaire en donnant explicitement mes paramètres.
    J'ai bien mis "Option Explicit" au début du module contenant ma procédure.
    Dans le code je n'ai aucune erreur de compilation, mais lors de l'appel j'ai un problème("Compile Error. Expected:=).

    L'appel dans le code de mon formulaire se fait ainsi:

    P_RefreshQueryToModify("T_PC","F_PC","SF_PC")

    Et voici la procédure dans le module:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Public Sub P_RefreshQueryToModify(NomTable As String, NomForm As String, NomSousForm As String)
     
    Dim ctl As Control
    Dim SQL As String
    Dim SQLWhere As String
    Dim strSQL As String
    Dim premier As Boolean
     
    premier = True
     
    SQL = "SELECT * FROM " & NomTable & ""
     
        If Forms! & NomForm & .Form.chkDefectueux Then
            If premier Then
                SQL = SQL & " WHERE " & NomTable & "!STATUT = 2"
                premier = False
            Else
                SQL = SQL & " or " & NomTable & "!STATUT = 2"
            End If
        End If
     
         If Forms! & NomForm & .Form.chkStock Then
            If premier Then
                SQL = SQL & " WHERE " & NomTable & "!STATUT = 3"
                premier = False
            Else
                SQL = SQL & " or " & NomTable & "!STATUT = 3"
            End If
        End If
        ... 
        ...
        ...
        If Forms! & NomForm & .Form.chkLocation Then
            If premier Then
                SQL = SQL & " WHERE " & NomTable & "!STATUT = 8"
                premier = False
            Else
                SQL = SQL & " or " & NomTable & "!STATUT = 8"
            End If
        End If
     
        'SQLWhere récupère ce qui est écrit dans le SQL après le mot where pour l'utiliser dans les fonctions Dcount
     
       SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     
        'On calcule le nombre de résultats, et in affiche dans le label lblStats
        'Forms!Form_& NomForm & .lblStats.Caption = DCount("*", "" & NomTable & "", SQLWhere) & " / " & DCount("*", "" & NomTable & "")
     
        'on indique la source des enregistrements à afficher dans le sous-form. SF_PC
        'En même temps cela permet de mettre un filtre sur le sous-form. affiché !!!
     
        Forms!NomForm!NomSousForm!Form.RecordSource = SQL
        Forms!NomSousForm.Form.Requery
     
    End Sub
    Merci d'avance pour tout !

  7. #7
    Membre Expert Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Par défaut
    J'ai bien compris que ta procédure nécessite 3 paramètres. Peux-tu répondre à ma question :
    Est-il possible que plusieurs conditions soient remplies... Par exemple :
    chkDefectueux = True
    &
    chkStock = True
    etc....

  8. #8
    Expert confirmé
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Par défaut
    Hello,

    au risque de paraître idiot, je ne connais pas cette manière d'accéder aux objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        If Forms! & NomForm & .Form.chkDefectueux Then
    en revanche je connais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        If Forms(NomForm).Controls("chkDefectueux") Then

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    bonjour,

    j'eusse écrit :
    plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Forms! & NomForm & .
    cordialement,

    Philippe

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    merci pour vos réponses !
    Oui bernardmichel, il est bien possible que plusieurs checkbox soient à true,car ils permettent de faire une recherche multicritère et afficher de manière dynamique les résultats un peu le tutoriel de Cafeine...merci pour tes réponses...
    Merci Cafeine pour ta remarque pertinente...je l'ai prise en compte!
    J'attends bien de vos solutions et merci encore d'avance... !

  11. #11
    Membre Expert Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Par défaut
    Alors... en prenant en compte la remarque avisée de Caféine !... je me suis un peu amusé et tente un essai en te proposant le code suivant :
    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
    40
    Public Sub P_RefreshQuery(NomTable As String, NomForm As String, NomSousForm As String)
     
    Dim SQL As String
    Dim SQLWhere            As String
    Dim strSQL              As String
    Dim premier             As Boolean
    Dim strControl(2 To 8)  As String
    Dim I                   As Integer
     
    strControl(2) = "chkDefectueux"
    strControl(3) = "chkStock"
    strControl(4) = "chkTransfert"
    strControl(5) = "chkVente"
    strControl(6) = "chkVol"
    strControl(7) = "chkOut"
    strControl(8) = "chkLocation"
    premier = True
     
    SQL = "SELECT * FROM " & NomTable & ""
     
        For I = 2 To 8
            If Forms(NomForm).Controls(strControl(I)) Then
                If premier Then
                    SQL = SQL & " WHERE " & NomTable & "!STATUT = " & I
                    premier = False
                Else
                    If Not IsNull(InStr(SQL, "Where")) Then
                        SQL = SQL & " or " & NomTable & "!STATUT = " & I
                    Else
                        SQL = SQL & " WHERE " & NomTable & "!STATUT = " & I
                    End If
                End If
            End If
        Next I
     
        SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
        Forms!NomSousForm.Form.RecordSource = SQL
        Forms!NomSousForm.Form.Requery
     
    End Sub
    Voilà, si la boucle ne fonctionne pas, cela te donne peut-être une piste ?

    A+

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Merci Bernardmichel...je vais tester ça et je vous tiens au courant !
    Merci à vous tous pour tout !

  13. #13
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Voilà Bernardmichel...
    J'ai testé le code...mais j'ai une erreur lors de l'appel de la procédure dans le code vba du formulaire.
    J'ai saisi ceci : P_RefreshQuery(T_PC,F_PC,SF_PC)
    et j'ai en rouge ceci P_RefreshQuery(T_PC,F_PC,SF_PC) avec un message d'erreur du genre "Syntax Error , puis Expected:= )
    Je ne sais pas pourquoi.

    Merci de m'apporter de solutions...
    Bien à vous !

  14. #14
    Membre Expert Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Par défaut
    Hello !

    Alors, pour appeler ta procédure, tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    P_RefreshQuery(T_PC,F_PC,SF_PC)
    Je pense que tu devrais essayer avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    P_RefreshQuery("T_PC","F_PC","SF_PC")
    Ensuite, pour vérifier si la boucle que je t'ai envoyée est correcte, merci de corriger un tout petit peu le code, de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Else
                        SQL = SQL & " WHERE " & NomTable & "!STATUT = " & I
                    End If
                End If
            End If
        Next I
    
        MsgBox SQL    
    
        SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
        Forms!NomSousForm.Form.RecordSource = SQL
        Forms!NomSousForm.Form.Requery
     
    End Sub
    Cela affichera le code SQL dans un msgbox et ainsi, tu pourras constater de visu si ton code SQL est correct.

  15. #15
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    J'ai mis les parenthèses comme tu as expliqué mais ça ne vas toujours pas.
    Comme il ya un erreur de syntaxe(comme précédemment) malgré le rajout des ("), il ne rentre même pas dans le code de la procédure vu qu'il ne prend pas les paramètres...

  16. #16
    Membre Expert Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Par défaut
    Compresses ta base (allégée au max) et joins-la avec ta prochaine réponse, ce sera plus simple.. peut-être.. pour voir ce qui ne joue pas

  17. #17
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    J'ai préféré utiliser manuellement les paramètres pour chaque procédure...

    Merci beaucoup en tout cas pour vos réponses !!!!!!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Création d'entete pour plusieurs formulaires
    Par yfchauer dans le forum IHM
    Réponses: 4
    Dernier message: 01/03/2013, 09h30
  2. 1 Bindingsource pour plusieurs formulaires
    Par Sorayun dans le forum Windows Forms
    Réponses: 0
    Dernier message: 12/01/2010, 17h32
  3. [WACT] Un contrôleur pour plusieurs formulaires
    Par lvldia dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 11/07/2007, 15h48
  4. Un submit pour plusieurs formulaires
    Par beufa dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 29/11/2005, 15h51
  5. Comment utiliser la meme table pour plusieurs formulaires
    Par pacodelareunion dans le forum Access
    Réponses: 5
    Dernier message: 26/10/2005, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo