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 :

Debug application access


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 127
    Points : 52
    Points
    52
    Par défaut Debug application access
    Bonjour

    malgré le debogage et la compilation sous access 2007 (complet), mon appli se plante sur un poste dont seul la version runtime 2007 est installée.
    idem sur poste avec runtim2007 et office 2007 familiale

    sur le poste de dev, la version accdr fonctionne bien

    comment debugguer pour trouver ces problemes avec access 2007 complet?

  2. #2
    Membre confirmé Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Points : 518
    Points
    518
    Par défaut
    Bonjour,

    Il existe plusieurs méthodes de débuggage. Dans le VBE avant de lancer l'application il est possible de placer des "break points" dans le code grace à la touche F9. L'execution s'arrêtra sur la ligne où a été posé le break point. Il suffit de réappuyer sur la même touche pour l'enlever (il faut au préalable que le curseur se trouve sur la ligne avant de faire la modification).

    Il est possible aussi de positionner des instructions "Stop" dans le code qui ont le même effet.

    Ensuite la touche F8 sert à executer les instructions les une après les autres. MAj + F8 Permet d'executer un appel complet de méthode(s) situé sur la ligne qui doit être executée.

    Autres points utiles sont les fenêtres de déboguage, Affichage->Fenetre Espion et Affichage->Fenetre d'execution.

    La fenetre espion permet de voir l'état d'une variable ou d'un objet en faisant un glisser déplacer du nom de la variable / objet dans cette fenetre.

    La fenetre d'execution permet de voir la sortie de débuggage. Par exemple l'instruction suivante
    écrit xxx dans cette fenêtre.
    Cette fenêtre est aussi très utile pour tester/executer des méthodes ou avoir la valeur d'une variable, par exemple ceci :
    retourne le chemin du projet courrant

    Il ne faut pas oublier les tests unitaires avec l'instruction "Assert". Les tests unitaires doivent être écrit avant d'écrire le code pour vérifier les contraintes métiers et applicatives. Pour faire simple cette instruction permet de vérifier l'état / la valeur d'une variable en la placant dans un certain contexte.
    Le but du jeu est de couvrir un maximum de contexte possible pour un objet / variable pour s'assurer de son bon fonctionnement dans toutes les situations de l'application.

    voici un exemple de test unitaire :

    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
    Private onglet As GestOnglet
     
    Public Sub runTests()
      initializations
      testsAEffectuer
      fermetureDesObjets
      Debug.Print "tests completed"
    End Sub
     
    Private Sub initializations()
      Set onglet = New GestOngletMenu
      DoCmd.OpenForm "Frm_Menu", acDesign
      DoCmd.OpenForm "Frm_Ecouteur_UI", acDesign
      onglet.create getOngletVideStructure, "TestOnglet"
    End Sub
     
    Private Sub testsAEffectuer()
      Debug.Assert testName
    End Sub
     
    Private Function getOngletVideStructure() As ONGLET_COMPOSE
      With getOngletVideStructure
        Set .objets.imageDebut = Forms("Frm_Menu").Controls("I_Onglet1_Debut")
        Set .objets.imageMilieu = Forms("Frm_Menu").Controls("I_Onglet1_Milieu")
        Set .objets.imageFin = Forms("Frm_Menu").Controls("I_Onglet1_Fin")
        Set .objets.Label = Forms("Frm_Menu").Controls("Lbl_Onglet1")
        Set .objets.bouton = Forms("Frm_Menu").Controls("Btn_Onglet1")
        .placement.haut = 0
        .placement.gauche = 1235
        .placement.largeur = 1230
        .placement.hauteur = 225
        .std.debut = "Img_OngletDebutStd"
        .std.milieu = "Img_OngletMillieuStd"
        .std.fin = "Img_OngletFinStd"
        .survol.debut = "Img_OngletDebutSurvol"
        .survol.milieu = "Img_OngletMillieuSurvol"
        .survol.fin = "Img_OngletFinSurvol"
        .actif.debut = "Img_OngletDebutActif"
        .actif.milieu = "Img_OngletMillieuActif"
        .actif.fin = "Img_OngletFinActif"
      End With
    End Function
     
    Private Function testName() As Boolean
    On Error GoTo Err
      onglet.Name = "Test"
      If onglet.Name = "Test" Then
        testName = True
      Else: messageDeTest "testName", onglet.Name, "Test"
      End If
      Exit Function
    Err:
      Debug.Print "testName " & Err.Description
      testName = False
    End Function
    Cet exemple (qui ne comprends qu'un seul test ici) test un objet qui gère des onglets.

    Pour plus de détails une recherche s'impose.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 127
    Points : 52
    Points
    52
    Par défaut
    à prori, en ayant mis un certain nombre de données entre debug, mon pb serait peut être lié à un pb SQL et vba .....

    le message runtime est le suivant :
    Fonction non disponible dans les expressions "Mid([table_devis]![devis_num],1,len([table_devis]![devis_num])-4"

    la requete est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT Mid([Table_DEVIS]![Devis_Num]
    ,1,Len([Table_DEVIS]![Devis_Num])-4) AS numv
    , Max(Right([Table_DEVIS]![Devis_Num],3)) AS NUMDEV 
    FROM Table_DEVIS 
    GROUP BY Mid([Table_DEVIS]![Devis_Num]
    ,1,Len([Devis_Num])-4) 
    HAVING ((Mid([Table_DEVIS]![Devis_Num]
    ,1
    ,Len([Table_DEVIS]![Devis_Num])-4))='" & NUM_DEVIS_EN_COURS & "');
    je ne comprends pas !!!!

  4. #4
    Membre confirmé Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Points : 518
    Points
    518
    Par défaut
    On dirait qu'il manque des parenthèses et une fonction entre la deuxième et troisième ligne de code.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 127
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Tonioyo Voir le message
    On dirait qu'il manque des parenthèses et une fonction entre la deuxième et troisième ligne de code.
    je vais regarder.... mais ça n'explique pas pourquoi ça fonctionne très bien en version complète access.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 127
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par gwent Voir le message
    je vais regarder.... mais ça n'explique pas pourquoi ça fonctionne très bien en version complète access.
    A priori, il ne manque pas de paranthèse !!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    Mid([Devis_Num],1,Len([Devis_Num])-4) AS numv, 
    Max(Right([Devis_Num],3)) AS NUMDEV 
    FROM 
    Table_DEVIS 
    GROUP BY 
    Mid([Devis_Num],1,Len([Devis_Num])-4) 
    HAVING 
    ((
    (Mid([Devis_Num],1,Len([Devis_Num])-4))
    ='" & NUM_DEVIS_EN_COURS & "'));



    je ne comprend pas !!!!


    ps, assert, ça sert à quoi exactement?

  7. #7
    Membre confirmé Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Points : 518
    Points
    518
    Par défaut
    Est ce que ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mid([Devis_Num],1,Len([Devis_Num])-4)
    Peut être remplacé par cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Left([Devis_Num],Len([Devis_Num])-4)
    Cela ne solutionnera pas le problème mais rendra la requête un peu plus facile à comprendre si ceci est bien l'effet que vous souhaitez.

    J'ai donc essayé avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
        Left([Devis_Num],Len([Devis_Num])-4) AS numv, 
        Max(Right([Devis_Num],3)) AS NUMDEV 
    FROM 
        Tbl_Devis 
    GROUP BY 
        Left([Devis_Num],Len([Devis_Num])-4) 
    HAVING 
        Left([Devis_Num],Len([Devis_Num])-4)=11;
    Avec une table Tbl_Devis comprenant un champ Devis_Num de type Texte. J'ai positionné dans celui-ci des enregistrements allant de "01CCCC" à "20CCCC".

    La requête fonctionne. (C'est exactement le même résultat que la requête que vous avez fourni).

    Il y a eu peut être un problème qui est survenu lors de la compilation de la base de données. Il faudrait essayer de décompiler celle-ci pour ensuite la recompiler.

    Pour cela il faut utiliser une commande DOS de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Prompt> MSACCESS.EXE "LeCheminDeMaBase\MonFichierBaseDeDonnées.Extention" /DECOMPILE
    C'est une option de démarrage d'access. Il est possible de toutes les consulter grace a l'aide en ligne d'access en tapant dans l'onglet Aide intuitive "Options de la ligne de commande de démarrage" puis en consultant cette article.

    PS: Assert compare un objet / une variable par rapport à une valeur. Si ils sont différents Assert arrête l'execution des tests pour montrer que ce test n'est pas validé. Ceci implique de connaitre la valeur que doit avoir la variable / l'objet a cet instant précis.
    Typiquement cela permet de vérifier par exemple si un objet métier à bien incrémenté sa variable après l'exécution d'une fonction d'incrémentation.

    Un objet métier est un objet créé pour les besoin de l'application via un module de classe.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 127
    Points : 52
    Points
    52
    Par défaut
    Merci,

    Je vais essayé de décompiler ce soir car ici je n'ai que la version 2002.

    Vous dites que ça fonctionne chez vous.... vous avez essayé avec un poste sur lequel il n'y a que le runtime? car chez moi ça fonctionne partout, sur 2002, 2003, 2007 en mdb, mde, accde, accdb, accdr. Mais pas sur le pc sur lequel il y a juste runtime 2007.

    peut être y a t il une référence à cocher en plus?
    un p'tit exe ou autre à installer en plus du runtime ...

  9. #9
    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
    Il semble qu'il y ai un soucis au niveau des références sur le poste équipé de runtime. Comment déployez vous votre application ?

    Quant à Assert et autre debugging, ils ne fonctionnent pas en runtime mais uniquement dans l'environnement de développement. Assert n'a jamais d'ailleurs comparé la moindre variable à une autre mais arrete simplement l'exécution lorsque son paramètre est fixé à True. C'est la génération de ce paramètre qui éventuellement met en oeuvre les tests, Assert ne fait que matérialiser la volonté du développeur de placer un point d'arret conditionnel.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 127
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Tofalu Voir le message
    Il semble qu'il y ai un soucis au niveau des références sur le poste équipé de runtime. Comment déployez vous votre application ?

    Quant à Assert et autre debugging, ils ne fonctionnent pas en runtime mais uniquement dans l'environnement de développement. Assert n'a jamais d'ailleurs comparé la moindre variable à une autre mais arrete simplement l'exécution lorsque son paramètre est fixé à True. C'est la génération de ce paramètre qui éventuellement met en oeuvre les tests, Assert ne fait que matérialiser la volonté du développeur de placer un point d'arret conditionnel.
    je comprends bien qu'assert ne soit pas utilisable avec le runtime... je posais cette question car je ne l'ai jamais utilisé.

    il y a peut être des pb de références..
    les installes ont été effectuées sur mon PC par copier coller du fichier accde.
    étant donné que ça ne fonctionnait pas, je suis passé par l'assistant de déploiement sans embarquer le fichier d'installation du runtime (déjà installé sur le poste de destination).

    c'est vraiment usant de ne pas réussir à reproduire cette anomalie sur un pc équipé d'access complet.

Discussions similaires

  1. comment diviser mon application access en 2 partie
    Par Soulghard dans le forum Access
    Réponses: 4
    Dernier message: 10/01/2006, 10h26
  2. ouvrir une application access périodiquement
    Par cheucheu dans le forum Access
    Réponses: 6
    Dernier message: 22/12/2005, 16h53
  3. Synchronisation d'applications Access
    Par r@phy dans le forum Access
    Réponses: 14
    Dernier message: 12/12/2005, 09h53
  4. Option Debug dans access
    Par uskiki85 dans le forum Access
    Réponses: 11
    Dernier message: 26/09/2005, 15h15
  5. Debug application multi thread
    Par Razowsky dans le forum MFC
    Réponses: 1
    Dernier message: 03/05/2005, 18h14

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