Die Community zu .NET und Classic VB.
Menü

SAP R/3 (Netweaver) Scripting und VBA/VB

 von 

Wozu eignet sich Scripting? 

Aus eigener Erfahrung sollte man nur dann Scripting benutzen, wenn man immer wiederkehrende Aufgaben im System bewerkstelligen muss. Die "lästigsten" Funktionen hierfür werden dann vom Script ausgeführt.

Für Aufgaben die eine lange Laufzeit zu Datenbereitstellung benötigen, sollte man auf Scripting verzichten, da es hier sehr oft zu Abbrüchen in der Ausführung kommt.

Ebenso hat man mit Scripting eine einfache Schnittstelle zu Office-Produkten (Excel / Access) aus denen man Werte einlesen und auch wieder auslesen kann.

Voraussetzungen  

Voraussetzung, dass man mit SAP Skripten kann, ist eine SAP®-Netweaver® Version > 6.5 (Ältere sollten eigentlich nicht mehr in Gebrauch sein).

Nun vergewissert man sich, ob Scripting überhaupt installiert und aktiviert ist. Mit [Alt + F12] erscheint ein Popupmenu in dem der Eintrag Optionen ausgewählt wird.

Folgender Dialog erscheint:


Abbildung 1: Scripting-Dialog

Hier wechselt man auf die Registerkarte "Scripting" s.o. Sollte Scripting nicht installiert sein, sollte man sich beim Systemadministrator erkundigen, ob es möglich wäre dieses freizugeben bzw. zu installieren. Scripting ist übrigens eigentlich ein fester Bestandteil des Netweavers©.

Sollte Scripting installiert, jedoch nicht aktiviert sein, so ist der Haken bei "Scripting einschalten" zu setzen.

Die unteren Haken sind zu deaktivieren, da sie nur den Ablauf des Scripts "behindern".

Mit einem Druck auf "Ok" sind dann alle Voraussetzungen geschaffen um Scripting zu nutzen.

Was ist Script?  

Für Scripting wird ein VB-Dialekt verwendet- um genau zu sein Visual Basic Script. Die Sprache ist annähernd VBA / VB.

Es kann aber auch JavaScript / Ruby oder PHP verwendet werden, wenn die entsprechenden Voraussetzungen gegeben sind.

Der Script-Recorder  

Hierfür betätigt man wieder die Tastenkombination [Alt + F12]. Im Menü betätigt man den Punkt Script-Aufzeichnung und Playback...

Folgender Dialog erscheint:


Abbildung 2: Der Script-Recorder eingeklappt

Mit einem Druck auf den [Mehr>>]-Button vergrößert sich der Dialog und sieht wie folgt aus:


Abbildung 3: Der Script-Recorder ausgeklappt

Zu den einzelnen Steuerelementen muss nicht viel gesagt werden, diese sind eigentlich selbsterklärend.

Sowie ein Name und ein Pfad zum Speichern vergeben sind, kann man die Aufzeichnung starten, in dem man den "Aufnahmeknopf" betätigt. Als Dateierweiterung wird hierbei immer .vbs angehängt.

Hinweis: Es werden alle Aktionen nur im aktuellen Modus aufgezeichnet. Und diese auch nur dann wenn es sich um SAP-Dialoge handelt. Werden Windowseigene Dialoge (Speichern / Öffnen) etc. benutzt, dann werden die Aktionen auch nicht aufgezeichnet.

Doch nun schreiten wir zur Tat und nehmen das 1. Script auf. Hierzu empfiehlt es sich ein eigenes Verzeichnis anzulegen. Nachdem dieses über den Auswahlbutton [...] ausgewählt und ein Dateiname vergeben wurde, drückt man den Aufnahmeknopf.

Nun taucht unten rechts im aktiven Modus ein sich drehendes, weiß-rotes Symbol auf. Das signalisiert dem Benutzer, das Scripting in Betrieb ist.

Nun führen wir ein paar "Probe-Aktionen" durch wie z.B. eine Eingabe in das OK-Textfeld einer SAP Oberfläche mit anschließendem Return und F3 oder einer Abfrage.

