Voraussetzungen
- System ab SAP NW 6.2
- Präsentationsserver: SAP Menu (SAP Easy Access) -> Button „Lokales Layout anpassen“ -> Optionen… -> Barrierefreiheit und Scripting -> Skiptunterstützung aktivieren, die anderen Haken deaktivieren
- Applikationsserver: Profilparameter: RZ11 -> Parameter sapgui/user_scripting = TRUE (in Großbuchstaben!) -> gilt nur ab dem nächsten Login und bis Serverneustart
- weitere Profilparameter:
- sapgui/user_scripting must be TRUE to use scripting functions
- sapgui/user_scripting_disable_recording if it is TRUE then it is only possible to run scripts
- sapgui/user_scripting_force_notification if it is TRUE a notification is always displayed at the frontend
- sapgui/user_scripting_per_user if it is TRUE you need S_SCR authority to use scripting
- sapgui/user_scripting_set_readonly if it is TRUE it is not allowed to change the state of SAP GUI
Skriptaufzeichnung und Hilfe
- SAP Menu (SAP Easy Access) -> Button „Lokales Layout anpassen“ -> Skript-Aufzeichnung und -Playback
- SAP Menu (SAP Easy Access) -> Button „Lokales Layout anpassen“ -> Hilfe zu SAP GUI Scripting
OCX-Bibliothek für VBA
- VBA-Import über: Extras -> Verweise … -> Durchsuchen …
- C:\Program Files\SAP\FrontEnd\SAPgui\sapfewse.ocx br>
oder br>
C:\Apps32\SAP\FrontEnd\SAPgui\sapfewse.ocx
- Aktivieren: SAP GUI Scripting API
Windows Scripting Host (x64)
- C:\Windows\SysWOW64\wscript.exe
- Ausführen von vbs-Scripten: C:\Windows\SysWOW64\wscript.exe c:\test.vbs
Beispiel 1 (Alle Connections, Sessions, GUI-Elemente auflisten)
Option Explicit
Sub SAP()
Dim oSapGui As Object
' Extras -> Verweise ... -> Durchsuchen ...
' C:\Program Files\SAP\FrontEnd\SAPgui\sapfewse.ocx
' Aktivieren: SAP GUI Scripting API
Dim oApp As SAPFEWSELib.GuiApplication
Dim oConn As SAPFEWSELib.GuiConnection
Dim oSession As SAPFEWSELib.GuiSession
Dim oSessionInfo As SAPFEWSELib.GuiSessionInfo
Dim oWindow As SAPFEWSELib.GuiMainWindow
Dim oComponent As SAPFEWSELib.GuiComponent
Dim oSubComponent As SAPFEWSELib.GuiComponent
Debug.Print "----------"
' Ref auf SAPGUI
Set oSapGui = GetObject("SAPGUI")
If IsObject(oSapGui) Then
' Ref auf ScriptingEngine
Set oApp = oSapGui.GetScriptingEngine
If IsObject(oApp) Then
Debug.Print oApp.ID
Debug.Print oApp.Name
' Liste Connections
For Each oConn In oApp.Children
Debug.Print "|--" & oConn.ConnectionString
Debug.Print "| " & oConn.Description
Debug.Print "| " & oConn.ID
Debug.Print "| " & oConn.Name
' Sessions sind nur verfügbar, wenn RZ11 Parameter sapgui/user_scripting = TRUE
' Liste Sessions
For Each oSession In oConn.Children
Debug.Print " |--" & oSession.ID
Debug.Print " | " & oSession.Busy
' Ref auf Session Info
Set oSessionInfo = oSession.Info
If IsObject(oSessionInfo) Then
Debug.Print " |--" & oSessionInfo.SystemSessionId
Debug.Print " | " & oSessionInfo.ApplicationServer
Debug.Print " | " & oSessionInfo.SystemName
Debug.Print " | " & oSessionInfo.Client
Debug.Print " | " & oSessionInfo.Transaction
Debug.Print " | " & oSessionInfo.User
End If
' Ref auf Fenster
For Each oWindow In oSession.Children
Debug.Print " |--" & oWindow.ID
Debug.Print " | " & oWindow.Text
Debug.Print " | " & oWindow.Left
Debug.Print " | " & oWindow.Top
Debug.Print " | " & oWindow.Width
Debug.Print " | " & oWindow.Height
' Liste mit Komponenten im Fenster
For Each oComponent In oWindow.Children
Debug.Print " |--" & oComponent.ID
Debug.Print " | " & oComponent.Name
Debug.Print " | " & oComponent.Type
Debug.Print " | " & oComponent.ContainerType
' Liste mit Unterkomponenten (können wiederum auch Unterkomponenten haben -> besser rekursiv aufrufen)
For Each oSubComponent In oComponent.Children
Debug.Print " |--" & oSubComponent.ID
Debug.Print " | " & oSubComponent.Name
Debug.Print " | " & oSubComponent.Type
Debug.Print " | " & oSubComponent.ContainerType
Next
Next
Next
Next
Next
End If
End If
Set oSubComponent = Nothing
Set oComponent = Nothing
Set oWindow = Nothing
Set oSessionInfo = Nothing
Set oSession = Nothing
Set oConn = Nothing
Set oApp = Nothing
Set oSapGui = Nothing
End Sub
Beispiel 2 (Transaktion SE16 starten und Inhalt des ALV-Grids in Excel kopieren)
Option Explicit
Sub SAP()
Dim oSapGui As Object
' Extras -> Verweise ... -> Durchsuchen ...
' C:\Program Files\SAP\FrontEnd\SAPgui\sapfewse.ocx
' Aktivieren: SAP GUI Scripting API
Dim oApp As SAPFEWSELib.GuiApplication
Dim oConn As SAPFEWSELib.GuiConnection
Dim oSession As SAPFEWSELib.GuiSession
' Ref auf SAPGUI
Set oSapGui = GetObject("SAPGUI")
If IsObject(oSapGui) Then
' Ref auf ScriptingEngine
Set oApp = oSapGui.GetScriptingEngine
If IsObject(oApp) Then
' Sind Connections vorhanden?
If oApp.Children.Count > 0 Then
' 1. Connection der App
Set oConn = oApp.Children(0)
' 1. Session der Connection
Set oSession = oConn.Children(0)
' Fenster minimieren
oSession.FindById("wnd[0]").Iconify
' SE16 starten
oSession.StartTransaction ("SE16")
' Selektionsbild
' Tabelle MARA
oSession.FindById("wnd[0]/usr/ctxtDATABROWSE-TABLENAME").Text = "MARA"
' Button "Tabelleninhalt (F7)"
oSession.FindById("wnd[0]/tbar[1]/btn[7]").Press
' max. 10 Einträge
oSession.FindById("wnd[0]/usr/txtMAX_SEL").Text = "10"
' Button "Ausführen (F8)"
oSession.FindById("wnd[0]/tbar[1]/btn[8]").Press
' ALV-Ansicht aktivieren
' Menü suchen
Dim oMenu As GuiComponent
Set oMenu = oSession.FindById("wnd[0]/mbar")
' Menüpunkt "Einstellungen"
Dim oOptions As GuiComponent
Set oOptions = oMenu.FindByName("Einstellungen", "GuiMenu")
' Menüpunkt "Benutzerparameter ..."
Dim oUserPar As GuiComponent
Set oUserPar = oOptions.FindByName("Benutzerparameter...", "GuiMenu")
oUserPar.Select
' Databrowser -> Ausgabeliste -> ALV-Grid-Darstellung
Dim oALVParam As GuiComponent
Set oALVParam = oSession.FindById("wnd[1]/usr/tabsG_TABSTRIP/tabp0400/ssubTOOLAREA:SAPLWB_CUSTOMIZING:0400/radRSEUMOD-TBALV_GRID")
' wenn ALV-Ansicht noch nicht ausgewählt, dann anhaken
If oALVParam.Selected = vbFalse Then
oALVParam.Select
End If
' Einstellungen übernehmen
oSession.FindById("wnd[1]/tbar[0]/btn[0]").Press
Set oUserPar = Nothing
Set oOptions = Nothing
Set oMenu = Nothing
' ALV-Grid holen
Dim oALV As GuiComponent
Set oALV = oSession.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell")
' Zeilen
Dim iRows As Integer
iRows = oALV.RowCount() - 1
' Spalten
Dim iCols As Integer
iCols = oALV.ColumnCount() - 1
' Spaltentitel lesen
Dim oColumns
Set oColumns = oALV.ColumnOrder
Dim c As Integer
Dim r As Integer
' Überschriften einfügen
For c = 0 To iCols
ActiveWorkbook.ActiveSheet.Cells(1, c + 1) = oColumns(c)
Next
' Daten einfügen
For r = 0 To iRows
' ALV-Grid weiterscrollen, damit ein Update des Inhalts erfolgt
oALV.FirstVisibleRow = r
For c = 0 To iCols
ActiveWorkbook.ActiveSheet.Cells(r + 2, c + 1) = oALV.GetCellValue(r, CStr(oColumns(c)))
Next
Next
' Fenster maximieren
oSession.FindById("wnd[0]").Maximize
Else
MsgBox "Bitte an einem SAP-System anmelden."
End If
End If
End If
Set oSession = Nothing
Set oConn = Nothing
Set oApp = Nothing
Set oSapGui = Nothing
End Sub
Beispiel 3 (System-Logon)
Option Explicit
Sub SAP()
Dim oSapGui As Object
' Extras -> Verweise ... -> Durchsuchen ...
' C:\Program Files\SAP\FrontEnd\SAPgui\sapfewse.ocx
' Aktivieren: SAP GUI Scripting API
Dim oApp As SAPFEWSELib.GuiApplication
Dim oConn As SAPFEWSELib.GuiConnection
Dim oSession As SAPFEWSELib.GuiSession
' Ref auf SAPGUI
Set oSapGui = GetObject("SAPGUI")
If IsObject(oSapGui) Then
' Ref auf ScriptingEngine
Set oApp = oSapGui.GetScriptingEngine
If IsObject(oApp) Then
' Zu System verbinden, wobei <SYSTEM> == vollst. (!) Systemname aus SAP Logon Pad -> Verbindungen
Set oConn = oApp.OpenConnection("<SYSTEM>")
If IsObject(oConn) Then
' 1. Session der Connection
Set oSession = oConn.Children(0)
' Username und Passwort setzen
oSession.FindById("wnd[0]/usr/txtRSYST-BNAME").Text = "<USER>"
oSession.FindById("wnd[0]/usr/pwdRSYST-BCODE").Text = "<PASS>"
' Enter-Taste
oSession.FindById("wnd[0]").SendVKey 0
' SE16 starten
oSession.StartTransaction ("SE16")
End If
End If
End If
Set oSession = Nothing
Set oConn = Nothing
Set oApp = Nothing
Set oSapGui = Nothing
End Sub
Links