konto usunięte

Temat: EXCEL - generowanie raportu z SAP

Witam
Mam taki koncept:
Za pomocą VBA chcę wykonać następujące operację:
1. Zalogowanie do SAP (jawne, do pulpitu)
2. Uruchomienie transakcji (COOIS)
3. Uzyskanie raportu o określonym układzie
4. Transfer do pliku lokalnego
5. Wczytanie do EXCELA i obrobienie.

punkt 5 - może być prosty, ale użycie EXCELA i VBA do wykonania 4 pierwszych punktów jest dla mnie za trudne.

punkty 2 do 4 można zastąpić skryptem nagranym w SAP, ale nadal brak mi połączenia z EXCELem - czyli zalogowania (i ewentualnie wybrania skryptu)

Czy ktoś próbował takich zabaw z SAPem? Może mi ktoś udzielić rad...lub wkleić jakieś fragmenty kodu?

Nie chcę się bawić w wyciąganie danych z SAP poprzez obiekty BAPI, bo działa za wolno. A gotowy raport można w kilka minut wyświetlić.

Proszę o wsparcie i z góry dziękuję.

poniższy kod loguje do SAP, ale bez wyświetleia pulpitu.
Sub retrieve_table_contents()

Dim R3, MyFunc, App As Object
Dim SEL_TAB, NAMETAB, TABENTRY, ROW As Object
Dim Result As Boolean
Dim iRow, iColumn, iStart, iStartRow As Integer

iStartRow = 4

Worksheets(1).Select
Cells.Clear

'**********************************************
'Create Server object and Setup the connection
'**********************************************
Set R3 = CreateObject("SAP.Functions")
R3.Connection.client = "100"
R3.Connection.user = "xxxxxxx"
R3.Connection.Password = "12345678"
R3.Connection.Language = "EN"

If R3.Connection.LOGON(0, False) <> True Then
Exit Sub
End If
End SubBartłomiej Czapiga edytował(a) ten post dnia 02.11.08 o godzinie 18:10
Kacper W.

Kacper W. Specjalista SAP
SD/MM

Temat: EXCEL - generowanie raportu z SAP

Cześć,

Próbowałeś może SAP API
SAP GUI Scripting API 7.10

Ja używam do automatyzacji do kilku procesów
(zrzucanie danych do XLS, zakładanie nowych art)

