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 :

Access et logiciel externe


Sujet :

VBA Access

  1. #1
    Membre du Club Avatar de lolo_bob2
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 195
    Points : 56
    Points
    56
    Par défaut Access et logiciel externe
    Bonjour à tous

    Voila je developpe une base de données access pour l'entreprise où je suis en stage !!
    On me demande si il est possible de faire un lien vers une autre base de données plus complexe qui est SAP (pour ceux qui ne connaisse pas c'est un logiciel qui gère les stocks, les ordres de fabrication...)
    Est-il possible de réaliser des liens sur ce logiciel ?
    Pouvez vous m'aider car là je sèche ?

    je vous remercie
    A+

  2. #2
    Responsable Access

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    slt,

    si tu veux acceder directement à la base de données de SAP je ne peux pas t'aider...

    par contre si l'équipe de développement SAP peut développer un module fonction RFC pour que tu puisses l'appeler via la SAPGui, alors là j'ai du code pour appeler une RFC dans Access (il suffit que le SAPGui soit installé sur le PC pour pouvoir utiliser un objet SAP.Functions)

  3. #3
    Membre du Club Avatar de lolo_bob2
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 195
    Points : 56
    Points
    56
    Par défaut
    Ok merci beaucoup

    Mais je comprend pas tout ce que tu me raconte

    Peux tu m'en dire plus sur ce qu'est un module fonction RFC et SAPGui ?
    SAP je connais pas de trop....


    Merci beaucoup

    A+

  4. #4
    Responsable Access

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    SAP est une architecture client-serveur avec 3 couches :
    - L'interface utilisateur, c'est le SAPGui
    - Le ou les serveur(s) d'application, c'est eux qui font tourner la bête
    - Le serveur de base de données, avec Oracle ou autre...

    Si tu veux accèder aux données tu dois pouvoir te connecter directement à la base de données mais je ne sais pas comment (peut-être ODBC...).
    Mais il est hors de question d'y faire des modifications de données.
    Et il est récommandé d'y accéder via l'interface utilisateur, même pour des lectures (je n'ai jamais vu une seule interface qui attaque directement la base de données de SAP, mais bon peut-être que ça existe...).

    Sinon tu peux utiliser le SAPGui qui va lancer une fonction sur le serveur d'application pour lire les données dans la base.
    Tu récupères alors tes données dans VBA dans un tableau.

    Pour te connecter à SAP depuis Access il faut installer le SAPGui (c'est une application windows classique) et ça te donne accès à un objet SAP.Functions que tu peux utiliser dans tes développements (de la même manière qu'un objet Excel.Application par exemple).
    Il te faut donc également un login et un password (si c'est pour un utilisateur qui a déjà SAP, il doit déjà avoir le SAPGui et un login).
    Et tu dois savoir quelle fonction exécuter dans SAP et quels sont ses paramètres.

    De toute façon on doit te donner les informations nécessaires sinon tu ne peux rien faire.

    Que veux-tu faire? Lire des données?
    Pour lire des données d'une table il existe déjà une fonction RFC dans SAP.
    Mais pour un besoin plus complexe (données de plusieurs tables) il vaut mieux une fonction SAP spécifique qui te renvoie les données que tu souhaites.

    Par exemple si on te demande d'intégrer dans Acces la liste des commandes d'achat non facturées, alors c'est l'équipe SAP qui doit faire une fonction qui va lire les commandes dans SAP et elle te donne ensuite le nom de la fonction, ses paramètres et la structure des tables renvoyées.

    Essaye de te rapprocher de l'équipe SAP pour en discuter.

    Ensuite si tu pars sur une solution avec une fonction RFC et si tu as besoin du code Access pour lancer la function dans SAP, je rechercherai la base Access dans lequel je l'avais fais.

    Bon courage.

  5. #5
    Membre du Club Avatar de lolo_bob2
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 195
    Points : 56
    Points
    56
    Par défaut
    Ok merci beaucoup

    Je vais essayer de me rapprocher de l'équipe SAP

    Apparemment un personne du site arrive à extraire des données de SAP vers excel...
    Je sais pas si ca peux m'aider je vais aller me renseigner....

    En tout cas merci beaucoup

    Affaire à suivre ....

    A+

  6. #6
    Membre du Club Avatar de lolo_bob2
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 195
    Points : 56
    Points
    56
    Par défaut
    Salut

    Pourrais tu me donner le code que tu utilise pour appeler une RFC dans Access ?!!

    Je te remercie beaucoup

    A+

  7. #7
    Responsable Access

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    slt,

    voilà une fonction pour lire les données d'une table SAP (dans ce cas c'était pour lire une table unique spécifique donc j'utilisais une fonction SAP standard) et remplir la table Access pour les champs correspondants.

    Les données du système et du login était dans une table; si tu ne remplit pas l'objet R3.Connection une fenêtre s'ouvre pour que tu choisisses le système et le lgin/mot de passe.

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    '*********************************************************************************************************************************************************************************
    ' Lit les données de la table w_table_sap dans le systéme w_system avec le filtre w_filtre (une seule ligne à ce jour) et déverse les données dans la table ACCESS wt_table_access
    '*********************************************************************************************************************************************************************************
    Function rfc_read_table(w_system As String, w_table_access As String, w_table_sap As String, w_filtre As String) As Integer
    Dim R3, MyFunc, App As Object
    Dim SEL_TAB, NAMETAB, TABENTRY, ROW, champs As Object
    Dim rs, system As DAO.Recordset
    Dim cpt_err As Integer ' nb d'imports en erreur
    Dim cpt_imp As Integer ' nb d'imports en succès
    Dim w_date As String   ' tampon pour mise en forme des date SAP vers ACCESS
    Dim Result As Boolean
    Dim Export1 As Object
    Dim Export2 As Object
    Dim Export3 As Object
    Dim w_champs As Variant
     
    Set system = CurrentDb.TableDefs("systemes").OpenRecordset(dbOpenSnapshot, dbReadOnly)
    system.FindFirst "system = '" & w_system & "'"
    '*********************************************
    'Create Server object and Setup the connection
    '*********************************************
    Set R3 = CreateObject("SAP.Functions")
    R3.Connection.system = Nz(system!system)
    R3.Connection.HostName = Nz(system!HostName)
    R3.Connection.SystemNumber = Nz(system!SystemNumber)
    R3.Connection.client = Nz(system!client)
    R3.Connection.User = Nz(system!User)
    R3.Connection.Password = Nz(system!Password)
    R3.Connection.language = Nz(system!language)
    If R3.Connection.logon(0, True) <> True Then
        MsgBox "Erreur de connexion à " & system!system, vbCritical
        system.Close
        Exit Function
    End If
    '*******************************************
    'Call RFC function TABLE_ENTRIES_GET_VIA_RFC
    '*******************************************
    Set MyFunc = R3.Add("TABLE_ENTRIES_GET_VIA_RFC")
    On Error Resume Next
    Set Export1 = MyFunc.exports("LANGU")
    If Err.Number = 91 Then
        On Error GoTo 0
        MsgBox "Fonction TABLE_ENTRIES_GET_VIA_RFC n'existe pas sur " & Nz(system!system)
        system.Close
        R3.Connection.LOGOFF
        Exit Function
    End If
    On Error GoTo 0
    system.Close
    Set Export2 = MyFunc.exports("ONLY")
    Set Export3 = MyFunc.exports("TABNAME")
    Export1.Value = "F"
    Export2.Value = ""
    Export3.Value = w_table_sap
    Set SEL_TAB = MyFunc.Tables("SEL_TAB")
    If w_filtre <> "" Then
        SEL_TAB.rows.Add
        SEL_TAB.Value(1, "ZEILE") = w_filtre
    End If
    Result = MyFunc.Call
    If Result = True Then
      Set NAMETAB = MyFunc.Tables("NAMETAB")
      Set TABENTRY = MyFunc.Tables("TABENTRY")
    Else
        MsgBox MyFunc.EXCEPTION
        R3.Connection.LOGOFF
        Exit Function
    End If
    '***********************
    'Remplit la table ACCESS
    '***********************
    If w_table_access <> "" Then ' Remplit la table ACCESS si paramètre rempli
    Set rs = CurrentDb.OpenRecordset(w_table_access)
    For Each ROW In TABENTRY.rows
    rs.AddNew
      For Each champs In NAMETAB.rows
        On Error Resume Next
        If champs("INTTYPE") = "D" Then
        w_date = Mid(ROW("ENTRY"), champs("OFFSET") + 1, champs("INTLEN"))
        If w_date <> "" Then rs.Fields(champs("FIELDNAME")).Value = Mid(w_date, 7, 2) & "/" & Mid(w_date, 5, 2) & "/" & Mid(w_date, 1, 4)
        Else
        w_champs = Mid(ROW("ENTRY"), champs("OFFSET") + 1, champs("INTLEN"))
        If w_champs <> Space(champs("INTLEN")) Then rs.Fields(champs("FIELDNAME")).Value = Trim(Mid(ROW("ENTRY"), champs("OFFSET") + 1, champs("INTLEN")))
        End If
        If Err.Number = 3265 And champs("FIELDNAME") <> "MANDT" Then ' Pas de champs correspondant dans ACCESS
            SysCmd acSysCmdSetStatus, "Pas de champs " & champs("FIELDNAME") & " dans ACCESS!"
         ElseIf Err.Number <> 0 And champs("FIELDNAME") <> "MANDT" Then
            MsgBox "Table " & w_table_sap & " :" & "L" & ROW.ROW & ":" & champs("FIELDNAME") & " : " & Err.Description
        End If
        On Error GoTo 0
      Next
    On Error Resume Next
    rs.Update
    If Err.Number = 3022 Then
            cpt_err = cpt_err + 1
     ElseIf Err.Number <> 0 Then
            MsgBox "Table " & w_table_sap & " :" & "L" & ROW.Index & ":" & Err.Description
     Else
            cpt_imp = cpt_imp + 1
    End If
    On Error GoTo 0
    Next
    rs.Close
    If cpt_err > 0 Then MsgBox "Info : Table " & w_table_sap & " :" & cpt_err & " enregistrement(s) non importé(s) car déjà dans la base..."
    If cpt_imp > 0 Then MsgBox "Table " & w_table_sap & " : " & cpt_imp & " objets importés"
    End If ' w_table_access <> ""
    R3.Connection.LOGOFF
    rfc_read_table = cpt_imp
    End Function
    Et une autre fonction qui lance une fonction SAP spécifique pour mettre à jour une table SAP en fonction de données d'Access :
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    '******************************************************
    ' Met à jour SAP avec les lignes de suivi en KO ou OK_C
    '******************************************************
    Function rfc_maintain_table(w_system As String) As Integer
    ' Pour le master on charge tous
    ' Pour les autres systèmes on ne charge que les données du système
    Dim R3, MyFunc, App As Object
    Dim AUDIT, Rque, ENTRIES As Object
    Dim rs, rs2, system As DAO.Recordset
    Dim Result As Boolean
    Dim Export1 As Object
    Dim Export2 As Object
    Dim Export3 As Object
    Dim pos As Integer
    Dim cpt As Integer
    Dim valeur As Variant
    Dim ligne As Variant
    Const taille_ligne As Integer = 100
     
    Set system = CurrentDb.TableDefs("systemes").OpenRecordset(dbOpenSnapshot, dbReadOnly)
    system.FindFirst "system = '" & w_system & "'"
    'Create Server object and Setup the connection
    Set R3 = CreateObject("SAP.Functions")
    R3.Connection.system = Nz(system!system)
    R3.Connection.HostName = Nz(system!HostName)
    R3.Connection.SystemNumber = Nz(system!SystemNumber)
    R3.Connection.client = Nz(system!client)
    R3.Connection.User = Nz(system!User)
    R3.Connection.Password = Nz(system!Password)
    R3.Connection.language = Nz(system!language)
    If R3.Connection.logon(0, True) <> True Then
        MsgBox "Erreur de connexion à " & system!system, vbOKOnly
        system.Close
        Exit Function
    End If
    'Call RFC function RFC_CALL_TRANSACTION
    Set MyFunc = R3.Add("Z_AUDIT_MAINTAIN")
    On Error Resume Next
    Set AUDIT = MyFunc.Tables("AUDIT")
    Set Rque = MyFunc.Tables("RQUE")
    If Err.Number = 91 Then
        On Error GoTo 0
        MsgBox "Fonction Z_AUDIT_MAINTAIN n'existe pas sur " & Nz(system!system)
        R3.Connection.LOGOFF
        Exit Function
    End If
    system.Close
    On Error GoTo 0
    ' Recordset des lignes de suivi en KO ou OK_C
    Set rs = CurrentDb.OpenRecordset("select * from suivi where " & IIf(w_system = CurrentDb.Properties("Master"), "", "syst ='" & w_system & "' and ") & "not isnull(auditdate)")
    If rs.RecordCount = 0 Then Exit Function
    ' Recordset des champs à extraire vers SAP
    Set rs2 = CurrentDb.OpenRecordset("extract_sap_audits")
    rs.MoveFirst
    While Not rs.EOF
    AUDIT.rows.Add
        rs2.MoveFirst
        While Not rs2.EOF
            valeur = rs.Fields(rs2!champs).Value
            If Not IsNull(valeur) And valeur <> "" And valeur <> " " Then
                ' Gestion des remarques
                If Left(rs2!champs, 4) = "rque" Then
                    valeur = Replace(valeur, Chr(10), "") 'Vire les retours chariots
                    cpt = 1
                    Do
                    ' Recherche les sauts de ligne
                    pos = InStr(1, valeur, Chr(13))
                    If pos = 0 Then
                        ligne = valeur
                    Else
                        ligne = Left(valeur, pos - 1)
                        valeur = Right(valeur, Len(valeur) - pos)
                    End If
                    ' Split les lignes suivant taille_ligne
                    If Len(ligne) > taille_ligne Then
                        Do
                            Rque.rows.Add
                            Rque.Value(Rque.rows.Count, "SYST") = rs!syst
                            Rque.Value(Rque.rows.Count, "TRKORR") = rs!trkorr
                            Rque.Value(Rque.rows.Count, "OBJECT") = rs!object
                            Rque.Value(Rque.rows.Count, "OBJ_NAME") = rs!obj_name
                            Rque.Value(Rque.rows.Count, "NUM") = cpt
                            Rque.Value(Rque.rows.Count, "TEXTE") = Left(ligne, taille_ligne)
                            Rque.Value(Rque.rows.Count, "TYPE") = UCase(rs.Fields(rs2!champs).Name)
                            If Len(ligne) <= taille_ligne Then Exit Do
                            cpt = cpt + 1
                            ligne = Right(ligne, Len(ligne) - taille_ligne)
                        Loop
                    Else
                        Rque.rows.Add
                        Rque.Value(Rque.rows.Count, "SYST") = rs!syst
                        Rque.Value(Rque.rows.Count, "TRKORR") = rs!trkorr
                        Rque.Value(Rque.rows.Count, "OBJECT") = rs!object
                        Rque.Value(Rque.rows.Count, "OBJ_NAME") = rs!obj_name
                        Rque.Value(Rque.rows.Count, "NUM") = cpt
                        Rque.Value(Rque.rows.Count, "TEXTE") = ligne
                        Rque.Value(Rque.rows.Count, "TYPE") = UCase(rs.Fields(rs2!champs).Name)
                    End If
                    If pos = 0 Then Exit Do
                    cpt = cpt + 1
                    Loop
                Else
                    AUDIT.Value(AUDIT.rows.Count, rs.Fields(rs2!champs).Name) = Trim(valeur)
                End If
            End If
            rs2.MoveNext
        Wend
        rs.MoveNext
    Wend
    rs.Close
    rs2.Close
    Result = MyFunc.Call
    If Result = True Then
      Set ENTRIES = MyFunc.Imports("ENTRIES")
      rfc_maintain_table = ENTRIES
    Else
        MsgBox MyFunc.EXCEPTION
        R3.Connection.LOGOFF
        Exit Function
    End If
    'Quit the SAP Application
    R3.Connection.LOGOFF
    End Function

  8. #8
    Membre du Club Avatar de lolo_bob2
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 195
    Points : 56
    Points
    56
    Par défaut
    Ok merci beaucoup

    Une autre question me vient. Quelle est la tête de ton formulaire ? je suppose que tu dois bien avoir une interface qui te permet de lancer la requete vers SAP ?

    Peux tu m'en dire un peu plus ?

    Merci beaucoup

  9. #9
    Responsable Access

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par lolo_bob2
    Ok merci beaucoup

    Une autre question me vient. Quelle est la tête de ton formulaire ? je suppose que tu dois bien avoir une interface qui te permet de lancer la requete vers SAP ?

    Peux tu m'en dire un peu plus ?

    Merci beaucoup
    le formulaire est classique:
    - il a une table en source de données
    - un bouton qui lance la fonction pour mettre à jour cette table
    - et après, un requery du formulaire peut être nécessaire pour remettre à jour l'affichage des données

  10. #10
    Membre du Club Avatar de lolo_bob2
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 195
    Points : 56
    Points
    56
    Par défaut
    ok merci beaucoup

    Là je suis vraiment novice dans ce domaine je connais juste les bases d'access...
    pourrais tu me faire un imprim ecran de ton formulaire ou si tu peux m'envoyer la source à moins que se soit confidentiel...
    Sinon envoie moi en Mail Perso...

    Merci beaucoup ! tu es vraiment d'une très grande aide !! car la je commencais a m'arracher les cheveux...

    A+

  11. #11
    Responsable Access

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    slt,

    non, je ne préfère pas envoyer la base (à cause des données et tout ça, mais aussi du code fait il y a trois ans que je ne préfère pas montrer )

    mais bon ce n'est de toute façon qu'une application qui répond à un besoin bien spécifique, avec son lot de tables et de formulaires

    la partie connexion à SAP ne représente pas grand chose hormis les deux précédentes fonctions

    si tu as besoin d'un exemple de base de données il y en a fournie avec Access (la base comptoir), bien plus simple pour débuter que mon usine à gaz de toute façon

Discussions similaires

  1. Sortie graphique Java gérée par un logiciel externe ?
    Par Jimalexp dans le forum Général Java
    Réponses: 2
    Dernier message: 11/01/2009, 17h55
  2. Site en Intranet - Exécuter un logiciel externe
    Par frutix dans le forum Mon site
    Réponses: 5
    Dernier message: 25/08/2008, 10h30
  3. Estimation de pentes avec logiciels externes
    Par BenAbda dans le forum Excel
    Réponses: 6
    Dernier message: 07/06/2008, 23h34
  4. Réponses: 8
    Dernier message: 22/05/2007, 15h20
  5. Réponses: 17
    Dernier message: 07/02/2007, 14h39

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