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 :

Comportement étrange voir "Bug"


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut Comportement étrange voir "Bug"
    Bonjour,
    Envirronement: Access 2003 SP3, mode projet, Base SQL 2000 ou 2005

    2 formulaires. Le formulaire B comporte un sous formulaire
    Les 2 formulaires s'ouvrent sans erreurs ni probleme en mode normal ou en mode dialog
    Le formulaire A est ouvert en mode dialog (en mode normal, les problemes ne se produisent pas)

    A un endroit quelconque, le formulaire A ouvre le formulaire B en mode dialog

    1°) Lors de l'ouverture du formulaire B, tout semble normal. A la fermeture du formulaire B, le formulaire A se ferme aussi
    2°) Si le control de sous formulaire (du formulaire B) est lie (sourceobject, linkmasterfield prennent une valeur) dans le openform du formulaire B, alors, lors de l'ouverture du formulaire B, alors les donnees du sous formulaire B ne sosnt pas affichees (meme avec un requery). Lors de la fermeture du formulaire B, il y a enregistrement des modifications faites par code dans le sous formulaire A (par exemple le tri ou le filtre)!

    Si on veut que ce comportement ne se produise pas, il suffit de rendre invisible le formulaire A avant l'ouverture du formulaire B

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 548
    Points
    24 548
    Par défaut
    Bonjour,

    Il est constaté que certains événements ne se produisent pas lors d'une ouverture en mode Dialog.

    Ceci est peut être source du problème.

    Cordialement,

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Pour rebondir sur ta piste qui aurait put etre une explication: ce n'est pas le cas (dialog ou pas) car les 2 sont toujours en mode dialog.
    La seule chose qui change, c'est que le formulaire appelant (en mode dialog) est visible ou non. Si il est visible, alors les problemes apparaissent, si il n'est pas visible, alors les problemes ne sont pas presents.
    De meme, le phenomene ne se produit pas si le formulaire est ouvert (en dialog) depuis la ligne de debug ou depuis un formulaire en mode normal.
    Mais le probleme peut (je viens de le verifier) se produire de facon aleatoire quand le formulaire B est ouvert par le formulaire A en mode normal depuis une variable (SET A= new FormulaireA)

    Je ne sais pas si c'est un bug mais si quelqu'un rencontre se phenomene, alors qu'il ne soit pas surpris car j'ai cherche un moment avant d'isoler le probleme.

  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
    Bonjour,

    et salut Fab :-)

    En ce qui concerne les évènements certains sont un peu 'spéciaux'. Dans ce cas précis nous somme sur l'évènement open c'est a dire l'ouverture du formulaire. Sur le Open tous les controles d'un formulaire sont instanciés (y compris le controle qui gère le sous formalaire) mais ils ne sont pas initialisés c'est à dire que peu importe ce que l'on peu mettre dans le RowSource ça serra effacé lors de l'initialisation de l'objet qui se produit après l'évènement open.

    Dailleurs je crois qu'on a vu le même problème avec alain, le code qui est mis dans le open ne fonctionnera donc que si il est placé dans l'evènement activate car l'initialisation des objets se produit avant l'activate.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Merci a tous les 2 de votre interret

    Je suis tout a fait d'accord avec toi ,Tonioyo, en ce qui concerne les datas (et encore cela depend de la version d'acces), mais pas en ce qui concerne les objets et les proprietes (pour les versions post 2000). Les evenements open et load ne sont pas les evenements "initialize" des classes.
    Par contre l'ordre d'initialisation des proprietes peut etre important car Access peut les modifier suivant d'autres elements. Par exemple, un subform peut etre initialise suivant l'ordre LinkMasterFields, LinkChildFields, ObjectSource mais si Access "voit" une liaison entre les datas du formulaire et du sous formulaire, alors LinkMasterFields,LinkChildFields seront changés lorsque ObjectSource sera mis initialise dans vba. Ceci est particulierement visible avec un projet adp avec un utilisateur qui n'a pas acces aux tables ou aux liaisons mais a des requetes. Avec cet utilisateur, LinkMasterFields,LinkChildFields ne changeront jamais alors qu'avec l'utilisateur "sa" (visibilité totale), LinkMasterFields,LinkChildFields changent !!!

    Dans mon cas, je ne parle pas des datas mais des objets. D'ailleurs, le fait de mettre une propriete d'un controle (en dehors des proprietes touchant les datas) ne change pas par la suite (exemple visible ou format ou defaultvalue).
    Le deuxieme point est la difference de comportement qui n'a aucun lien avec les objets. Pourquoi le formulaire A se ferme lors de l'ouverture du formulaire B? Pourquoi ce phenomene n'arrive-t-il pas quand le formulaire A est ouvert en mode normal? Pourquoi ne se produit-il pas lorsque le formulaire A (ouvert en mode dialog) est mis non visible AVANT l'ouverture du formulaire B? Aucun lien avec le open et le load?

    L'evenement activate ne se produit pas dans les cas de sous formulaire, ce qui est genant pour faire des initialisations particulieres.
    Enfin, j'ai, depuis plus de 2 ans, un formulaire generique de type datasheet dont l'ensemble se "programme" en fonction de data dans une table (cela fait une datasheet dynamique). L'ensemble des controle et des proprietes, formulaire compris et mis a jour lors de l'open. Je n'ai jamais eu de probleme de ce type. Mais par contre, l'ordre d'intialisation est particulierement important.

    Tu fais etat d'un probleme similaire avec alain. Cela m'interresse particulierement. Si tu pouvais me faire un lien vers cette discussion ou me linker une archive, ca m'interresse.

  6. #6
    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
    Il faut faire attention avec les objets dans Access car même ceux de Access comporte des ActiveX, j'explique : Les propriétés de base d'un objet bouton par exemple c'est de l'access 'pur', la propriété visible aussi est de l'access 'pur' c'est à dire que cette propriété d'objet est propre a access. Par contre il y a des propriétés comme le RowSource je pense qui doit être très probablement une propriété de type ActiveX pour la simple et bonne raison que cette propriété doit être multiplateforme (on peu s'en servir pour faire de la base de donnée Access, de la base Oracle, Sql Server etc ...) donc à mon avis cette propriété ne se trouve pas écrite dans access mais plutôt dans une dll ou un ocx (d'où activeX).

    Du coup je ne sais pas quand exactement quand se produit l'évènement initialize, enfin tout du moins l'évènement initialize des propriété propres à access se fait avant les évènements load, open etc ... mais les propriétés de type ActiveX se font entre le open et l'activate. il faut regarder l'aide en ligne dans le VBE pour avoir l'enchainement des évènements de démarrage il y en a peut être un avant l'activate (Je pense à l'afterUpdate)

    Alain est un collègue de travail et il n'y a jamais eu de post sur ce problème et fab est aussi un collègue de travail c'est pour ca que j'en ai parlé :-)
    En fait on avait rencontré le même problème sur un formulaire qui ne possédait pas de sous formulaire comme le cas présent mais il y avait un soucis d'initialisation de la propriété RowSource je crois.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Pour completer notre reflexion, j'ai deplacer le code dans le Activate ... la c'est carement le plantage d'access dans le cas de figure 1) Dans le cas 2) pas de changement. La mise en non visible permet toujours de resoudre le probleme.
    J'ai ouvert un ticket mais la hotline est perplexe. Le cas se produit bien chez eux. Il m'ont remercier pour le contournement (mettre le formulaire appelant non visible). Faut dire qu'en gerneral quand je soumet un cas, il n'ont generalement pas d'explication et constate qu'effectivement il a probleme, puis remonte l'info au niveau US assez rapidement. Mes tickets ne sont jamais decomptes. A propos, les hotliners allemands (specilaises dans adp) sont super sympa et commencent a me connaitres.

  8. #8
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 548
    Points
    24 548
    Par défaut
    Dans Activate c'est normal que tu n'ais pas de bug... il ne se produit pas dans un formulaire Invisible.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Desole, mais le activate se produit bien pour le formulaire appelé puisque le formulaire est visible. Je pense que tu as melangé entre les 2 formulaires.
    Pour faire progesser le fil, avec MS, nous avons determiné qu'il fallait que le formulaire appelant soit ouvert en mode dialog mais qu'il soit aussi ouvert instancie a une variable. J'explique:
    Quelquepart, j'utilise une variable declare comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim Formulaire AS New Form_FormulaireA
    'Le formulaire vit sa vie tant que la variable Formulaire est active
    A un autre endroit qui n'a aucun rapport avec l'utilisation de la variable Formulaire, (par exemple depuis la ligne de debug), j'ouvre "traditionnellement" le formulaire A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    docmd.openform "FormulaireA",,,acDialog
    Dans le formulaireA, il y a par exemple un bouton qui ouvre un formulaire B en mode dialog de facon "traditionnelle"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    docmd.openform "FormulaireB",,,acDialog
    c'est la que se pose le probleme (plantage du "formulaire A" et de la variable "Formulaire"), voir le plantage complet d'access. Le probleme ne se produit pas quand le formulaire B est active (clic sur le bouton) depuis l'instance de la variable "Formulaire". Le probleme ne se produit jamais avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    me.visible=false
    docmd.openform "FormulaireB",,,acDialog
    me.visible=true
    Pour mémoire, le FormulaireB doit avoir une sousformulaire qui est lie dynamiquement lors de l'ouveture du formulaireB. Si cela est fait dans l'evenement open, Access ne plante pas mais le formulaireA est detruit, parcontre si le linkage est fait dans le activate, il y a plantage d'access (merci a Tonioyo qui m'a fait decouvrir ce cas particulier).


    MS continue de creuser ...

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/06/2014, 09h44
  2. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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