Polega to mniej więcej na nagraniu MACRO i odwarzaniu go (po wcześniejszym przerobieniu w edytorze makr w Excelu.

naprawdę polecam

Aha - admin musi taka funkcje odblokować!

pozdrawiam
Kacper

konto usunięte

Temat: EXCEL - generowanie raportu z SAP

Witam

To próbowałem, używam. Ale do zrzucania danych. Nagrywam makro w SAPie i odpalam w SAPie.

Ale nie wiem jak mu zapodać czytanie danych z EXCELA.
Nie wiem też, jak go odpalić z Excela.
Może wkleisz kawałek kodu VB dla analizy? "raczkuję" w VB, więc sam nie sklecę nowego kodu (mogę się pobawić w edycję)

Nowe artykuły zakładam za pomocą ładowania wsadowego z pliku CSV, ale jest to dobre, jak trzeba założyć kilkadziesiąt i więcej materiałów. Ale dla kilku - lepiej ręcznie wstukać dane. Natomiast skrypt z EXCELa na pewno by przyspieszył proces ładowania.

Pozdrawiam
Bartek
Kacper W.

Kacper W. Specjalista SAP
SD/MM

Temat: EXCEL - generowanie raportu z SAP

Witam,

najważniejszy jest początek

1. Musisz byc zalogowany w SAP (można sobie też napisać skrypt logujący - narazie nie umiem ale mam jakieś przykłady i kiedyś zrobie).
2. Jak mówiłem - Pracuje używając SAP API (czyli nie jakos tam w tle tylko SAP powtarza czynnosci usera)

Poniżej MAKRO z XLS

Sub MB52()

'sktypt "dobiera" się do SAP
'ważne! - domyślnie sktypt SAP stosuje słowo "Aplication" i 'powoduje to błąd w xls - zmien na inne dowolne słowo (u mnie np LRW)

If Not IsObject(lrw) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set lrw = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
Set Connection = lrw.Children(0)
End If
If Not IsObject(session) Then
Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject session, "on"
WScript.ConnectObject lrw, "on"
End If

'tu ważne - maximaze - robi wszystko na ekranie = wolniej
'Iconify - minimalizuje okna - u mnie tak 30-40% szybsze

'session.findById("wnd[0]").maximize
session.findById("wnd[0]").Iconify

session.findById("wnd[0]/tbar[0]/okcd").Text = "mb52"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/txt[1]").SetFocus
session.findById("wnd[0]/usr/txt[1]").caretPosition = 0
session.findById("wnd[0]/usr/txt[1]").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[0]").sendVKey 43
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/usr/sub/1/rad[0,0]").Select
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press

ChDir "C:\temp\MM"
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:= _
"C:\temp\MM\StockData.xls", FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False

ActiveWorkbook.Close
session.findById("wnd[0]/tbar[0]/btn[15]").press
session.findById("wnd[0]/tbar[0]/btn[15]").press

End Sub

To powinno zadziałać u Ciebie bez problemu.

Proponuję uruchomić makto F8 i krok po kroku sprawdzać co robi.

Oczywiście musi być katalog C:\temp\MM

Daj znać czy działa.
pozdrawiam
Kacper

konto usunięte

Temat: EXCEL - generowanie raportu z SAP

dzięki za kod...prawie działa.

troszkę własnego kodu i działa.
Wielkie dzięki.
tego mi było potrzeba...początku.
a tu jest trochę gotowego kodu logującego, nad ktorym trzeba jeszcze popracować, i co gorsza - wymaga dostępu do szerszych uprawnień:
http://sapass.metro.client.jp/Sap_Active_X/UseFunction...

pozdrawiam.Bartłomiej C. edytował(a) ten post dnia 05.12.08 o godzinie 12:09
Kacper W.

Kacper W. Specjalista SAP
SD/MM

Temat: EXCEL - generowanie raportu z SAP

No jasne,

Wkleiłem Ci całe makro zrzucające do XLS stany magazynowe.

Tak naprawdę to większość kodu nie była potrzebna.

Wstawiłem tylko po to by była to jakaś całość by zobaczyć jak to działa (F8):)

pozdrawiam
KacperKacper W. edytował(a) ten post dnia 03.12.08 o godzinie 16:51

konto usunięte

Temat: EXCEL - generowanie raportu z SAP

No...Dzięki Twej pomocy mam fajne makro, które zrzuca mi raport Query do excela.

Teraz to mi się będzie lepiej pracować
pozdrawiam

konto usunięte

Temat: EXCEL - generowanie raportu z SAP

Kacper :)
MB52 też działa, włącznie z formatowaniem arkusza

Teraz już będzie z górki :) (chyba)
Pozdrawiam

konto usunięte

Temat: EXCEL - generowanie raportu z SAP

proszę moda o usunięcie wypowiedzi - problem rozwiązanyKamil Ciereszko edytował(a) ten post dnia 16.04.09 o godzinie 20:59

konto usunięte

Temat: EXCEL - generowanie raportu z SAP

Kamil, a może wiesz jak odpalić SAP z VBA? Logowanie, okno programu...bo w tle nie ma problemu, a na pierwszym planie się nie mogę dobić do SAPa, nie umiem wywołać okna.

konto usunięte

Temat: EXCEL - generowanie raportu z SAP

Bartek,
najpierw musisz utworzyć SAP Shortcut. Dokładne info co i jak znajdziesz tutaj:

http://help.sap.com/saphelp_ewm2007/helpdata/en/8b/732...

Nie zawsze opcja wpisania hasła jest aktywna - w przypadku kiedy system nie pozwala Ci na wpisanie hasła musisz zmodyfikować rejestr. Dokładnie w HKEY_CURRENT_USER -> Software -> SAP -> SAPShortcut -> Security musi być EnablePassword z wartością 1.

