1. #1
    Candidat au Club
    Homme Profil pro
    statisticien
    Inscrit en
    juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : statisticien
    Secteur : Santé

    Informations forums :
    Inscription : juin 2017
    Messages : 4
    Points : 3
    Points
    3

    Par défaut Message d'erreur avec la fonction OpenProcess

    Bonjour à tous le monde,
    Voila avec mon entreprise on a récupéré un programme dont l'interface sont des formulaires access, qui interroge une base oracle qui est elle même incrémenté à l'aide de programmes sas. Autant vous dire que pour un débutant en vba et sas c'est pas facile de comprendre les programmes.
    Si vous pouviez donc m'éclairer sur certains points du programme ce serait super sympa.

    Mon premier souci est lors de l’exécution d'un filtre dans un formulaire, je vous passe la partie du programme qui fonctionne pour arriver directement à l'endroit qui ne fonctionne pas:

    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
    execution = """SAS.exe"""
    execution = execution & "-sysin """ + CStr(fichiercible) + ".sas"""
    execution = execution & "-log """ + CStr(fichiercible) + ".log"""
    execution = execution & "-sysparm """ & CStr(fichiercible) + ".txt"""
    ShellWait (CStr(execution))
    Dim hProcess As LongPtr, RetVal As Long
                
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(CStr(execution), vbMinimizedNoFocus))
    filtre_form = "FILTRE_" & UCase(CStr(USER_CON))
    
    Do
        GetExitCodeProcess hProcess, RetVal
        DoEvents
        Sleep 100
    Loop While RetVal = STILL_ACTIVE
    
    
    La ligne de code en rouge étant la ligne qui beugue. Il me semble qu'elle appelle la fonction suivante qui se trouve dans un module: 
    
    
    Public Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As LongPtr, ByVal bInheritHandle As LongPtr, ByVal dwProcessID As LongPtr) As LongPtr
    Public Declare PtrSafe Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As LongPtr, lpExitCode As Long) As LongPtr
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
    -----------------------------------------------------------------------------------------------------------------------------------
    Public Sub ShellWait(ByVal JobToDo As String)
        Dim hProcess As Long, RetVal As Long
    
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(JobToDo, vbMinimizedNoFocus))
        Do
            GetExitCodeProcess hProcess, RetVal
            DoEvents
            Sleep 100
        Loop While RetVal = STILL_ACTIVE
    End Sub
    De plus je ne comprend pas la ligne de code surligné en vert (et plus globalement tous le sub shellwait) j'ai chercher un peu de partout notamment sur le forum ou j'ai pu voir que je ne suis pas le seul a l'utiliser mais j'ai jamais trouver d'explication.

    Et troisième et dernière question: l'application plante également à un autre endroit sur la ligne de code:
    shell(cstr(execution))
    execution ayant la même valeur que dans le bout de code collé ci-dessus.
    Mais cela me semble logique vus que shell() est sensé exécuter un programme au bout d'un chemin d’accès et dans mon cas ce sont plutôt 3 chemins d’accès mi bout à bout. La fonction peut elle exécuter trois programmes à la fois? Si oui comment? Et quel est la différence entre:
    execution="sas.exe" et execution="""sas.exe"""??

    Merci en tous cas par avance pour toute information qui pourrait faire avancer le schmilblick.
    Cordialement,

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    août 2010
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 202
    Points : 304
    Points
    304

    Par défaut

    Bonjour,

    shellwait permet d'exectuer un programme et d'attendre qu'il se termine pour continuer

    La boucle avec GetExitCodeProcess attend l'info de savoir si le programme s'est terminé ou non

    La version d'Access est-elle bien en 64bits ?

    Shellwait sert ici à démarrer sas.exe avec des paramètres -sysin ..........sas -log .....log -sysparm ..............txt

    Ajouter la ligne debug.print execution juste avant l'appelle de shellwait et nous dire ce qui s'affiche exactement dans la fenetre execution de l'éditeur vba d'access

  3. #3
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    4 943
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 943
    Points : 10 494
    Points
    10 494

    Par défaut

    Bonjour.

    Les apis (declare function...) sont incorrectement définies.
    On a remplacé long par longPtr partout même là où il ne fallait pas, d'où le crash.

    Un peu de lecture :
    http://arkham46.developpez.com/artic...ice/vba64bits/


    Un double guillemet dans une chaîne de caractères devient un simple guillemet.
    On défini donc une commande "SAS.exe" avec les guillemets en en mettant trois de chaque côté.
    Les guillemets étant nécessaires pour une commande avec un espace par exemple, ici ce n'est pas nécessaire.

  4. #4
    Candidat au Club
    Homme Profil pro
    statisticien
    Inscrit en
    juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : statisticien
    Secteur : Santé

    Informations forums :
    Inscription : juin 2017
    Messages : 4
    Points : 3
    Points
    3

    Par défaut

    Bonjour à vous deux,

    Merci d'avoir pris le temps de répondre.

    Ma version Access est bien en 64bits alors que les personnes nous ayant fourni le programme travaillent me semble t-il en 32bits.

    J'ai ajouté la ligne debug.print execution juste avant le shellwait, le programme a beugué sur le shellwait, je vous met une copie d'écran en PJ ce sera peut etre plus clair.

    Les paramètres -sysin....sas, -log....log, -sysparm....txt ce sont des paramètres prédéfini d'access? Connaissez vos un bon tuto de la fonction shell/shellwait afin que je progresse? Sur internet les seules explications concernant ce sujet disent que la fonction shell s'utilise uniquement avec un chemin d'acces il n'est jamais question de paramètres.

    Pour toi Arkham le bug provient des déclarations des APIs? Connais tu des tutos sur le sujet, si possible accessible pour un novice? Idem pour la fonction OpenProcess que je ne comprends pas du tout.

    Encore merci à vous en tous cas pour l'aide déjà fourni.

    Cordialement,
    Fichiers attachés Fichiers attachés

  5. #5
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    4 943
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : septembre 2003
    Messages : 4 943
    Points : 10 494
    Points
    10 494

    Par défaut

    Bonjour,

    Pour 64bits j'ai déjà indiqué un tuto dans mon message précédent.
    On y trouve un lien vers les déclarations des api pour 64bits, il doit y avoir celles que tu utilises.
    Pour l'explication de openProcess je ne connais pas de tuto, mais sur le site de microsoft il y a la documentation (https://msdn.microsoft.com/en-us/lib...v=vs.85).aspx).

  6. #6
    Candidat au Club
    Homme Profil pro
    statisticien
    Inscrit en
    juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : statisticien
    Secteur : Santé

    Informations forums :
    Inscription : juin 2017
    Messages : 4
    Points : 3
    Points
    3

    Par défaut Un dernier coup de pouce

    Bonjour à tous,

    Merci Arkham, en effet il y avait des erreurs sur la déclaration des variables API, tes documents m'ont été d'une grande aide et j'ai pu corriger les API que j'ai trouvé.

    Cependant le programme ne fonctionne toujours pas, et cela provient probablement de la fonction openprocess. Je suspecte la commande shell à l’intérieur de ne pas fonctionner, en effet le message d'erreur est "fichier introuvable" ou qque chose comme ca.
    à l’intérieur de JobToDo il y a ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JobToDo = "SAS.exe"-sysin "C:\temp_registre\SAS\formulaire_filtre - 3.sas"-log "C:\temp_registre\SAS\formulaire_filtre - 3.log"-sysparm "C:\temp_registre\SAS\formulaire_filtre - 3.txt"
    Sachant qu'en suivant le chemin d'acces: C:\temp_registre\SAS\ le fichier .sas et le .txt existe. Je pense que le .log est la fenêtre du journal sas non?

    Pourrait tu m'aider à décrypter le shell?

    Galoir semblait dire que ce sont des paramètres ce qui n'est pas entre guillemet, mais des paramètres de quoi? sas? J'ai trouver de la documentation sur le sujet tendant à penser que ce sont des instructions sas mais est ce que Access le comprend?

    Est ce que la traduction de la commande shell est:
    Shell ("ouvre sas" avec le paramètre sysin "ouvre ce programme sas" ouvre le journal sas "journal qui est sensé se trouver ici" incrémente dans le log les paramètres du fichier txt "qui se trouve ici")

    Pour ouvrir sas ne faut il pas le chemin d'acces complet jusqu'au sas.exe ou est ce que de mettre sas.exe suffit pour qu'il le retrouve seul?

    Merci en tout cas de ton aide tu m'as déjà bien avancé.

    Cordialement

  7. #7
    Candidat au Club
    Homme Profil pro
    statisticien
    Inscrit en
    juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : statisticien
    Secteur : Santé

    Informations forums :
    Inscription : juin 2017
    Messages : 4
    Points : 3
    Points
    3

    Par défaut Pb résolu

    Re-bonjour,
    En effet il fallait remplacer "sas.exe" par le chemin complet jusqu’à sas et les "paramètres" étaient donc surement des fonctions sas.
    Désormais le programme fonctionne, merci beaucoup pour votre aide et de m'avoir aiguillé vers de bon tutos.
    Cordialement,

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 23/05/2016, 09h13
  2. Réponses: 4
    Dernier message: 30/06/2011, 13h27
  3. [Mail] erreur avec utilisation fonction mail
    Par taka10 dans le forum Fonctions
    Réponses: 7
    Dernier message: 12/07/2006, 16h19
  4. erreur avec la fonction putfile() sur connexion FTP
    Par stefane1981 dans le forum C++
    Réponses: 2
    Dernier message: 23/09/2005, 09h13
  5. Message d'erreur avec Bulk Insert
    Par Shivas dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 18/07/2005, 12h03

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