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 :

Plantage lors d'un passage de paramètre ? [AC-2010]


Sujet :

VBA Access

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut Plantage lors d'un passage de paramètre ?
    Bonjour à tous et merci de votre temps et de votre aide.

    J'ai un truc assez bizarre avec le code qui suit : il plante (pas de message juste "Access va redémarrer") lorsque j'essaye de consulter le paramètre prnNoGroupeAff.

    Un peu de contexte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Test_AssignerPlanifGroupeActivite()
        Dim chrono As New clsChrono: Call chrono.Demarrer("AssignerPlanifGroupeActivite")
        Call AssignerPlanifGroupeActivite(2017, DateSerial(207, 1, 1))
        Call chrono.Arreter: Call chrono.Afficher: Set chrono = Nothing
        MsgBox "Fini"
    End Sub
    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
    Private Sub AssignerPlanifGroupeActivite(prmAnnee As Long, prmDateHeureApplication As Date)
        'Pour tous les groupes d'activité
        ' Pour tous les groupes d'affectation
        '  Assigne le planifié
     
        Dim db As DAO.Database: Set db = CurrentDb
        Dim rMAJ As DAO.Recordset: Set rMAJ = db.OpenRecordset("tblPlanif_GroupeActivite_Quotidien", dbOpenSnapshot)
        Dim planifie As Double
     
        Do While Not rMAJ
     
            If rMAJ![DateHeure] >= prmDateHeureApplication Then
                Dim noGroupeAff As Long: noGroupeAff = rMAJ![noGroupeAff]
                planifie = mdlPlanif_Quotidien.CalculerGroupeActivite(rMAJ![Annee], rMAJ![NoGroupeActivite], rMAJ![NoDir], rMAJ![NoTerr], noGroupeAff)
                rMAJ.Edit
                rMAJ![NbHeurePlanifieAnnuel] = planifie
                rMAJ.MoveNext
            End If
     
        Loop
     
        Call rMAJ.Close: Set rMAJ = Nothing
        db.Close: Set db = Nothing
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Test_CalculerGroupeActivite()
        Debug.Print CalculerGroupeActivite(2017, 1, 0, 1, 1)
    End Sub
    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
    Public Function CalculerGroupeActivite(prmAnnee As Long, prmNoGroupeActivite As Long, prmNoDir As Long, prmNoTerr As Long, prmNoGroupeAff As Long) As Double
        Dim result As Double
     
        Select Case prmNoGroupeActivite
     
            Case NO_GROUPE_ACTIVITE_DISPO
                result = CalculerGroupeActivite_DISPO(prmNoDir, prmNoTerr, prmNoGroupeAff)
     
            Case NO_GROUPE_ACTIVITE_INDISPONIBLE
                result = CalculerGroupeActivite_INDISPONIBLE(prmNoDir, prmNoTerr, prmNoGroupeAff)
     
            Case NO_GROUPE_ACTIVITE_THEORIQUE
                result = CalculerGroupeActivite_THEORIQUE(prmNoDir, prmNoTerr, prmNoGroupeAff)
     
            Case Else
                'Si on a pas de calcul spécial, om applique le calcul habituel
                result = mdlPlanif.CalculerValeurPlanifGroupeActivite(prmAnnee, prmNoDir, prmNoTerr, prmNoGroupeAff, True)
        End Select
     
        CalculerGroupeActivite = result
    End Function
    Si j'exécute CalculerGroupeActivite() à partir de Test_CalculerGroupeActivite() tout va très bien et j'ai le résultat attendu.

    Si j'exécute à partir de la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    planifie = mdlPlanif_Quotidien.CalculerGroupeActivite(rMAJ![Annee], rMAJ![NoGroupeActivite], rMAJ![NoDir], rMAJ![NoTerr], noGroupeAff)
    dans AssignerPlanifGroupeActivite() où les valeurs de paramètres sont exactement les mêmes (2017, 1, 0, 1, 1), Access plante quand j'essaye de voir la valeur de prmNoGroupeAff.

    Avant que je déclare une variable noGroupeAffdans AssignerPlanifGroupeActivite() je pouvais voir la valeur sans que cela plante et c'était quelque chose comme 300000 alors que cela aurait du être 1. Avant un décompile, c'était quelque chose comme 290000. On dirait l'adresse en mémoire de la variable au lieu de sa valeur.

    J'ai vérifié mes paramètre au moment de l'appel dans AssignerPlanifGroupeActivite() et ce sont bien 2017, 1, 0, 1, 1. Mais rendu dans CalculerGroupeActivite() cela devient 2017, 1, 0, 1, ... Plantage.
    Les 5 champs de données sont tous typés Entier Long.

    Mon erreur doit être grosse comme une maison mais je ne la vois absolument pas.

    Si quelqu'un la vois merci de me la pointer.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    J'ai continué mes tests et mon arrachage de cheveux ....

    J'ai redémarré mon PC et modifié le code de AssignerPlanifGroupeActivite()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                Debug.Print rMAJ![Annee], rMAJ![NoGroupeActivite], rMAJ![NoDir], rMAJ![NoTerr], rMAJ![NoGroupeAff]
                Planifie = mdlPlanif_Quotidien.CalculerGroupeActivite(rMAJ![Annee], rMAJ![NoGroupeActivite], rMAJ![NoDir], rMAJ![NoTerr], rMAJ![NoGroupeAff])
                Debug.Print rMAJ![Annee], rMAJ![NoGroupeActivite], rMAJ![NoDir], rMAJ![NoTerr], rMAJ![NoGroupeAff]
    et voici les résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     2017          1             0             1             1 'Valeurs dans AssignerPlanifGroupeActivite
     2017          1             0             1             4386200  'Valeurs dans CalculerGroupeActivite
     2017          1             0             1             1 'Valeurs dans AssignerPlanifGroupeActivite
    Et par sécurité j'ai neutralisé le code dans CalculerGroupeActivite()

    C'est donc bien l'appel qui corrompt le paramètre mais pourquoi. Là est le mystère.
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour à tous.

    J'ai finalement trouvé le problème (et en passant quelques autres bugs sans rapport) en tentant de simplement parcourir mes données sans aucun traitement et que cela a planté au 3ième enregistrement.

    L'erreur était qu'il fallait écrire

    et non

    c'est .EOF qui fait toute la différence !

    Access ne dit rien mais visiblement il n'aime pas tenter de transformer un recordset en condition logique.

    Ci-dessous, le code corrigé de tous ses bugs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Test_AssignerPlanifGroupeActivite()
        Dim chrono As New clsChrono: Call chrono.Demarrer("AssignerPlanifGroupeActivite")
        Call AssignerPlanifGroupeActivite(2017, DateSerial(207, 1, 1))
        Call chrono.Arreter: Call chrono.Afficher: Set chrono = Nothing
        MsgBox "Fini"
    End Sub
    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
    Private Sub AssignerPlanifGroupeActivite(prmAnnee As Long, prmDateHeureApplication As Date)
        'Pour tous les groupes d'activité
        ' Pour tous les groupes d'affectation
        '  Assigne le planifié
     
        Dim db As DAO.Database: Set db = CurrentDb
        Dim rMAJ As DAO.Recordset: Set rMAJ = db.OpenRecordset("tblPlanif_GroupeActivite_Quotidien", dbOpenDynaset)
        Dim Planifie As Double
     
        Do While Not rMAJ.EOF
     
            If rMAJ![DateHeure] >= prmDateHeureApplication Then
                Planifie = mdlPlanif_Quotidien.CalculerGroupeActivite(rMAJ![Annee], rMAJ![NoGroupeActivite], rMAJ![NoDir], rMAJ![NoTerr], rMAJ![NoGroupeAff])
     
                rMAJ.Edit
                rMAJ![NbHeurePlanifieAnnuel] = Planifie
                rMAJ.Update
            End If
     
            rMAJ.MoveNext
        Loop
     
        Call rMAJ.Close: Set rMAJ = Nothing
        db.Close: Set db = Nothing
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Test_CalculerGroupeActivite()
        Debug.Print CalculerGroupeActivite(2017, 1, 0, 1, 1)
    End Sub
    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
    Public Function CalculerGroupeActivite( _
                                prmAnnee As Long, _
                                prmNoGroupeActivite As Long, _
                                prmNoDir As Long, prmNoTerr As Long, prmNoGroupeAff As Long, Optional prmBidon As Variant = Null) As Double
        Dim result As Double
     
        Select Case prmNoGroupeActivite
     
            Case NO_GROUPE_ACTIVITE_DISPO
                result = CalculerGroupeActivite_DISPO(prmNoDir, prmNoTerr, prmNoGroupeAff)
     
            Case NO_GROUPE_ACTIVITE_INDISPONIBLE
                result = CalculerGroupeActivite_INDISPONIBLE(prmNoDir, prmNoTerr, prmNoGroupeAff)
     
            Case NO_GROUPE_ACTIVITE_THEORIQUE
                result = CalculerGroupeActivite_THEORIQUE(prmNoDir, prmNoTerr, prmNoGroupeAff)
     
            Case Else
                'Si on a pas de calcul spécial, om applique le calcul habituel
                result = mdlPlanif.CalculerValeurPlanifGroupeActivite(prmAnnee, prmNoDir, prmNoTerr, prmNoGroupeAff, True)
        End Select
     
        CalculerGroupeActivite = result
    End Function
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 133
    Points : 83 975
    Points
    83 975
    Billets dans le blog
    15
    Par défaut
    Salut marot_r,

    Merci pour le partage de ta solution

    @+
    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour rené
    c'était gros effectivement, je ne l'ai pas vu car j'étais plus concentré sur les paramètres.
    Pour ton info une boucle WHILE s'écrit plus souvent comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    While Not rMAJ.EOF
       .....
        rMAJ.MoveNext
    Wend
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Moi aussi j'étais concentré sur les paramètres, là où l'erreur se manifestait ... un vieux truc d'illusionniste.
    Je n'ai attrapé mon erreur qu'en décidant d'éliminer complètement l'appel à la fonction et que ma BD a planté quand même.

    Pour le while .. wend c'est la vielle syntaxe venant de QBasic et même de Basica, personnellement je préfère le do ... loop qui fait plus "Moderne". :-).

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

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

Discussions similaires

  1. Passage de paramètres lors d'un onclick=.show()
    Par fayred dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/11/2007, 11h11
  2. Réponses: 2
    Dernier message: 04/12/2006, 10h23
  3. Réponses: 2
    Dernier message: 09/01/2006, 09h38
  4. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15

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