Shortcut zapisujesz gdzieś na dysku lokalnym.
Następnie uruchamiasz go makrem - przykładowo poprzez:

ActiveWorkbook.FollowHyperlink "c:\shortcut.sap", NewWindow:=True

możesz też dodać pewną zwłokę przed dalszym działaniem w SAPie (inaczej mogą pojawiać się błędy) - np.

Application.Wait(Now + TimeValue("0:00:10"))

Warto też w samym excelu (Tool -> Macro -> Security) dodać kod do "trusted sources" tak, aby przy każdorazowym logowaniu nie pokazywał się popup z pytaniem.

Ogólnie jest to pewien workaround, ale ważne że działa ;).Kamil Ciereszko edytował(a) ten post dnia 21.04.09 o godzinie 16:35

konto usunięte

Temat: EXCEL - generowanie raportu z SAP

Kamil - dzięki za odpowiedź. Potestuję.
pozdrawiam
Piotr Śmigielski

Piotr Śmigielski Starszy Analityk
Marketingowy

Temat: EXCEL - generowanie raportu z SAP

Cześć - próbowałem odpalić to makro i pojawia mi się okienko w SAPie "Scripting is not installed" - co muszę mieć zainstalowane, żeby mi to działało ? Czy to lokalnie powinno być zaistalowane na moim kompie czy gdzieś indziej ? Widzę, że w moim sapie w ogóle cała opcja "script recording and playback" jest jakaś wyszarzona.

Czy SAP GUI Scrtipting API jest darmowe - jeśli nie to może ktoś wie ile to kosztuje ?

PiotrekPiotr Krowiarz edytował(a) ten post dnia 16.08.09 o godzinie 21:12
Jan Rey

Jan Rey Project & Program
Manager, focused on
the business
readin...

Temat: EXCEL - generowanie raportu z SAP

Wiele firm giełdowych musi już teraz dbać o transparentność i bezpieczeństwo danych w sposób zgodny z regulacjami SOX. Jeszcze więcej nie ma nadmiaru specjalistów SAP, którzy byliby w stanie szybko tworzyć różne interfejsy do zasileń danymi i do czynnośći porządkujących oraz do wprowadzania masowych zmian w danych.

A może do migracji lub okresowego wprowadzania danych użyć transactionSHUTTLE, który w trzech krokach rejestruje pola kliknięte w transakcji SAP, mapuje je w tabeli MS (Excel/Access/SQL), a następnie wykonuje ładowanie danych z Excela.

Instalacja tylko na PC, zachowuje wszelkie reguły bezpieczeństwa danych, dzięki korzystaniu z profili uprawnień SAP.
Więcej na stronie Hanseaticus, polskiego partnera Winshuttle.

Po zdefiniowaniu i wytestowaniu transferu można proces okresowego zasilania przekazać w ręce użytkownika uproszczonego narzędzia runSHUTTLE, który może wykonywać operacje zaresestrowane w definicji zapisanej w pliku SHUTTLE. runSHUTTLE jest stosownie tańszy.

Chyba zrobię z tego osobny wątek.

Pozdrawiam,
JanekJan Rey edytował(a) ten post dnia 29.11.09 o godzinie 15:43

Wojciech Gardziński

Wypowiedzi autora zostały ukryte. Pokaż autora

konto usunięte

Temat: EXCEL - generowanie raportu z SAP

Witam,

Panowie też zaczynam dopiero z VBA i SAP_em, próbuje skorzystać z poniższego marka ale wywala się na ostatniej linicje tego fragmentu "Set Connection = lrw.Children(0)" dając komunikat "RUN TIME ERoR 614, Enumeratior of the collection cannot find an ellement with the specified index.

Proszę o pomoc i dziękuje:)

Sub MB52()

'sktypt "dobiera" się do SAP
'ważne! - domyślnie sktypt SAP stosuje słowo "Aplication" i 'powoduje to błąd w xls - zmien na inne dowolne słowo (u mnie np LRW)

