Když mě teď potkal fenomén zvaný práce z domova, rozhodl jsem se věnovat trochu času zjednodušování denní rutiny. Řekl jsem si, že si zautomatizuji veškeré nudné a opakující se činnosti v SAPu. První činnost, kterou jsem potřeboval automatizovat, bylo neustálé přepínání a kopírování dat mezi Excelem a SAPem.
Pro případné začátečníky v Excelu uvádím, že karta vývojář není ve výchozím nastavení vidět a musíte si jí zapnout. Stejně tak Microsoft Visual Basic for Applications spustíte stisknutím alt+F11.
VBA Skript pro ovládání SAP
Jdeme na to. Otevřeme Excel, VBA editor a kopírujeme. První část kódu naleznete kdekoliv na netu. Tímto kódem se Excel připojí k již přihlášenému SAPu. Automatické přihlášení je také možné, ale já ho nevyužiji, tak jsem se tím ani nezabýval.
Sub SAP_MM03()
Set SapGuiAuto = GetObject("SAPGUI") 'Get the SAP GUI Scripting object
Set SAPApp = SapGuiAuto.GetScriptingEngine 'Get the currently running SAP GUI
Set SAPCon = SAPApp.Children(0) 'Get the first system that is currently connected
Set session = SAPCon.Children(0) 'Get the first session (window) on that connection
session.findById("wnd[0]").Maximize
Pomocí tohoto kódu, se Excel připojí k SAPu. To, že se Excel k SAPu připojil poznáte podle ikonky s běhajícím červeným šikmým proužkem, vpravo dole ve stavové liště okna SAPu.
Při každém spuštění našeho kódu SAP upozorňuje, že se spouští skript. To je sice super z pohledu zabezpečení, ale z pohledu automatizace a produktivity mi to moc nevyhovuje. Toto oznámení lze snadno deaktivovat v menu.
Následující pokračování kódu spustí zvolenou transakci a prokliká se SAPem až na požadované místo. Skriptem můžete vyplňovat pole formulářů, simulovat stisknutí tlačítek na obrazovce nebo používat klávesové zkratky.
' spustíme transakci
session.StartTransaction "MM03"
' zapíšeme číslo materiálu z aktivního řádku tabulky, skript předpokládá umístění čísla materiálu v druhém sloupci
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").Text = Cells(ActiveCell.Row, 2).Value
' stiskneme F7
session.findById("wnd[0]").sendVKey 7
' stiskneme F8
session.findById("wnd[0]").sendVKey 8
End Sub
Jak je vidět, struktura skriptu je jednoduchá. Zdá se tedy, že největší problém budou názvy ovládacích prvků.
Ovládání SAP přes VBA pomocí klávesových zkratek
Začněme od klávesových zkratek. Z kódu výše je vidět, zápis session.findById(„wnd[0]“).sendVKey a číselný kód. Každá používaná klávesová zkratka má svůj číselný kód. Všechny kódy naleznete v nápovědě pod heslem Table GUI_FKEY. Některé nejčastější zkratky, které používám já, uvádím v následující tabulce.
VKey | Klávesa nebo klávesová zkratka |
---|---|
0 | Enter |
3 | F3 (zpět) |
7 | F7 |
8 | F8 (provedení) |
12 | F12 (zrušení) |
15 | Shift+F3 (konec) |
Výběr polí formuláře v SAP pomocí VBA
Dále se pojďme podívat na formulářová pole. Pokud klikneme na jakékoliv pole formuláře a stiskneme klávesu F1, zobrazí se nápověda.
Součástí nápovědy je i tlačítko „Technické informace“ (ikona kladiva a klíče). Klikneme na něj a zobrazí se další okno.
Označení pole uvedené v Pole dynp. je přesně to označení, které zapíšeme do našeho skriptu session.findById(„wnd[0]/usr/ctxtRMMG1-MATNR“).Text
Nahrávání vlastního skriptu v SAP
Mnohdy je rychlejší a efektivnější nahrát si celý postup klikání a zadávání, jako akci a tento skript pak jen pročistit a upravit k obrazu svému.
- V menu klikneme na položku Záznam a playback skriptu…
- Na novém okně klikneme na tlačítko více> a vybereme umístění nahraného skriptu.
- Klikneme na tlačítko záznam skriptu.
- Provedeme akci, kterou chceme automatizovat.
- Klikneme na tlačítko stop.
Upravení nahraného skriptu
- Najdeme uložený soubor, klikneme na něj pravým tlačítkem a vybereme upravit.
- SAP zaznamenal akce, které jsme provedli. Na začátku je vždy vytvořeno několik řádků, které skript používá, když ho spouštíte přímo v SAPu. Ty můžete ignorovat.
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
- V závislosti na tom, jak hodně jsme používali myš nebo klávesové zkratky, pak vypadá náš zaznamenaný kód. Díky našim znalostem ze začátku článku můžeme kód pročistit a tím ho zrychlit.
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").selectedNode = "F00046"
session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").doubleClickNode "F00046"
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "číslo materialu"
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").caretPosition = 15
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[1]").sendVKey 0
session.findById("wnd[0]/tbar[1]/btn[30]").press
session.findById("wnd[0]/usr/tabsTABSPR1/tabpZU04").select
- session.findById(„wnd[0]“).maximize můžeme ponechat, to je maximalizování okna označeného jako wnd[0]
- Další 2 řádky jsou ruční spuštění transakce z menu. Můžeme je smazat
session.findById(„wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell“).selectedNode = „F00046“
session.findById(„wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell“).doubleClickNode „F00046“ - A pro přehlednost nahradit vlastním kódem
session.StartTransaction „MM03“ - Další 2 řádky jsou zapsání čísla materiálu do formulářového políčka. První řádek říká, co jsme napsali a druhý řádek nastavuje pozici kurzoru.
session.findById(„wnd[0]/usr/ctxtRMMG1-MATNR“).text = „číslo materialu“
session.findById(„wnd[0]/usr/ctxtRMMG1-MATNR“).caretPosition = 15
Nastavení pozice kurzoru je v našem skriptu zbytečné, a tak řádek můžeme vypustit. - Poslední čtyři řádky už jsou proklikání se skrze SAP, až na požadované místo – do záložky data dokumentu. Stejnou akci lze udělat mnohem rychleji pomocí klávesových zkratek F7 a následně F8.
session.findById(„wnd[0]“).sendVKey 0
session.findById(„wnd[1]“).sendVKey 0
session.findById(„wnd[0]/tbar[1]/btn[30]“).press
session.findById(„wnd[0]/usr/tabsTABSPR1/tabpZU04“).select
Nejsnadnější cestou, jak kód pročistit, je vložit kód do VBA editoru v Excelu a stisknutím tlačítka F8 spustit debug mód. Postupným mačkáním tlačítka F8 náš skript postupuje krok po kroku a v okně SAPu vidíme, co který krok provedl.
A to je vše. Doufám, že vám automatizace činností v SAP ušetří cenné minuty. To, jak je pak využijete je jen na vás.
Pingback: Ohlédnutí za jarem 2020 -