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 :

Problème de désynchronisation des instructions exécutées. [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut Problème de désynchronisation des instructions exécutées.
    Bonjour,

    Je rencontre un problème lorsque je souhaite imprimer un fichier PDF (ce n'est pas un report Access).

    La problématique est la suivante :
    Les utilisateurs pour qui je développe mon application doivent utiliser des formulaires CERFA mis à disposition par l'administration. Les modèles sont des formulaires PDF qui peuvent être remplis.
    J'ai donc développé un process qui, à partir de données Access, crée un fichier de données intégrable au PDF (fichier FDF), et qui est fusionné avec le formulaire PDF d'origine dans un fichier PDF final.

    Pour fusionner ces données, j'utilise l'utilitaire pdftk (utilisable en mode commande) que j'appelle via l'instruction shell
    Pour imprimer le PDF généré, j’utilise une fonction windows que j'ai déclaré comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    '---------------------------------------------------------------------------------------
    '   Fonction pour ouvrir le fichier PDF
    '---------------------------------------------------------------------------------------
    Private Declare Function OuvrirPDF Lib "shell32" Alias "ShellExecuteA" _
                                       (ByVal hwnd&, ByVal lpOperation$, ByVal lpFile$, ByVal lpParameters$, _
                                        ByVal lpDirectory$, ByVal nShowCmd&)
    Le process est découpé de la manière suivante :
    1. création du fichier fdf
    2. fusion du formulaire pdf et du fichier fdf (utillisation de l'utilitaire pdftk)
    3. déplacement du fichier pdf généré dans le répertoire cible et suppression des fichiers de travail
    4. Impression du fichier pdf présent dans répertoire cible.


    Le problème se situe entre les phase 2 et 3 du process, aboutissant à une erreur dans la phase 4:

    la phase 2 est une procédure qui n'exécute que l'utilitaire pdftk. l'exécution peut demander un certain temps, et j'ai essayé de sécuriser l'exécution de celle-ci 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
    Public Sub pdftk(param1, param2 ...)
    .. constitution dynamique de la chaine de commande
        rc = Shell(str, vbHide)
     
     
        Set file = CreateObject("Scripting.FileSystemObject")
        Do Until file.FileExists(<fichier de sortie généré>)
            DoEvents
        Loop
    ... suppression des fichiers de travail
    end sub
    Le problème est que l'instruction file.FileExists devient vrai à partir du moment ou le fichier commence à être généré, et pas au moment ou la génération est terminée.

    Résultat : la phase 3 démarre alors que la phase 2 n'est pas complètement achevée (je recopie un fichier incomplet, voire vide), ce qui déclenche une erreur lors de la phase 4 (le fichier est incorrect).

    Comment contourner ce problème ?
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

  2. #2
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    Que se passe -t-il si l'on inverse la commande ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do Until NOT file.FileExists(<fichier de sortie généré>)
    ou bien avec une commande qui termine le processus.

  3. #3
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2017
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2017
    Messages : 91
    Points : 140
    Points
    140
    Par défaut
    Tu peux essayer avec ce code :

    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
     
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
    Public Const INFINITE = &HFFFF
     
    Function LanceEtAttendLaFin(ByVal CheminComplet As String) As Long
    Dim ProcessHandle, ProcessId As Long
     
        ProcessId = Shell(CheminComplet, vbNormalFocus)                             ' lance l'application CheminComplet
        ProcessHandle = OpenProcess(&H1F0000, 0, ProcessId)                      ' récupère son Handle
        LanceEtAttendLaFin = WaitForSingleObject(ProcessHandle, INFINITE)    ' attend indéfiniment tant que l'application est ouverte
     
    End Function
     
    Sub AttendFinApplication()
        chemin = "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE"
        If LanceEtAttendLaFin(chemin) = 0 Then
            MsgBox "coucou"
        End If
     
    End Sub
    Ici, le code lance Excel
    Tant qu'il est ouvert, il attend.

  4. #4
    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 : 281 907
    Points
    281 907
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  5. #5
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Super ! Vos 2 solutions marchent impeccable.

    Merci à tous pour votre aide
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/06/2007, 11h34
  2. Réponses: 1
    Dernier message: 16/05/2007, 14h01
  3. [VB6] Comment passer des instructions à un exécutable depuis VB?
    Par yal001 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 04/05/2006, 10h59
  4. [telnet] Exécuter des instructions en cas d'echec
    Par xjinh dans le forum Modules
    Réponses: 3
    Dernier message: 15/11/2005, 17h43
  5. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39

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