If Not IsObject(lrw) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set lrw = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
Set Connection = lrw.Children(0)

Kacper W.:
Witam,

najważniejszy jest początek

1. Musisz byc zalogowany w SAP (można sobie też napisać skrypt logujący - narazie nie umiem ale mam jakieś przykłady i kiedyś zrobie).
2. Jak mówiłem - Pracuje używając SAP API (czyli nie jakos tam w tle tylko SAP powtarza czynnosci usera)

Poniżej MAKRO z XLS

Sub MB52()

'sktypt "dobiera" się do SAP
'ważne! - domyślnie sktypt SAP stosuje słowo "Aplication" i 'powoduje to błąd w xls - zmien na inne dowolne słowo (u mnie np LRW)

If Not IsObject(lrw) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set lrw = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
Set Connection = lrw.Children(0)
End If
If Not IsObject(session) Then
Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject session, "on"
WScript.ConnectObject lrw, "on"
End If

'tu ważne - maximaze - robi wszystko na ekranie = wolniej
'Iconify - minimalizuje okna - u mnie tak 30-40% szybsze

'session.findById("wnd[0]").maximize
session.findById("wnd[0]").Iconify

session.findById("wnd[0]/tbar[0]/okcd").Text = "mb52"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/txt[1]").SetFocus
session.findById("wnd[0]/usr/txt[1]").caretPosition = 0
session.findById("wnd[0]/usr/txt[1]").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[0]").sendVKey 43
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/usr/sub/1/rad[0,0]").Select
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press

ChDir "C:\temp\MM"
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:= _
"C:\temp\MM\StockData.xls", FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False

ActiveWorkbook.Close
session.findById("wnd[0]/tbar[0]/btn[15]").press
session.findById("wnd[0]/tbar[0]/btn[15]").press

End Sub

To powinno zadziałać u Ciebie bez problemu.

Proponuję uruchomić makto F8 i krok po kroku sprawdzać co robi.

Oczywiście musi być katalog C:\temp\MM

Daj znać czy działa.
pozdrawiam
Kacper
Sławomir Korman

Sławomir Korman Local Material
Master Coordinator
SAP R/3 , General
Elect...

Temat: EXCEL - generowanie raportu z SAP

Witajcie,

Mam VBS'a ktory sam loguje sie do SAP poprzez SAP logon. PLik dane.dat zawiera w sobie dane :

nrklientaSAP,login,haslo

Przydaje sie to w przypadku zamiany hasla w SAP. Wtedy zmieniamy dane do logowania w jednym miejscu.

W razie pytan prosze o kontakt.

Const ForReading = 1
Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Raporty\dane.dat", ForReading)

Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
tab = split(strline,",")
klient = tab(0)
login = tab(1)
haslo = tab(2)

Loop

objFile.Close


Rem If Not IsObject(application) Then
Rem Set SapGuiAuto = GetObject("SAPGUI")
Rem Set application = SapGuiAuto.GetScriptingEngine
Rem End If
Rem If Not IsObject(connection) Then
Rem Set connection = application.Children(0)
Rem End If
Rem If Not IsObject(session) Then
Rem Set session = connection.Children(0)
Rem End If
Rem If IsObject(WScript) Then
Rem WScript.ConnectObject session, "on"
Rem WScript.ConnectObject application, "on"

'---- uruchamia sap logon.
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "C:\Program Files\SAP\FrontEnd\SAPgui\saplogon.exe"

Set SapGui = GetObject("SAPGUI")
Set Appl = SapGui.GetScriptingEngine

'zamiast ("NP2 [Eastern Europe]" wprowadź nazwę systemu
Set Connection = Appl.Openconnection("GP1 [Production_planning] eng", True)
Set session = Connection.Children(0)

'poniżej wprowadzamy UserID
session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = login

'Hasło:
session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = haslo

'jeżeli nie mamy zapisanego domyślnie języka - kod języka logowania
session.findById("wnd[0]/usr/txtRSYST-LANGU").Text = "E"
'enter
session.findById("wnd[0]").sendVKey 0