Nachdem ein paar Aktionen durchgeführt wurden, beendet man die Skriptaufzeichnung durch betätigen des Stoppknopfes. Nun wechseln wir in das Verzeichnis um uns die erstellte Datei etwas genauer anzusehen. Standardmäßig sind *.vbs Dateien unter Windows zum Bearbeiten mit dem Notepad-Editor verbunden. Hier empfehle ich einen "besseren" Editor zu nehmen (Notepad++ oder auch GVim sind entsprechende Derivate die sich zum Editieren eignen).

Hinweis: Bei einem Doppelklick versucht Windows das Skript auszuführen! Dies kann zu unschönen Aktionen führen. Besser ist es, die Datei über das Kontextmenü und dann "Öffnen mit" zum Bearbeiten auszuwählen.

Aufbau eines Scripts

Der Kopf:


Abbildung 4: Script-Kopf

Im Kopf stehen immer die gleichen Anweisungen: Der Verbindungsaufbau zu SAP. Nach dem Kopf stehen alle "Befehle" und Eingaben, die während der Aufzeichnung getätigt wurden.

Eine Befehlsreferenz für SAP ist im Netweaver® unter dem Menüpunkt Hilfe abgelegt.

Des Weiteren kann man sich im Internet unter http://forums.sdn.sap.com/forum.jspa?forumID=196&start=0 (direkt SAP) oder auch in diversen Foren über SAP-Scripting informieren und Fragen stellen. Allerdings sind diese Foren meist Englischsprachig.

Das erste nützliche Script  

Nun wollen wir das erste richtige Script aufzeichnen: Zuerst mal etwas ganz "banales" nur um zu zeigen wie Scripting funktioniert:

Hierfür öffnen wir eine bestimmte Anzahl an Modi mit bestimmten Funktionen die man jeden Tag benötigt.

Für das Script vergeben wir den Namen: Tagesfenster.vbs Nun wird der MakroRecorder gestartet und in das "Ok-Code" Textfeld (oben links) geben wir folgende Befehle ein:

MD04 {Enter}
/oMM52 {Enter}

Hiernach wird die Aufzeichnung beendet.

Nun sehen wir uns das Aufgezeichnete Script an und öffnen es dazu im Editor:

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 = "MD04"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[0]/okcd").text = "/oMM52"
session.findById("wnd[0]").sendVKey 0

Hier sehen wir nun jeweils die Eingaben und den Druck der Enter-Taste:

session.findById("wnd[0]/tbar[0]/okcd").text = "MD04"  (Eingabe)
session.findById("wnd[0]").sendVKey 0  {Enter-Taste)

Hinweis: Die V-Keys haben nichts mit den VB-Keycodes gemein (siehe auch hier Näheres in der SAP-Scripting Hilfe).

Soviel zum ersten Script.

Office-Anbindung  

Um nun eine Anbindung an Access / Excel zu erhalten (für eine Automation) muss die Anbindung per "CreateObject" erstellt werden.

Hier ein Beispiel für Access per ADO-Connection:

Set cn = CreateObject(ADODB.Connection")
Set rs = CreateObject(ADODB.Recordset")

Nun muss noch der ConnectionString und das Recordset festgelegt werden sowie einige Konstanten für das Recordset:

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adUseClient = 3

Und nun noch der ConnectionString:

cn.Open _
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source =C:\Nordwind.mdb"

Ebenso das Recordset:

rs.Open "SELECT * FROM customers" , cn, adOpenStatic, adUseClient

Und schon ist die Anbindung an die Datenbank erledigt.

Um nun die entsprechenden SAP Eingabefelder mit Werten aus der Access Datenbank zu versorgen, müssen natürlich noch die Werte des Datensatzes an SAP übergeben werden.

session.findById("wnd[1]/usr/txtGS_EQ_SLOTBELEGUNG_NEU-IDENT").text = rs.Fields("customer").Value

Um nun mehrere Datensätze hintereinander abzuarbeiten kann man eine For-Next-Schleife verwenden. Hier verhält sich VBScript etwas anders als VB(A): In der For-Next Schleife ist beim Next ein Identifizierer der Schleife nicht zugelassen.

Beispiel:

For i = 1 to rs.Recordcount
Next i  ' <= das ist nicht zulässig! Das Script bricht mit Fehlermeldung ab.

For i = 1 to rs.Recordcount
Next    ' So ist es richtig! 

Auch wenn mehrere For-Next Schleifen ineinander verschachtelt sind ist kein Identifizierer möglich.

Desweiteren empfiehlt es sich eine zusätzliche Spalte in der zugrundeliegenden Access-Datenbank zur Überprüfung und "Erledigt" Markierung einzufügen, die auf "Wahr" gesetzt wird sobald der Datensatz abgearbeitet ist. Hier kann man ein "Ja/Nein" Feld verwenden und dieses am Ende der Schleife auf "True" setzen.

rs.fields(erledigt).Value = True
rs.update
rs.movenext

Ganz zum Schluss des Scripts muss dann natürlich das Recordset und die Connection wieder geschlossen werden:

rs.close
set rs = Nothing
cn.close
set cn = Nothing

Zum Testen des Scripts setzen wir nun erstmals die For-Next Schleife auf 1:

For i = 1 to 1 'rs.RecordCount
.
.
Next

Dieses dient zum Testen auf etwaige Fehler im Script. Sollte das Script ohne Fehler durchlaufen, so kann die 1 wieder durch das rs.RecordCount ersetzt werden.

Anmerkung: Wenn das Script läuft kann es nicht angehalten werden! Auch nicht durch den "STOP"-Knopf im Makro-Recorder.

Der erstellte Scriptcode kann auch z.B. in Excel oder Access direkt im VBA Editor eingebunden werden, hierfür muss lediglich der Kopf etwas angepasst werden: Vorteil hier, bessere Fehlersuche und Schrittweises Abarbeiten aller befehle sowie Überprüfung aller Vorgänge.

If Not IsObject(SAPapplication) Then
   Set SapGuiAuto  = GetObject("SAPGUI")
   Set SAPapplication = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(SAPconnection) Then
   Set SAPconnection = SAPapplication.Children(0)
End If
If Not IsObject(SAPsession) Then
   Set SAPsession    = SAPconnection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject SAPsession,     "on"
   WScript.ConnectObject application, "on"
End If

Diese Änderungen sind leider nötig um nicht den Application- und anderen Officeobjekten "in die Quere" zu kommen.

Wichtig hierbei: Die gesetzten Objekte müssen am Ende des Scripts auch wieder geschlossen und entladen werden:

Set SAPsession = Nothing
Set SAPConnection = Nothing
Set SAPGuiAuto = Nothing

Ansonsten verabschiedet sich die Anwendung ins "Daten-Nirwana".

Nun kann das Script aus dem Editor in VBA importiert werden um in Subs / Funktionen oder Userforms den eigenen Bedürfnissen angepasst zu werden.

Um sich dabei eine Menge Tipparbeit zu ersparen empfiehlt es sich für gewisse Dinge ein Objekt zu erstellen:

So zum Beispiel für die Statusbar um auf deren Meldungen reagieren zu können:

Set sbar = SAPsession.findbyid("wnd[0]/sbar")
' Beispiel: (Ein Fehler ist aufgetreten)
If sbar.Messagetype = "E" Then
  '...
End if

Oder die Fensterleiste :

Set Tbar = SAPsession.findbyid("wnd[0]")
If TBar.Text Like "SAP-Session" then
  '...
End If

Alles in allem kann man sich wenn man Scripting richtig einsetzt das Leben sehr vereinfachen.

Ich hoffe ich konnte einen kleinen Einblick in die Welt von SAP bringen. Am einfachsten ist es auszuprobieren (natürlich nur da wo man keinen Schaden anrichten kann).

Noch ein Hinweis zum Schluss: SAP-Script funktioniert nicht immer, beispielsweise wenn das Tool GuiXT ausgeführt wird.

Quellen  

Ihre Meinung  

Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.