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

Access Discussion :

Problème de perte de variable publique d'un formulaire au chargement de celui-ci


Sujet :

Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut Problème de perte de variable publique d'un formulaire au chargement de celui-ci
    Bonjour,

    Voilà je suis bloqué à nouveau sur un problème de remplissage d'une Combobox en Access. Je pensais en avoir fini avec ça et pluis vlan ça marche plus. Estce que quelqu'un pourrait m'aider s'il vous plait ?

    Voici le code qui me permet d'ouvrir le formulaire et de lui passer les propriétés qui m'intéressent : la région, les droits (admin, création, visu), le statut de l'incident que l'on va visualiser (public=visible par tout le monde en visu, ou privé=visible seulement par la région qui l'a créé)...

    Ces 3 arguments sont déclarés en public au niveau de mon formulaire "Form_FrmListeDesIncidents", de la manière suivante :

    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
     
     
     
    '****************************************************************************************
    '* Formulaire de saisie des incidents
    '****************************************************************************************
    Option Compare Database
    Option Explicit
    'Gestion des pièces jointes
    Public PubFichierSélectionné    As String
    'Gestion des droits d'accès
    Public StrUser                  As String   'Login de l'utlisateur
    Public StrRegion                As String   '"Nat"...
    Public StrDroits                As String   '"Administrateur","Visualisation","Création"
    Public StrStatut                As String   '"Public"/"Privé"
    'Paramétres de la base
    Public StrCheminPJ              As String   'Chemin où aller chercher les pièces jointes
    Par avance je vous remercie car là je sèche lamentablement.

    Marco.


    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 Function FctOpenFicheIncident( _
        ByRef StrRegion As String, _
        ByRef StrDroits As String, _
        ByRef StrStatut As String, _
        ByRef StrUser As String) As Boolean
     
    On Error GoTo ErrHandler
     
        Dim StrSvDroits       As String
        Dim StrSvRegion       As String
        Dim StrSvStatut       As String
        Dim StrSvUser         As String
     
        Dim StrCheminPJ As String
     
        FctOpenFicheIncident = False
     
     
        If IsNull(Form_FrmListeDesIncidents.LstResultQuery.Column(7)) Then
            GoTo ExitHandler
        Else
            StrStatut = Form_FrmListeDesIncidents.LstResultQuery.Column(7) '.ItemsSelected(0)
        End If
     
        StrSvDroits = StrDroits
        StrSvRegion = StrRegion
        StrSvStatut = StrStatut
        StrSvUser = StrUser
     
        If Not ModDroits.FctDroitsEnregistrement(StrDroits, StrRegion, StrStatut, StrUser) Then
            Exit Function
        End If
     
        DoCmd.OpenForm "FrmFormulaireIncident"
     
        Form_FrmFormulaireIncident.StrDroits = StrSvDroits
        Form_FrmFormulaireIncident.StrRegion = StrSvRegion
        Form_FrmFormulaireIncident.StrStatut = StrSvStatut
        Form_FrmFormulaireIncident.StrUser = StrSvUser
    '
    '    If Not ModDroits.FctDroitsFicheIncident(StrDroits, StrRegion, StrStatut, StrUser) Then
    '        Exit Function
    '    End If
     
        StrDroits = StrSvDroits
        StrRegion = StrSvRegion
        StrStatut = StrSvStatut
        StrUser = StrSvUser
     
        Form_FrmFormulaireIncident.StrDroits = StrSvDroits
        Form_FrmFormulaireIncident.StrRegion = StrSvRegion
        Form_FrmFormulaireIncident.StrStatut = StrSvStatut
        Form_FrmFormulaireIncident.StrUser = StrSvUser
     
        Form_FrmFormulaireIncident.TxtRegionParam.Value = StrRegion 'IIf(StrRegion = "NAT", "*", StrRegion)
     
        If Not FctChargeRegion(StrRegion) Then
            Exit Function
        End If
        Form_FrmFormulaireIncident.TxtRegionParam.Application.Echo True
        Form_FrmFormulaireIncident.StrDroits = StrSvDroits
        Form_FrmFormulaireIncident.StrRegion = StrSvRegion
        Form_FrmFormulaireIncident.StrStatut = StrSvStatut
        Form_FrmFormulaireIncident.StrUser = StrSvUser
     
        If Not ModFichier.FctChercheCheminPJ(StrCheminPJ) Then
            Exit Function
        End If
     
        If Not IsNull(Form_FrmFormulaireIncident.ClosLe.Value) Then
            Form_FrmFormulaireIncident.CmdCloturer.Enabled = False
        End If
    '
    '    If Not ModDroits.FctDroitsFicheIncident(StrDroits, StrRegion, StrStatut, StrUser) Then
    '        Exit Function
    '    End If
     
        FctOpenFicheIncident = True
    ExitHandler:
        Exit Function
    ErrHandler:
        MsgBox Err.Description, vbExclamation, CstAppName
        Resume ExitHandler
     
    End Function

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut
    Salut,

    Je croyais que l'intérêt des variables globales c'était justement de ne pas avoir à les déclarer ou à les repasser en paramétre.

    Tu n'aurai pas une espéce de confli entre
    Public StrDroits
    et
    ByRef StrDroits As String

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Bonsoir Pascal Lob,

    Je penses pas car tant que je charge ma fenêtre et comme tu peux le voir je tranmets mes paramêtres à la fenêtre par :

    Form_FrmFormulaireIncident.StrRegion = StrSvRegion

    Et tant que je suis en exécution tout a l'air de bien se passer : je vois que la valeur n'a pas changé...

    Mais une fois que je suis sur la fenêtre "Form_FrmFormulaireIncident" et que je veux me servir de la vaviable publique "StrRegion" alors là je vois dans la fenêtre d'espions qu'elle est vide... Où est donc passée sa valeur ? Mystère.

    C'est pire que de la prestidigitation.

    Enfin si quelqu'un a une idée et peut m'aider. Il y a surement quelquechose que je fais mal mais quoi ?

    A bientôt.

    Marco.

  4. #4
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Les variables publiques sont déconseillées. Préfere le passage des arguments dans le paramètre OpenArgs de la methode OpenForm

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Bonsoir Tofalu,

    Tu pourrais me donner un exemple s'il te plait ?

    J'avoue que je suis un peut perdu là.

    Pour compléter mon propos, j'ai plusieurs formulaires qui s'enchaînent et je transmets les veleurs de l'un à l'autre depuis le début et ça marche... Alors pourquoi pas ici ?

    Voici par exemple la fonction qui appelle le formulaire qui vient juste avant cet écran ci (et ici ça marche). Je vous le montre à titre d'exemple :

    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
     
     
    Public Function fctAfficheListeDesIncidents( _
        ByRef StrRegion As String, _
        ByRef StrDroits As String, _
        ByRef StrStatut As String, _
        ByRef StrUser As String) As Boolean
     
    On Error GoTo ErrHandler
     
    '    Form_FrmMenuGeneral.Visible = False
        fctAfficheListeDesIncidents = False
     
        DoCmd.OpenForm "FrmListeDesIncidents"
     
        Form_FrmListeDesIncidents.StrDroits = StrDroits
        Form_FrmListeDesIncidents.StrRegion = StrRegion
        Form_FrmListeDesIncidents.StrUser = StrUser
     
        Form_FrmListeDesIncidents.Requery
     
        If Not ModDroits.FctDroitsListeIncident(StrDroits, StrRegion, StrStatut, StrUser) Then
            Exit Function
        End If
        Form_FrmListeDesIncidents.Visible = True
        fctAfficheListeDesIncidents = True
    ExitHandler:
        Exit Function
    ErrHandler:
        MsgBox Err.Description, vbExclamation, CstAppName
        Resume ExitHandler
     
    End Function
    Maintenant j'ai peut être pas choisi la meilleure manière de faire c'est possible.

    Est ce que quelqu'un aurait une idée ?

    Merci d'avance.

    Marco.

  6. #6
    Membre actif Avatar de zEndymion
    Homme Profil pro
    Responsable des applications
    Inscrit en
    Avril 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des applications
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2006
    Messages : 162
    Points : 203
    Points
    203
    Par défaut
    Slt,

    essaye en changant le mode d'ouverture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim oFrmIncident as  Form_FrmFormulaireIncident
    Set oFrmIncident = New Form_FrmFormulaireIncident
    oFrmIncident.StrDroits = StrSvDroits
    Etc...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut
    Re salut Marco,

    Je pense que ta variable globale n'est plus accessible dans ton formulaire puisque tu y redéfini une variable locale.

    Je crois que tu dois choisir l'un ou l'autre mais pas les deux.

    Essaye en ne déclarant pas tes variables dans la fonction pour tester.

  8. #8
    Membre actif Avatar de zEndymion
    Homme Profil pro
    Responsable des applications
    Inscrit en
    Avril 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des applications
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2006
    Messages : 162
    Points : 203
    Points
    203
    Par défaut
    Pour passer t'es argment pas l'openArg, tu peux les concaténer :

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim StrOpenArg as String
    StrOpenArg = Arg1 & "|@| & Arg2 & etc ...
    tu ouvres ton formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    docmd.openForm StrNameForm ,,,,,, OpenArgs   (Y peut être pas le bon nombre de virgule)
    Tu décompiles ton OpenArgs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    StrArg1 = Split(OpenArgs,"|@|")(0)
    StrArg2 = Split(OpenArgs,"|@|")(1)
    Etc...
    Cela t'evite les Var globale

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Merci McGiver.

    En fait en creusant, le requery sur le formulaire semble solutionner une partie de mon problème. SAuf que le comportement au chargement du formulaire semble bon quand je fais : DoCmd.OpenForm "FrmFormulaireIncident"

    Mais lorsque j'essaye d'ouvrir le même formulaire selon d'autres modalités (ajout, modification, visualisation selon le cas et les droits des utilisateurs), ça ne marche plus du tout. Auriez vous une idée ?

    La fonction suivante illustre mon propos. Elle est appelée dans celle que je vous ai donné juste au dessus. J'espère simplement que mon code est assez clair car ça fait un momment que je cherche et j'avoue que j'ai plus les idées très claires maintenant.

    Voyez plutôt :

    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
     
     
    Public Function FctDroitsFicheIncident( _
        ByRef StrDroits As String, _
        ByRef StrRegion As String, _
        ByRef StrStatut As String, _
        ByRef StrUser As String) As Boolean
     
    On Error GoTo ErrHandler
     
     
        FctDroitsFicheIncident = False
     
        '1 - > Accessibilité des informations
        '************************************
        If Not ModSQL.FctRechercheDroitsFicheIncident(StrDroits, StrRegion, StrStatut, StrUser) Then
            Exit Function
        End If
        '2 - > Gestion des contrôles
        '***************************
        If StrDroits = CstAdmin Then
     
            '2) Mode d'ouverture du formulaire
            DoCmd.OpenForm "FrmFormulaireIncident", acNormal, , "[NumIncident] = " & Form_FrmListeDesIncidents.LstResultQuery.Column(0, Form_FrmListeDesIncidents.LstResultQuery.ItemsSelected(0)), acFormEdit ', acDialog
        ElseIf StrDroits = CstVisualisation Then '=> Attention au cas de l'accès en modif
     
                DoCmd.OpenForm "FrmFormulaireIncident", acNormal, , "[NumIncident] = " & Form_FrmListeDesIncidents.LstResultQuery.Column(0, Form_FrmListeDesIncidents.LstResultQuery.ItemsSelected(0)), acFormAdd         
        ElseIf StrDroits = CstCreation Then
            DoCmd.OpenForm "FrmFormulaireIncident", acNormal, , "[NumIncident] = " & Form_FrmListeDesIncidents.LstResultQuery.Column(0, Form_FrmListeDesIncidents.LstResultQuery.ItemsSelected(0)), acFormAdd     
        FctDroitsFicheIncident = True
    ExitHandler:
        Exit Function
    ErrHandler:
    'Resume
        FctDroitsFicheIncident = False
        MsgBox Err.Description, vbExclamation, CstAppName
        Resume ExitHandler
     
    End Function
    Qu'est ce que vous en pensez ?

    Par avance merci.

    Marco.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Bonsoir les amis,

    Oups j'avais pas lvu vos posts avent de répondre désolé.

    J'essayerais tout ça demain.

    Merci à vous.

    Je vous tiens au courant des évolutions de mon code.

    Pour l'heure je retourne dans les bras de Morphée.

    Marco.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Bonjour à tous,

    Je suis en train de faire l'essai de toutes vos suggestions.
    En ce qui concerne McGiver, est ce que tu pourrais m'en dire plus sur la manière de récupérer les arguments qui sont passés à la fenêtre ?

    En particulier, y a t il un ordre à passer juste avant de faire les splits ? Et par ailleurs, tu places bien celà dans le Form_Load ?

    Par avance merci.

    Marco plein d'espoir ce matin.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Points : 165
    Points
    165
    Par défaut
    Re-bonjour,

    Donc voilà après essai, ce que je viens de réussir à faire :

    Au niveau de l'appel :

    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
     
     
     
    Public Function FctDroitsFicheIncident( _
        ByRef StrDroits As String, _
        ByRef StrRegion As String, _
        ByRef StrStatut As String, _
        ByRef StrUser As String) As Boolean
     
    On Error GoTo ErrHandler
     
        Dim StrOpenArgs As String
     
        StrOpenArgs = StrDroits & "¤" & StrRegion & "¤" & StrStatut & "¤" & StrUser
     
        FctDroitsFicheIncident = False
     
        '1 - > Accessibilité des informations
        '************************************
        If Not ModSQL.FctRechercheDroitsFicheIncident(StrDroits, StrRegion, StrStatut, StrUser) Then
            Exit Function
        End If
        '2 - > Gestion des contrôles
        '***************************
        If StrDroits = CstAdmin Then
            DoCmd.OpenForm "FrmFormulaireIncident", acNormal, , "[NumIncident] = " & Form_FrmListeDesIncidents.LstResultQuery.Column(0, Form_FrmListeDesIncidents.LstResultQuery.ItemsSelected(0)), acFormEdit, , StrOpenArgs
        ElseIf StrDroits = CstVisualisation Then '=> Attention au cas de l'accès en modif
            DoCmd.OpenForm "FrmFormulaireIncident", acNormal, , "[NumIncident] = " & Form_FrmListeDesIncidents.LstResultQuery.Column(0, Form_FrmListeDesIncidents.LstResultQuery.ItemsSelected(0)), acFormReadOnly, , StrOpenArgs
        ElseIf StrDroits = CstCreation Then
            DoCmd.OpenForm "FrmFormulaireIncident", acNormal, , "[NumIncident] = " & Form_FrmListeDesIncidents.LstResultQuery.Column(0, Form_FrmListeDesIncidents.LstResultQuery.ItemsSelected(0)), acFormAdd, , StrOpenArgs
        End If
     
        Form_FrmFormulaireIncident.Requery
     
        FctDroitsFicheIncident = True
    ExitHandler:
        Exit Function
    ErrHandler:
    'Resume
        FctDroitsFicheIncident = False
        MsgBox Err.Description, vbExclamation, CstAppName
        Resume ExitHandler
     
    End Function
    Dans le formulaire appelé :

    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
     
     
    Private Sub Form_Load()
    On Error GoTo ErrHandler
        Dim StrArgs As String
        If Not IsNull(Me.OpenArgs) Then
            StrArgs = Me.OpenArgs
            StrDroits = Split(StrArgs, "¤")(0)
            StrRegion = Split(StrArgs, "¤")(1)
            StrStatut = Split(StrArgs, "¤")(2)
            StrUser = Split(StrArgs, "¤")(3)
     
        End If
     
        Statut = IIf(Me.Statut.Value = "Privé", "Public", "Privé")
        Me.Statut.Value = Statut
        Me.CmdPartager.Caption = IIf(Statut = "Public", "Isoler", "Partager")
        Me.CmdPartager.Enabled = False
    ExitHandler:
        Exit Sub
    ErrHandler:
        MsgBox Err.Description, vbExclamation, CstAppName
        Resume ExitHandler
    End Sub
    Donc a priori pour moi c'est résolu et je pense qu'on peut classer le sujet.

    Merci à tous.

    Marco.

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

Discussions similaires

  1. problème pour récupérer les variables GEt d'un formulaire
    Par ouldfella dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 04/01/2010, 10h22
  2. [XL-2003] Variable Publique: problème de fonctionnement
    Par yoord dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/06/2009, 16h46
  3. Problème d'affectation d'une variable publique
    Par boufano dans le forum Langage
    Réponses: 7
    Dernier message: 28/01/2008, 19h12
  4. problème variable publique sur userform
    Par swissmade dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/08/2007, 06h36
  5. Réponses: 32
    Dernier message: 20/03/2006, 14h23

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