Odczyt informacji z systemu SAP za pomoca makra VBA
Ponieważ w ostatnim czasie kilka osób pytało mnie o sposób połączenia makr VBA wykorzystywanych w MS Office z systemami SAP, postanowiłem opisać prosty przykład takiego połączenia. Kilka miesięcy temu opracowałem go sobie na własny użytek. Skorzystałem z dokumentacji SAP i materiałów dostępnych w Internecie. Zakładam, że ktokolwiek chciałby skorzystać z mojego przykładu, zna podstawy pisania makr Visual Basic for Applications i wie co to są obiekty BAPI.
W omawianym przykładzie, makro VBA wykonywane w dokumencie Worda pozwala na odczyt podstawowych informacji na temat dokumentu sprzedaży (ang. sales order). Makro jest wykonywane na komputerze z zainstalowanym MS Office 2003 Pro i programem SAPGUI (dzięki temu zainstalowane są odpowiednie kontrolki). W moim przypadku zainstalowane było SAPGUI 710.
Poniżej pokazany jest dokument, w którym wykonujemy makro. Uruchomienie makra spowoduje pojawienie się widocznego na poniższym zrzucie ekranu okienka logowania (wykorzystywana jest kontrolka ActiveX). Informacje o systemach odczytywane są z SAPGUI.
Wystarczy, że zalogujemy się do wybranego systemu podając użytkownika i hasło.
Po podaniu danych do zalogowania, system odczyta informacje o wybranym dokumencie.
Porównując odczytane dane z zamówieniem widocznym na poniższym zrzucie ekranu, widać że makro poprawnie odczytało dane.
W tym przykładzie dokument był zdefiniowany w makrze, ale każdy, kto zna makra będzie wiedział jak je rozbudować i np. przed odczytem danych poprosić użytkownika o podanie numeru dokumentu. Można też zdefiniować parametry logowania, choć ze względów bezpieczeństwa lepiej wymuszać logowanie przed pobraniem danych.
Samo makro jest bardzo proste i wygląda tak:
Option Explicit
Public Sub WstawInfo()
Dim MyText1, MyText2, MyText3, MyText4, MyText5 As String
Dim MyRange, oBAPICtrl, oBAPILogon, oSalesOrder As Object
Dim SalesOrderNr As String
Set MyRange = ActiveDocument.Range
‘ Inicjalizacja kontrolki SAP ActiveX.
Set oBAPICtrl = CreateObject(”sap.bapi.1″)
‘ Inicjowanie kontrolki logowania SAP ActiveX
Set oBAPILogon = CreateObject(”sap.logoncontrol.1″)
‘ Inicjalizacja obiektu logowania.
Set oBAPICtrl.Connection = oBAPILogon.NewConnection
oBAPICtrl.Connection.Logon
‘odczytanie informacji o danym dokumencie (w tym przykładzie “0000012070″)
SalesOrderNr = “0000012070″
Set oSalesOrder = oBAPICtrl.GetSAPObject(”SalesOrder”, SalesOrderNr)
‘Odczyt informacji
MyText1 = “Dokument: ” & oSalesOrder.salesdocument & Chr(13)
MyText2 = “Wartość netto: ” & oSalesOrder.netvalue & Chr(13)
MyText3 = “Numer klienta: ” & oSalesOrder.orderingparty.customerno & Chr(13)
MyText4 = “Data dokumentu: ” & oSalesOrder.documentdate & Chr(13)
MyText5 = “Ilość pozycji w dokumencie: ” & oSalesOrder.items.Count & Chr(13)
MyRange.InsertAfter (MyText1)
MyRange.InsertAfter (MyText2)
MyRange.InsertAfter (MyText3)
MyRange.InsertAfter (MyText4)
MyRange.InsertAfter (MyText5)
‘wylogowanie i zamkniecie obiektu
oBAPICtrl.Connection.Logoff
Set oBAPILogon = Nothing
Set oBAPICtrl = Nothing
End Sub
Możemy je łatwo rozbudowywać odczytując dodatkowe informacje o obiekcie. Pomocna w tym zakresie będzie znajomość obiektów BAPI. Przy stosunkowo podstawowej wiedzy z zakresu programowania obiektowego dużo użytecznych informacji o obiektach BAPI odczytamy uruchamiając transakcję BAPI.
Załączony powyżej zrzut (najlepiej kliknąć na nim i zobaczyć w powiększeniu) zawiera listę atrybutów dla Sales Order. W przedstawionym przykładzie wykorzystałem tylko niektóre z nich.






