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 :

Comment interrompre temporairement une procédure ? [AC-2010]


Sujet :

Access

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 355
    Points : 509
    Points
    509
    Par défaut Comment interrompre temporairement une procédure ?
    Bonjour,

    Dans ma basse Access, j'ai besoin d'interrompre l'exécution du code VBA pour permettre à l'utilisateur de saisir des données dans une fenêtre dédiée.

    Plus concrètement :
    1 - L'utilisateur demande la production d'une facture en cliquant sur un bouton
    2 - Le code s’exécute pour produire un certain nombre d'informations (réf de facture...)
    3 - Une fenêtre s'affiche pour permettre à l'utilisateur de saisir un texte d'info à faire figurer en pied de facture
    4 - L'utilisateur ferme la fenêtre de saisie
    5 - Le code continue de s’exécuter pour terminer la production de la facture

    C'est donc à l'étape 3 que je bloque.
    J'ai créé la fenêtre de saisie et je l'appel dans ma procédure
    La fenêtre de saisie s'affiche mais pour autant, le code de production de la facture continue d'être exécuté.

    Ce que j'aimerais c'est pourvoir disposer d'une fenêtre de saisie personnalisée et appelable dans différentes procédures et que cette fenêtre bloque le code tant que l'utilisateur n'a pas fermé la fenêtre.

    C'est faisable ça ?
    Si oui, comment ?

    Merci de votre aide
    Les solutions les plus simples sont les plus efficaces

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 55
    Points : 76
    Points
    76
    Par défaut Diviser la procédure en deux
    Bonjour

    Une solution serait de diviser votre procédure en deux parties.
    Commencer la première partie jusqu’au point 3
    On laisse l’utilisateur remplir les données
    On place un bouton dans le formulaire et sur l’évènement CLIC pour commencer la dernière procédure.
    Salutations

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 355
    Points : 509
    Points
    509
    Par défaut Merci pour l'aide
    J'ai bien pensé à cette solution mais elle rend la fenêtre de saisie dépendante de la procédure et donc, non réutilisable dans d'autres.
    Je l'utiliserais en dernier recours mais je préférerais pouvoir appeler la même fenêtre de saisie en différentes occasion.
    Les solutions les plus simples sont les plus efficaces

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 355
    Points : 509
    Points
    509
    Par défaut J'ai trouvé une solution
    J'utilise une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While Tempo = False
        DoEvents
    Wend
    Avec la fonction DoEvents qui permet de continuer de gérer la fenêtre de saisie que j'ai ouverte juste avant.
    A la fermeture de la fenêtre saisie, je change la valeur de la variable Tempo ce qui permet de sortir de la boucle et de continuer le traitement.

    Qu'en pense les puristes ?
    Les solutions les plus simples sont les plus efficaces

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,


    Ça me gêne de répondre puisque tu t'adresses aux "puristes", mais je procède comme tu l'indiques.

    Et quand il s'agit de tempérer en attendant la fin de l'exécution d'un programme, il y a ceci qui vient à point : http://access.developpez.com/faq/?pa...ion#AttFinProc.

    Et si tu sais d'avance combien de temps patienter, il y a aussi ceci

    déclarer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Option Compare Database
    Option Explicit
     
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    ... et dans le code, là où il faut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Attendre deux secondes
    Sleep 2000

    Vulgum pecus
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 355
    Points : 509
    Points
    509
    Par défaut Merci de ta réponse Claude
    Rassure toi, en ta qualité de rédacteur, avec tes 71 000 points, tes 11 000 messages et tes 8 années de participation au forum, tu peux largement te permettre de répondre et tu es un puriste au sens où moi je l’entend.
    Je trouve rassurant de savoir que des chevronnés, acharnés et passionnés aboutissent aux mêmes conclusions et solutions que moi.

    Merci de ton message et des infos ;-)
    Les solutions les plus simples sont les plus efficaces

  7. #7
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    lololebricoleur,

    Je m'immisce dans votre conversation afin de donner mon point de vue personnel (je ne suis pas puriste non plus mais quelques techniques de vieux briscards comme on dit).

    En règle général, et hormis quelques situations exceptionnelles je m'interdis ce genre de procédés. Dans la phase de conception, j'essaie d'appliquer comme règle universelle la saisie des informations utilisateurs en dehors de toute exécution du code mais admettons que ton traitement impose cette saisie.

    Outre les techniques évoquées précédemment (boucle...), il existe également l'utilisation de variables globales permettant de valider la réponse donnée et utilisable à différents niveaux : 0 -> formulaire non ouvert, 1 formulaire ouvert mais absence de saisie de la part de l'utilisateur, 2-> formulaire ouvert et saisie conforme. Ainsi dans la suite du traitement, tu peux à souhait traiter la valeur de cette variable globale pour inciter l'utilisateur à reformuler sa réponse ou sortir du traitement de ton code...

    D'autre part et suivant le contexte, tu peux eventuellement ouvrir ton formulaire en mode fenêtre acdialog : http://msdn.microsoft.com/fr-fr/libr...ffice.15).aspx. Cette technique suspend l’exécution du code jusqu'à la fermeture du formulaire (sans utilisation d'artifices supplémentaires).

    La dernière technique consiste à utiliser la fonction InputBox permettant à l'utilisateur de renseigner une valeur, sa description ici : http://office.microsoft.com/fr-fr/ac...001228856.aspx

    En fonction du contexte, de la somme d'informations, des contrôles à effectuer chacun sera utiliser la méthode la plus propice et la mieux adaptée.

    JimBolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 355
    Points : 509
    Points
    509
    Par défaut Merci de ta réponse Jim
    Je viens effectivement de vois que le mode acdialog peut être une solution plus propre et simple.

    Concernant ta suggestion avec des variables globales, je ne voit pas comment cela règle mon problème si tu ne bloque pas la continuité du traitement du code pas le biais d'une boucle ou autre

    Pour le inputbox, les possibilité sont trop limitées. Je veux personnalisé la boite de dialogue.

    Dans mon cas :
    C'est pour saisir un texte d'info qui sera imprimé en pied de facture.
    On l'utilise pour préciser le mode règlement, la banque, le n° du chèque, la date du règlement
    Et pour limiter la saisie manuelle, je propose des listes d'éléments pré renseignés ("Réglé pas chèque", "réglé par virement", le nom des banques...)
    Mais pour cela, je dois pouvoir vraiment faire ce que je veux avec le formulaire.
    Les solutions les plus simples sont les plus efficaces

  9. #9
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    lololebricoleur re,

    le rôle d'une variable étant de changer de valeur au gré de l'exécution d'un code, elle peut être de type public ou privée (ce qu'on appelle portée). En admettant que cette variable soit de type public, tu vas pouvoir changer la valeur de celle-ci ou que tu soit dans ton projet. De ce fait, à la fermeture du formulaire tu vas pouvoir changer le contenu de cette variable et l'exploiter dans la suite de ton code

    ici une explication : http://argyronet.developpez.com/offi...convention/#L3

    jim
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 355
    Points : 509
    Points
    509
    Par défaut Jim
    J'ai bien compris la notion de portée des variables mais si je reprend les opération dans l'ordre :

    1 - L'utilisateur clic sur le bouton qui va déclencher le code principal
    2 - Dans ce code principal, je prévois l'ouverture d'un formulaire de saisie
    3 - Le formulaire s'ouvre et le code principal est en attente
    4 - L'utilisateur saisi les données et il valide (là effectivement, je modifie les valeurs de variables globales)
    5 - Le code principal reprend son exécution

    Ce que je ne comprend pas dans ce que tu m'expliques à propos des variable globales c'est qu'à l'étape 3, si n'intègre pas un moyen de bloquer le traitement du code (une boucle par exemple), le formulaire est ouvert certes, mais le code continue d'être exécuté.

    Autrement dit, la variable globale me permet effectivement de savoir si l'utilisateur a fait ou non ce que j’attends de lui mais, à elle seule, elle ne peut pas suspendre l’exécution du code.

    En tous cas, merci de ton aide et j'apprécie le débat
    Les solutions les plus simples sont les plus efficaces

  11. #11
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    lololebricoleur,

    oui effectivement tu as raison, mais ton code peut contrôler à l'issue de l'ouverture de ton formulaire l'état de ta variable globale... tout simplement.


    1. variable initialisée,
    2. traitement du code,
    3. ouverture du formulaire (l'action effectuée continuer ou annuler modifie l'état de ta variable). Durant cette partie le code continue à s’exécuter mais tu peux contrôler l'état de ta variable (tant que 0 je boucle...).
    4. interprétation du résultat si différent de 0,
    5. suite du code

    jim
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 355
    Points : 509
    Points
    509
    Par défaut
    Ok, je comprend mieux.

    Donc c'est effectivement ce que je fais.
    Je boucle tant que ma variable n'a pas la valeur attendue
    Les solutions les plus simples sont les plus efficaces

  13. #13
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    lololebricoleur,

    Tu aurais pu aussi tester l'existence du formulaire ouvert dans ta boucle. Mais perso la technique du mode d'affichage acdialog reste la meilleure technique à mon goût..

    http://access.developpez.com/faq/?page=Forms#isloaded

    jim
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  14. #14
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 355
    Points : 509
    Points
    509
    Par défaut
    Je viens de changer mon code et j'ai opté pour le mode acdialog.
    Tu as parfaitement raison jim, dans mon cas, c'est idéal et bien plus propre.

    Merci ;-)
    Les solutions les plus simples sont les plus efficaces

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/03/2009, 20h42
  2. Réponses: 1
    Dernier message: 14/08/2007, 12h14
  3. Comment creer une procédure stockée à partir d'un code VBA?
    Par Alcor020980 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 24/05/2005, 20h55
  4. Comment lancer une erreur dans une procédure stockée
    Par borgfabr dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/05/2005, 18h06
  5. Réponses: 5
    Dernier message: 21/12/2004, 19h12

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