1. #1
    Futur Membre du Club
    Homme Profil pro
    geek
    Inscrit en
    mai 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : geek
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2017
    Messages : 9
    Points : 6
    Points
    6

    Par défaut Connection à SAP via VBA

    Bonjour
    j'ai besoin de me connecter a SAP pour effectuer des taches simples a intervalles réguliers
    j'utilise un code en VBA qui fonctionne bien, et dans ce code j'ai une partie qui concerne la connection


    sur la version de SAP 7.20 cela marche
    par contre sur la version 7.30 j'ai un soucis


    Est ce que quelqu'un aurait un code VBA fonctionnel ?
    ma machine est en WIN7 64bits, Pack Office 32bits

    ci dessous le code que jutilise

    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
    56
    Sub logonSAP()
    On Error Resume Next
    
     Application.DisplayAlerts = False
     
    If Not IsObject(SAP_applic) Then
        Set SapGuiAuto = GetObject("SAPGUI")
        Set SAP_applic = SapGuiAuto.GetScriptingEngine
    End If
     
     
    er = Err.Number
    On Error GoTo 0
     
    If er <> 0 Then
      er = 0
      On Error Resume Next
       
      Call Shell("C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", vbMinimizedFocus)
      Call Shell("C:\Program Files (x86)\SAP\FrontEnd\SAPGUI\saplogon.exe", vbMinimizedFocus)
      
      On Error GoTo 0
     
      er = 0
      On Error Resume Next
      If Not IsObject(SAP_applic) Then
        Set SapGuiAuto = GetObject("SAPGUI") 'Setting
        Set SAP_applic = SapGuiAuto.GetScriptingEngine
      End If
       
      er = Err.Number
      On Error GoTo 0
          
      If er <> 0 Then
        tmp = MsgBox("SAP Logon not installed on your system" & vbCrLf & _
          "Please install it using eSupport!", vbInformation)
        End
      End If
    End If
     
    'Set Connection = SAP_applic.OpenConnection("Mon choix")
    Set Connection = SAP_applic.openconnection(".Airbus Corporate Production   PAC")    '<========bug here with SAP 730 , but work sith SAP 720
    
    If Connection.Children.Count < 1 Then
    Exit Sub
    Else
    Set session = Connection.Children(0)
    End If
    
    session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = "nomuser"
    session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = "password"
    session.findById("wnd[0]/usr/txtRSYST-LANGU").Text = "FR"
    session.findById("wnd[0]").sendVKey 0
    
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2013
    Messages
    3 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : mai 2013
    Messages : 3 152
    Points : 5 306
    Points
    5 306

    Par défaut

    Bonjour,

    Est-ce que ".Airbus Corporate Production PAC" fait bien partie des choix de la fenêtre de logon SAP ?
    Si oui, il y a peut-être un problème au niveau des espaces.
    Peut-être qu'ils ont ajouté ou supprimer des espaces dans la nouvelle version (?)

    Ceci dit, je te remercie pour ton code qui vient de me donner une méthode de me brancher via SSO... Oh yes
    MPi²

  3. #3
    Futur Membre du Club
    Homme Profil pro
    geek
    Inscrit en
    mai 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : geek
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2017
    Messages : 9
    Points : 6
    Points
    6

    Par défaut

    Oui le texte est le bon,
    je l'ai récupéré d'un raccourci généré pas SAP lui même

    j'ai avancé depuis, et me suis rendu compte d'une chose
    ce code fonctionne avec SAP 7.30 mais avec une version plus récente 7.30 x xxx xxxx
    il a fallu mettre une pause de quelque seconde a un endroit aussi


    j'avais donc une version bugguée


    Le code il vient de ce topic
    https://www.developpez.net/forums/d1...sap-logon-vba/

  4. #4
    Futur Membre du Club
    Homme Profil pro
    geek
    Inscrit en
    mai 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : geek
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2017
    Messages : 9
    Points : 6
    Points
    6

    Par défaut

    ce code fonctionne
    testé sur win7 sap7.30 et win10 sap7.40

    il est plus sécurisé dans le sens ou le password n'est pas écrit en dur dans la macro


    le dernier soucis que j'ai c'est lorsque une connection avec le même user est déjà active sur un autre PC
    ce qui arrive rarement, mais bon...





    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    Sub logonSAP()
    On Error Resume Next
    
     Application.DisplayAlerts = False
     
    If Not IsObject(SAP_applic) Then
        Set SapGuiAuto = GetObject("SAPGUI")
        Set SAP_applic = SapGuiAuto.GetScriptingEngine
    End If
     
     
    er = Err.Number
    On Error GoTo 0
     
    If er <> 0 Then
      er = 0
      On Error Resume Next
       
      Call Shell("C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", vbMinimizedFocus)
      Call Shell("C:\Program Files (x86)\SAP\FrontEnd\SAPGUI\saplogon.exe", vbMinimizedFocus)
      
      Application.Wait Time + TimeSerial(0, 0, 5)
      
      On Error GoTo 0
     
      er = 0
      On Error Resume Next
      If Not IsObject(SAP_applic) Then
        Set SapGuiAuto = GetObject("SAPGUI") 'Setting
        Set SAP_applic = SapGuiAuto.GetScriptingEngine
      End If
       
      er = Err.Number
      On Error GoTo 0
          
      If er <> 0 Then
        tmp = MsgBox("SAP Logon not installed on your system" & vbCrLf & _
          "Please install it using eSupport!", vbInformation)
        End
      End If
    End If
     
    Set Connection = SAP_applic.openconnection(".Airbus Corporate Production   PAC")    
    
    If Connection.Children.Count < 1 Then
    Exit Sub
    Else
    Set session = Connection.Children(0)
    End If
    
    On Error Resume Next 'evite de planter sur le fichier pwd non present
    
    Dim pwd As String
    Open Environ("userprofile") & "\Documents\pwd.txt" For Input As #1
    Line Input #1, pwd                                                                          '  <=============the password is in this file
    Close #1
    
    'si le password n'a pas été trouve on alerte et on sort du programme
    If pwd = "" Then
    Application.WindowState = xlMaximized
    MsgBox "le mot de passe SAP PAC doit être stocké dans C:\Users\nz.....\Documents\pwd.txt"
    Dim RetVal As Variant
    RetVal = Shell("Taskkill /im saplogon.exe /f", 0) 'tue SAP
    Application.Quit        'quite excel
    End If
    
    session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = Environ("username")
    session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = pwd '"paasword"
    
    session.findById("wnd[0]/usr/txtRSYST-LANGU").Text = "FR"
    session.findById("wnd[0]").sendVKey 0
    
    End Sub

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2013
    Messages
    3 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : mai 2013
    Messages : 3 152
    Points : 5 306
    Points
    5 306

    Par défaut

    Ce n'est pas nécessaire d'appeler 2 fois le programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Call Shell("C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", vbMinimizedFocus)
      Call Shell("C:\Program Files (x86)\SAP\FrontEnd\SAPGUI\saplogon.exe", vbMinimizedFocus)
    De mon côté, j'ai utilisé une API pour chercher la fenêtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #If VBA7 Then
        Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    #Else
        Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    #End If
    Comme je travaille avec la version 7.40, mais que ça peut éventuellement changer, j'ai mis une constante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Const Titre As String = "SAP Logon 740"
    Et je cherche cette fenêtre durant 10 secondes max, au cas où la fenêtre change de nom et éviter la boucle sans fin
    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
        
        #If VBA7 Then
            Dim lhWnd As LongPtr
        #Else
            Dim lhWnd As Long
        #End If
    
        Dim SapGuiAuto As Object
        Dim Temps As Double
    
        Temps = Timer
        
        'Vérifier si la fenêtre Logon est ouverte - sinon l'ouvrir
        lhWnd = FindWindow(vbNullString, Titre)
        If lhWnd = 0 Then
            Call Shell("C:\Program Files (x86)\SAP\FrontEnd\SAPGUI\saplogon.exe", vbMinimizedFocus)
            Do
                lhWnd = FindWindow(vbNullString, Titre)
                If Timer - Temps > 10 Then  '10 secondes de délai pour ouvrir la fenêtre
                    MsgBox "Impossible d'ouvrir la fenêtre Logon de SAP", vbExclamation, ""
                    Exit Sub
                End If
            Loop Until lhWnd > 0
        End If
    Il me reste à peaufiner un peu, mais je sens que ça s'en vient.
    Je ne connaissais pas la commande OpenConnection qui me permet maintenant d'ouvrir une session SSO sans même devoir entrer les username, password,...
    Et je n'ai aucun On Error Resume Next (que j'évite autant que je peux)
    MPi²

  6. #6
    Futur Membre du Club
    Homme Profil pro
    geek
    Inscrit en
    mai 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : geek
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2017
    Messages : 9
    Points : 6
    Points
    6

    Par défaut

    tu pourras me montrer ta version finale si elle est en VBA ou VBS ?

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2013
    Messages
    3 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : mai 2013
    Messages : 3 152
    Points : 5 306
    Points
    5 306

    Par défaut

    Voici où j'en suis
    Ça reste à tester, mais ça semble bien fonctionner pour l'instant après plusieurs tests.

    Comme j'ouvre une connexion SSO, je n'ai pas à entrer de mot de passe UserID et autres...
    Il faut donc ajuster au besoin.

    La procédure est une Function qui retourne un booléen (True si logué, False si problème...)

    En entête de module
    Déclaration de l'API pour trouver la fenêtre de logon, déclaration des objets SAP et Titre de la fenêtre de logon à modifier au besoin
    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
    Option Explicit
    
    #If VBA7 Then
        Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    #Else
        Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    #End If
    
    Const Titre As String = "SAP Logon 740" 'Changer au besoin
    
    Public SapGuiAuto As Object
    Public AppliSAP As Object
    Public Connection As Object
    Public Session As Object
    Public TmpSession As Object
    Appel
    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
    Sub Requete()
        If Not logonSAP Then Exit Sub
        
        MsgBox "OK"
        
    '######################################
    
    'Traitement    ........................
    
    '######################################
        
        Set Connection = Nothing
        Set AppliSAP = Nothing
        Set Session = Nothing
        Set TmpSession = Nothing
        Set SapGuiAuto = Nothing
        
    End Sub
    Et la Function de log
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Function logonSAP() As Boolean
        #If VBA7 Then
            Dim lhWnd As LongPtr
        #Else
            Dim lhWnd As Long
        #End If
    
        Dim Temps As Double
        
        On Error GoTo Erreur
        
        Temps = Timer
        
        'Vérifier si la fenêtre Logon est ouverte - sinon l'ouvrir
        lhWnd = FindWindow(vbNullString, Titre)
        If lhWnd = 0 Then
            Call Shell("C:\Program Files (x86)\SAP\FrontEnd\SAPGUI\saplogon.exe", vbMinimizedFocus)
            Do
                lhWnd = FindWindow(vbNullString, Titre)
                If Timer - Temps > 10 Then  '10 secondes de délai pour ouvrir la fenêtre sinon on sort
                    MsgBox "Impossible d'ouvrir la fenêtre SAP Logon", vbExclamation, ""
                    Exit Function
                End If
            Loop Until lhWnd > 0
        End If
        
        If AppliSAP Is Nothing Then
            Set SapGuiAuto = GetObject("SAPGUI")
            Set AppliSAP = SapGuiAuto.GetScriptingEngine
        End If
         
        'Ouverture d'une session PRD - SSO
        If Connection Is Nothing Then
            Set Connection = AppliSAP.OpenConnection("PRD - SSO")   'Changer au besoin
        End If
        
        'Délai de 3 secondes pour ouverture de la fenêtre SAP - Ajuster selon systèmes...(?)
        '2 secondes n'est pas toujours suffisant dans mon cas
        Application.Wait Now + TimeSerial(0, 0, 3)
        
        'Choisir la Session PRD non utilisée, si ouverte
        If Not Connection.DisabledByServer And Left(Connection.Description, 3) = "PRD" Then
            For Each TmpSession In Connection.Children
                If TmpSession.Busy = False Then
                    Set Session = TmpSession
                End If
            Next
        End If
        
        If Session Is Nothing Then
            MsgBox "Impossible de trouver une session libre", vbExclamation, "?!?"
            Set TmpSession = Nothing
            Set Connection = Nothing
            Set AppliSAP = Nothing
            Set SapGuiAuto = Nothing
            Exit Function
        Else
            logonSAP = True
        End If
            
        Exit Function
    Erreur:
        MsgBox Err.Number & vbCrLf & Err.Description
        Stop    'pour débogage - F8 passe à la ligne suivante
        Resume  'F8 se rend sur la ligne en défaut
        
    End Function
    MPi²

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2013
    Messages
    3 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : mai 2013
    Messages : 3 152
    Points : 5 306
    Points
    5 306

    Par défaut

    Le code que j'ai mis n'est pas concluant...
    Je vais revenir dès que je peux avec quelque chose de plus "béton"
    MPi²

  9. #9
    Futur Membre du Club
    Homme Profil pro
    geek
    Inscrit en
    mai 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : geek
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2017
    Messages : 9
    Points : 6
    Points
    6

    Par défaut

    en effet
    je n'ai pas réussi a le faire fonctionner correctement

    par contre je n'ai pas SSO, mais même en l'adaptant

    je suis moi aussi sur du 7.40 maintenant

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2013
    Messages
    3 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : mai 2013
    Messages : 3 152
    Points : 5 306
    Points
    5 306

    Par défaut

    Il y avait un bogue si SAP était ouvert et qu'on re-roulait la macro.
    Rien de bien grave, mais avec ce code, ça devrait passer mieux.


    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Function logonSAP() As Boolean
        #If VBA7 Then
            Dim lhWnd As LongPtr
        #Else
            Dim lhWnd As Long
        #End If
        Dim Temps As Double
        
        On Error GoTo Erreur
        
        'Vérifier si la fenêtre Logon est ouverte - sinon l'ouvrir
        Temps = Timer
        lhWnd = FindWindow(vbNullString, Titre)
        If lhWnd = 0 Then
            Call Shell("C:\Program Files (x86)\SAP\FrontEnd\SAPGUI\saplogon.exe", vbMinimizedFocus)
            Do
                lhWnd = FindWindow(vbNullString, Titre)
                If Timer - Temps > 10 Then  '10 secondes de délai pour ouvrir la fenêtre sinon on sort
                    MsgBox "Impossible d'ouvrir la fenêtre SAP Logon", vbExclamation, ""
                    Exit Function
                End If
            Loop Until lhWnd > 0
        End If
        
        If AppliSAP Is Nothing Then
            Set SapGuiAuto = GetObject("SAPGUI")
            Set AppliSAP = SapGuiAuto.GetScriptingEngine
        End If
         
        'Ouverture d'une session PRD - SSO
        'Si SAP est déjà  ouvert, on cherche une session libre
        If AppliSAP.Connections.Count > 0 Then
            For Each Connection In AppliSAP.Children
                If Not Connection.DisabledByServer And Left(Connection.Description, 3) = "PRD" Then
                    For Each TmpSession In Connection.Children
                        If TmpSession.Busy = False Then
                            Set Session = TmpSession
                            logonSAP = True
                            Exit Function
                        End If
                    Next
                End If
            Next
        Else
            'Si SAP est fermé
            Set Connection = AppliSAP.OpenConnection("PRD - SSO")   'Changer au besoin
            Temps = Timer
            Do
                Set Session = Connection.Sessions(0)
                If Timer - Temps > 10 Then
                    MsgBox "Impossible de créer une session", vbExclamation, ""
                    Exit Function
                End If
            Loop While Session Is Nothing
        End If
        
        
        If Session Is Nothing Then
            MsgBox "Impossible de trouver une session libre", vbExclamation, "?!?"
            Set TmpSession = Nothing
            Set Connection = Nothing
            Set AppliSAP = Nothing
            Set SapGuiAuto = Nothing
            Exit Function
        Else
            logonSAP = True
        End If
            
        Exit Function
    Erreur:
        MsgBox Err.Number & vbCrLf & Err.Description
        Stop    'pour débogage - F8 passe à la ligne suivante
        Resume  'F8 se rend sur la ligne en défaut
        
    End Function
    MPi²

Discussions similaires

  1. VBA connecté à SAP
    Par Val2000 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/10/2013, 17h52
  2. Réponses: 1
    Dernier message: 03/01/2010, 12h49
  3. Réponses: 1
    Dernier message: 31/12/2009, 11h22
  4. Comment piloter SAP via VBA Access ?
    Par megapacman dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/08/2008, 14h12
  5. [JDBC]connection à db2 via websphere
    Par mlequim dans le forum JDBC
    Réponses: 23
    Dernier message: 06/07/2005, 15h22

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