session.findById("wnd[0]").maximize
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[0]/okcd").text = "/nme22"
session.findById("wnd[0]").sendVKey 0

Dim material
Dim qty

Dim objExcel
Dim objSheet, intRow, i
Dim Cells

'tworzy objekt excela
Set objExcel = GetObject(,"Excel.Application")

'jako zrodlo danych ustawia aktywny arkusz excela
Set objSheet = objExcel.ActiveWorkbook.ActiveSheet

'od ktorej komorki ma czytac dane
For i = 2 to objSheet.UsedRange.Rows.Count
On error resume next

' pobiera dane z kolumny 1 i 2 i wstawia w dane pola w SAP
PO = Trim(CStr(objSheet.Cells(i, 1).Value))
Line = Trim(CStr(objSheet.Cells(i, 2).Value))

session.findById("wnd[0]/usr/ctxtRM06E-BSTNR").text = PO
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/txtRM06E-EBELP").text = LINE
session.findById("wnd[0]/usr/txtRM06E-EBELP").setFocus
session.findById("wnd[0]/usr/txtRM06E-EBELP").caretPosition = 3
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/sub/1/chkRM06E-SELKZ[0,0]").selected = true
session.findById("wnd[0]/usr/sub/1/chkRM06E-SELKZ[0,0]").setFocus
session.findById("wnd[0]/mbar/menu[3]/menu[0]").select
session.findById("wnd[0]/usr/chkEKPO-ELIKZ").selected = true
session.findById("wnd[0]/usr/chkEKPO-ELIKZ").setFocus
session.findById("wnd[0]/tbar[0]/btn[11]").press

Next

konto usunięte

Temat: EXCEL - generowanie raportu z SAP

Witam Wszystkich,
Mam pytanie jak wyeksportować raport z SAP do Excela wybierając "select from all available formats--->Office 2007 XSLX" za pomocą VBA. Niestety nagrane makro urywa się w momencie otwarcia okna "Save As" i nie bardzo wiem co dalej z tym fantem zrobić.
Mateusz Przybyła

Mateusz Przybyła Zastępca Kierownika,
Meblex

Temat: EXCEL - generowanie raportu z SAP

Witam
Mam pytanie: jak zrobić aby pobierany plik z Sapa(widziany jako xls) nie był w formacie txt. Potrzebuje go do aktualizacij danych w excelu lecz niestety po odpaleniu przerywa mi łącza
If Not IsObject(application) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
Set connection = application.Children(0)
End If
If Not IsObject(session) Then
Set session = connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject session, "on"
WScript.ConnectObject application, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").text = "lx02"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtS1_LGNUM").text = "530"
session.findById("wnd[0]/usr/ctxtS1_LGNUM").caretPosition = 3
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/btn%_S1_LGTYP_%_APP_%-VALU_PUSH").press
session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,0]").text = "100"
session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,0]").text = "200"
session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,1]").text = "300"
session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,2]").text = "400"
session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,3]").text = "916"
session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,3]").setFocus
session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,3]").caretPosition = 3
session.findById("wnd[1]/tbar[0]/btn[8]").press
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/mbar/menu[0]/menu[1]/menu[2]").select
session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").select
session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").setFocus
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/usr/ctxtDY_PATH").text = "Z:\Warsaw Public\Oswiadczenia_Animex\"
session.findById("wnd[1]/usr/ctxtDY_FILENAME").text = "whse_data.xls"
session.findById("wnd[1]/usr/ctxtDY_FILE_ENCODING").text = "0000"
session.findById("wnd[1]/tbar[0]/btn[11]").press
session.findById("wnd[0]/tbar[0]/btn[12]").press
session.findById("wnd[0]/tbar[0]/btn[12]").press
Problem jest taki że musze otworzyć ten plik i ręcznie zapisać go w xls

konto usunięte

Temat: EXCEL - generowanie raportu z SAP

editTen post został edytowany przez Autora dnia 19.09.16 o godzinie 09:22



Wyślij zaproszenie do