Juni 2014
Automatisierung in der SAP® GUI per Scripting von Maximilian Queck
Abteilung: IC LMV LP O2 IO RBG BA LOG
Betreuer: Carsten Hammer, Siemens AG
Gutachter: Prof. Dr. Frank Herrmann
Prof. Dr. Alexander Söder
Masterarbeit, eingereicht im Rahmen der Masterprüfung
am Fachbereich Informatik und Mathematik
im Studiengang Logistik der Fakultät für Betriebswirtschaft
der Ostbayerischen Technischen Hochschule Regensburg.
Inhaltsverzeichnis
Begriffs- und Abkürzungsverzeichnis ......................................................... IV
0 Vorwort ................................................................................................ 1
0.1 Effektivität und Effizienz: Ein wesentlicher Unterschied .................................... 1
0.2 Lösungsmethoden zur Automatisierung von Arbeitsvorgängen in SAP® ........... 2
0.3 Entwicklungsumgebung und vorausgesetzte Kenntnisse................................... 4
0.4 Kapitelübersicht .................................................................................................. 5
1 Einführung in die SAP® GUI Scripting API ............................................. 6
1.1 Die Objekthierarchie in der SAP® GUI ................................................................ 6
1.2 Die wichtigsten GUI Objekte, ihre Eigenschaften, Methoden und Events ......... 9
1.2.1 GuiApplication ............................................................................................. 9
1.2.2 GuiConnection ........................................................................................... 11
1.2.3 GuiSession.................................................................................................. 12
1.2.4 GuiSessionInfo ........................................................................................... 14
1.2.5 GuiMainWindow & GuiModalWindow ..................................................... 15
1.2.6 GuiButton .................................................................................................. 16
1.2.7 GuiComponent .......................................................................................... 17
1.2.8 GuiComponentCollection .......................................................................... 18
1.2.9 GuiGridView ............................................................................................... 19
1.2.10 GuiTableControl ......................................................................................... 21
2 Arbeitsvorgänge erfassen und implementieren ................................. 23
2.1 Vorbereiten der Entwicklungsumgebung ......................................................... 23
2.1.1 Aktivieren der Scripting-Schnittstelle in der SAP® GUI ............................. 23
2.1.2 IntelliSense® mit den SAP® GUI Objekten in VBA® nutzen ....................... 24
2.2 Verbindungsaufbau per Scripting ..................................................................... 27
I
2.2.1 Neue Verbindung herstellen ..................................................................... 27
2.2.2 In bestehende Verbindungen einklinken .................................................. 29
2.3 Unterstützende Software ................................................................................. 32
2.4 GUI Objekte richtig identifizieren ..................................................................... 35
2.4.1 Aufbau von SAP® GUI IDs .......................................................................... 35
2.4.2 Objekt-Typ einer GUI ID bestimmen ......................................................... 36
2.4.3 Identifizierung von Objekten mit Hilfe des Scripting Trackers .................. 36
2.5 Scripte aufzeichnen ........................................................................................... 37
2.6 Auslesen von Daten aus Tabellen ..................................................................... 38
2.6.1 Daten im ALV Grid Control ........................................................................ 39
2.6.2 Daten im Table Control .............................................................................. 44
2.6.3 Datentypen erkennen und formatieren .................................................... 47
2.6.4 Auslesezeiten ............................................................................................. 49
2.7 Exception-Handling in VBA® und der SAP® GUI................................................ 50
2.7.1 Programmablauf verfolgen........................................................................ 51
2.7.2 Ausnahmefälle in der SAP® GUI ................................................................ 55
3 query panel: Ein Excel®- und Access®-Add-in für SAP® GUI Scripting . 57
3.1 Funktionsumfang der Klassen ........................................................................... 59
3.1.1 SAPGUI ....................................................................................................... 59
3.1.2 RFC ............................................................................................................. 66
3.1.3 Report ........................................................................................................ 68
3.1.4 TimeAndDate ............................................................................................. 70
3.1.5 FilesAndFolders ......................................................................................... 73
3.1.6 Functionlib ................................................................................................. 75
3.1.7 Excel ........................................................................................................... 76
3.2 Substitution von aufgenommenen Script-Befehlen durch Add-in-Funktionen80
3.3 Beispielprojekt: Eckstart- und Eckendtermine von in Verzug stehenden Aufträgen aktualisieren .............................................................................................. 85
II
4 Résumé .............................................................................................. 90
4.1 Tipps aus der Praxis .......................................................................................... 90
4.2 Sicherheitsbezogene Fragen & Antworten ....................................................... 91
4.3 Themenbezogene Netzwerke und Verweise .................................................... 93
Anhang ....................................................................................................... V
Literaturverzeichnis ................................................................................. XIII
Abbildungsverzeichnis .............................................................................. XV
Tabellenverzeichnis ............................................................................... XVIII
Über den Autor ....................................................................................... XIX
querypanel.de .......................................................................................... XX
Ehrenwörtliche Erklärung ........................................................................ XXI
Urheberrechtshinweis ............................................................................ XXII
Danksagung ........................................................................................... XXIV
III
Begriffs- und Abkürzungsverzeichnis
3i Ideen Impulse Initiativen Internes Vorschlagswesen der Siemens AG
ABAP Advanced Business Application Programming Eigenname einer Programmiersprache
AG Aktiengesellschaft
ALV SAP® List View
API Application Programming Interface
CSV Comma-separated Values
ERP Enterprise Resource Planning
GUI Graphical User Interface
IDE Integrated Development Environment
LoC Lines of Code Softwaremetrik für den Umfang eines Programms
RFC SAP® Remote Function Call
SAP® Systeme, Anwendungen, Programme in der Datenverarbeitung Eigenname eines Unternehmens
SCN SAP® Community Network
SID SAP® System ID
UI User Interface
UML Unified Modeling Language
VBA® Visual Basic® for Applications Eigenname einer Programmiersprache
XLSX Excel® Spreadsheet Das XML-basierte Office® Excel® 2007-Standarddateiformat
IV
0 Vorwort
Hauptprodukt der SAP® AG ist das Softwaresystem „Enterprise Resource Planning“,
kurz: ERP, mit dem sämtliche Geschäftsprozesse in Unternehmen unterstützt werden
können: Vom Rechnungswesen über Personalwirtschaft und Logistik bis hin zu
verschiedensten branchenspezifischen Lösungen. Um die ordnungsgemäße Funktion
dieses komplexen Systems zu gewährleisten, ist nicht nur ein verantwortungsbewusster
Umgang mit den zu Grunde liegenden Stammdaten vorauszusetzen sondern auch deren
ständige Pflege.
Die hierbei entstehenden Arbeitsprozesse sind meist wiederkehrend und sehr
zeitintensiv in der Durchführung. Diesem Problem habe ich mich bei der Siemens AG im
Zuge dieser Masterarbeit gewidmet. Meine herausgearbeitete Lösung mittels SAP® GUI
Scripting steigert die Effizienz zahlreicher Arbeitsvorgänge und stellt ein intensiv
genutztes Werkzeug in mehreren Abteilungen der Siemens AG am Standort Regensburg
dar.
Vor Anfertigung dieser Arbeit gab es bis auf die API [SAP12] keine Literatur zu diesem
Thema. Zu der gesamten Ausarbeitung wurde im Rahmen dieser Thesis viel
Forschungsarbeit geleistet, um die Funktionen und Tücken dieser noch jungen
Schnittstelle von SAP® zu analysieren und deren Handhabung zu erlernen.
0.1 Effektivität und Effizienz: Ein wesentlicher Unterschied
„I will always choose a lazy person to do a difficult job because, he will find an easy way to do it“
- Bill Gates
Wettbewerber, steigender Kostendruck sowie ständig zunehmende Ertragserwartungen
setzen immer höhere Ansprüche an Unternehmen in sämtlichen Branchen. Die damit
1
verbundenen Veränderungen betreffen sowohl die Unternehmensorganisation, als
auch deren Prozesse und verwendeten Systeme gleichermaßen.
Effizienz und Effektivität werden umgangssprachlich meist synonym verwendet. Beide
Begriffe leiten sich aus dem lateinischen Wort „efficientia“, zu Deutsch „Wirksamkeit“,
ab. Die Wirtschaftswissenschaften weisen beiden Begriffen jedoch unterschiedliche
Bedeutungen zu: Die Frage, ob die richtigen Dinge getan werden, ist eine Frage nach der
Effektivität. Hingegen ist die Frage, ob die Dinge richtig beziehungsweise wirtschaftlich
getan werden, eine Frage der Effizienz. Sie betont also die ökonomische Seite der
eingesetzten Mittel, die Effektivität die operative.
Um ein angestrebtes Ergebnis zu erreichen, muss man in jedem Fall effektiv arbeiten.
Diese Arbeit wird umso effizienter, je besser das erzielte Ergebnis und die dafür
eingesetzten Mittel im Verhältnis zueinander stehen. Um dieses Aufwand-Nutzen-
Verhältnis bei einem fixen Ziel zu verbessern, müssen somit die Arbeitsmittel effizienter
gestaltet werden.
Bei vielen Geschäftsprozessen, die über die SAP® GUI ausgeführt werden, ist eine solche
Arbeitsmitteloptimierung in Form einer anwendergesteuerten Automatisierung
möglich. Diese spart nicht nur viel wertvolle Arbeitszeit, sondern eliminiert auch die
Fehleranfälligkeit von monotonen Arbeitsvorgängen, die insbesondere durch das
manuelle Übertragen und Eingeben von Daten auftreten können.
Die daraus gewonnene Arbeitszeit kann für anspruchsvollere Aufgaben verwendet
werden, ausbleibende Fehler sparen daraus resultierende Kosten und Behebungszeit
ein.
0.2 Lösungsmethoden zur Automatisierung von Arbeitsvorgängen in SAP®
Grundsätzlich gibt es zwei Möglichkeiten, Arbeitsabläufe in SAP® Systemen schlanker zu
gestalten. Beide haben sehr unterschiedliche Vor- und Nachteile.
2
Methode 1: Programmierung mit ABAP
ABAP ist eine Programmiersprache, die speziell für die Massendatenverarbeitung in
betriebswirtschaftlichen Anwendungen von SAP®, wie beispielsweise dem ERP,
entwickelt wurde. Mit ABAP lassen sich gebündelte Arbeitsabläufe für alle Anwender
eines Systems gleichzeitig implementieren: Sie werden fester Bestandteil des
Produktivsystems.
Problematisch ist aber, dass ABAP-Erweiterungen nur von hierzu befugtem Personal –
also Entwicklern oder Administratoren – und mit einem kostspieligen
Entwicklerschlüssel von SAP® integriert werden können. In der Praxis werden daher im
Regelfall nur die langfristig wichtigsten Automatisierungen umgesetzt.
Methode 2: GUI Scripting
Beim Scripting in der SAP® GUI werden Methoden und Eigenschaften der einzelnen
Objekte in der GUI benutzt, um Aktionen durchzuführen und Daten auszulesen.
Grundsätzlich sind dabei alle Aktionen möglich, die auch durch die manuelle Anwendung
der GUI durch einen Benutzer möglich sind. Es gelten dieselben benutzerspezifischen
Einschränkungen und Möglichkeiten.
Die anspruchsvollere Aufgabe beim GUI Scripting besteht vor allem darin, auf
Ausnahmesituationen und Fehler in der SAP® GUI während der Laufzeit richtig zu
reagieren.
Fazit
Da Automatisierungen per GUI Scripting für Entwickler oder auch interessierte
Anwender wesentlich einfacher zu integrieren sind und keine unternehmenspolitischen
Hürden bilden, stellt sich diese Kompetenz als interessant und vorteilhaft gegenüber der
Programmierung in ABAP dar. Berücksichtigt werden muss jedoch, dass in den meisten
Fällen von Zeit zu Zeit Anpassungen in den erstellten Scripten notwendig sein werden,
insbesondere bei einem Update der SAP® GUI.
3
Sowohl diese Gegebenheiten, als auch die Tatsache, dass es zu dieser noch jungen SAP®
Schnittstelle keine Literatur gibt, waren eine große Motivation für diese Arbeit.
0.3 Entwicklungsumgebung und vorausgesetzte Kenntnisse
Die VBA®-Entwicklungsumgebung „Integrated Development Environment“, kurz IDE,
dient zur Implementierung eigener Prozeduren in der Microsoft® Office®-Familie.
Gerade wenn es darum geht, die bereits sehr umfassenden Funktionen von
beispielsweise Excel® zu erweitern, ist VBA®, mit entsprechender Programmierkenntnis,
das richtige Werkzeug hierfür. Diese Arbeit stützt sich dabei auf Microsoft® Excel® als
Entwicklungsumgebung, da sich mit dieser Software gleichzeitig Daten effizient
verarbeiten als auch veranschaulichen lassen.
Excel® ist bereits in seiner Ursprungsform ein mächtiges Instrument zur
Tabellenkalkulation mit einer Vielzahl an verschiedensten Funktionen zur Kalkulation,
Datenanalyse und -präsentation. VBA® kann dabei diesen Umfang noch einmal
erweitern und an die jeweiligen Bedürfnisse anpassen.
Abbildung 1: Der Visual Basic® Editor (IDE)
4
Da eine Einführung in VBA® den Rahmen dieser Ausarbeitung bei Weitem sprengen
würde, sind einige Vorkenntnisse erforderlich. Um erfolgreich Lösungen für SAP® mit
Hilfe dieser Arbeit zu erstellen, sollte man bereits über folgende Kenntnisse der VBA®-
Programmierung verfügen:
• Implementierung und Anwendung von Methoden und Funktionen
• Deklaration von Variablen und Konstanten
• Kenntnisse über den Gültigkeitsbereich von Variablen
• Umgang mit Arrays
• Anwendung von Typumwandlungen
• Verschachtelte Schleifen und Wenn-Abfragen
0.4 Kapitelübersicht
Diese Ausarbeitung ist in vier Abschnitte gegliedert. Im ersten Teil wird die Struktur der
SAP® GUI in Bezug auf deren Programmierschnittstelle in den wichtigsten Punkten
detailliert erläutert.
Der zweite Abschnitt befasst sich bereits mit der praktischen Anwendung und geht dabei
besonders auf Problemgebiete und das Exception-Handling ein.
Im darauf folgenden Kapitel 3 wird ein eigens entwickeltes Excel®- und Access®-Add-in
für SAP® GUI Scripting vorgestellt. Mit einem Beispielprojekten aus der beruflichen
Praxis werden die Vorteile dieses Add-ins veranschaulicht.
Abschließend sind im letzten Kapitel praxisbezogene Tipps zu finden. Insbesondere wird
auch noch auf sicherheitsbezogene Fragen und Bedenken eingegangen.
5
1 Einführung in die SAP® GUI Scripting API
Der Begriff API stammt aus dem englischen Sprachraum und ist die Kurzform von
„Application Programming Interface“. Frei ins Deutsche übersetzt bedeutet dies so viel
wie „Schnittstelle zur Anwendungsprogrammierung“.
Diese Schnittstelle besteht seit Version 6.20 des SAP® FrontEnd und wird mit diesem
standardmäßig ausgeliefert. Über sie ist es möglich, auf alle Elemente der SAP® GUI
zuzugreifen. Diese Elemente – im Programmierjargon „Objekte“ genannt – sind in einer
entsprechenden API dokumentiert, welche in der Regel im Installationspfad von SAP®
unter C:\Program Files (x86)\SAP\FrontEnd\SAPgui\SAPguihelp zu finden ist. Da dieses
Dokument leider meist nur spärliche Beschreibungen und kaum Anwendungsbeispiele
bietet, konzentriert sich das folgende Kapitel detailliert auf die wichtigsten Teile dieser
API. In diesem Kapitel sei daher grundsätzlich auf [SAP12] verwiesen.
1.1 Die Objekthierarchie in der SAP® GUI
Der Zugriff auf die SAP® GUI findet über streng hierarchisch geordnete Top-Level-
Objekte statt. Dabei bildet die GuiApplication den Einstiegspunkt zu den einzelnen SAP®
Systemen, die als GuiConnections bezeichnet werden. Jede dieser Verbindungen besteht
aus mindestens einer bis maximal sechs GuiSessions, den einzelnen Instanzen, in denen
Transaktionen durchgeführt werden.
Verbindungen können manuell über das SAP® Logon Pad oder über die Methode
OpenConnection bzw. OpenConnectionByConnectionString der GuiApplication
aufgebaut werden. Mit Verbindungsaufbau wird gleichzeitig die erste GuiSession erstellt
und angezeigt. In der Regel können bis zu fünf weitere Sessions per CreateSession-
Methode der GuiConnection erstellt werden.
6
Während die GuiApplication die gesamte Anwendung darstellt, ist eine GuiConnection
lediglich ein Zugangspunkt zu einer bestehenden Verbindung in ein SAP® System. Alle
Transaktionen werden immer in einer untergeordneten GuiSession durchgeführt. Jede
dieser Instanzen enthält alle wichtigen Informationen wie Benutzer, SID und Client in
dem Objekt GuiSessionInfo (mehr dazu in Abschnitt 1.2.4 GuiSessionInfo). Das jeweilige
Hauptfenster einer Session bildet die Klasse GuiMainWindow, alle weiteren Fenster sind
vom Typ GuiModalWindow. Grafisch stellt sich dieser Aufbau der soeben beschriebenen
obersten vier Ebenen wie folgt dar:
Abbildung 2: Hierarchische Darstellung der GUI-Objekte und deren Kinds-Objekte
Top-Level-Interface-Objekte
Jeder GuiSession unterliegt als Kinds-Objekt ein GuiMainWindow, welches den
Einstiegspunkt für die Interaktion mit dieser Instanz bildet.
Abbildung 3: Die Kinds-Objekte des GuiMainWindow
GuiApplication GuiConnection GuiSessionGuiSession
1..* 1..6
GuiMainWindow
GuiModalWindow
GuiSessionInfo
1
1
0..*
GuiMainWindow
GuiMenubar
GuiToolbar
GuiUserArea
GuiTitlebar
GuiStatusbar
GuiToolbar 1..2
7
Nachfolgende Abbildung 4 beschreibt die visuelle Abgrenzung Top-Interface-Objekte
eines GuiMainWindows.
Abbildung 4: Die Aufteilung der SAP® GUI Oberfläche
Wichtiger Hinweis: Zu beachten ist, dass die Verfügbarkeit von einigen Objekten auf dem
gewählten Design-Modus basiert. Die oben dargestellte Titelleiste ist beispielsweise im
klassischen Design der SAP® GUI nicht verfügbar. Die Verwendung des Befehls
Session.findById("wnd[0]/titl").Text
würde eine Exception auslösen, wenn das klassische Design wie in Abbildung 5 aktiv ist.
Abbildung 5: Die SAP® GUI in klassischer Ansicht
8
1.2 Die wichtigsten GUI Objekte, ihre Eigenschaften, Methoden und Events
Nachfolgend führe ich die, meiner Einschätzung nach wichtigsten Objekte der SAP® GUI
Scripting API, detailliert auf:
Für die bereits im letzten Abschnitt ausführlich erläuterten Objekte GuiApplication,
GuiConnection und GuiSession wird keine gesonderte Einleitung mehr gegeben, sondern
lediglich die jeweilig wichtigsten Methoden, Eigenschaften und Events beschrieben.
1.2.1 GuiApplication
Methode Bedeutung
OpenConnection As GuiConnection
Description As String
[Sync] As Boolean,
[Raise] As Boolean
Startet eine neue Verbindung über die
Verwendung der Systembeschreibung, wie sie
im SAP® Logon Pad hinterlegt ist.
OpenConnectionByConnectionString
As GuiConnection
ConnectString As String
Diese Methode startet eine neue Verbindung
über den ConnectionString, also die Host-
Adresse mit entsprechendem Port. Mehr dazu
in 2.2.1 Neue Verbindung herstellen.
Tabelle 1: Die wichtigsten Methoden der GuiApplication
Eigenschaft Bedeutung
ActiveSession As Object Repräsentiert die aktuell aktive Session.
AllowSystemMessages As Boolean
Read-Write-Property
Steuert die Behandlung von Systemnachrichten
der SAP® GUI.
9
Connections As
GuiComponentCollection
Hier befinden sich die untergeordneten
GuiConnections, falls vorhanden.
ConnectionErrorText As String Diese Eigenschaft enthält eine detaillierte
Fehlerbeschreibung, falls es beim letzten
Verbindungsaufbau ein Problem gab.
NewVisualDesign As Boolean Gibt den Wert False zurück, falls das klassische
Design der SAP® GUI verwendet wird. Bei
Nutzung des visuellen Designs ist der
Rückgabewert True.
MajorVersion As Long Gibt die Version der benutzten SAP® GUI als
Zahlenwert zurück (bei Version 7.30
beispielsweise der Wert 7300). Tabelle 2: Die wichtigsten Eigenschaften der GuiApplication
Event Bedeutung
CreateSession
Session As GuiSession
Bei der Erzeugung einer neuen Session wird dieser Event
aufgerufen.
DestroySession
Session As GuiSession
Dieser Event wird ausgeführt, bevor eine Session beendet
wird.
Error
ErrorId As Long,
Desc1 As String,
Desc2 As String,
Desc3 As String,
Desc4 As String
Dieser Event behandelt alle in der SAP® GUI entstehenden
Fehler und liefert in insgesamt fünf Variablen detaillierte
Informationen hierzu an den Entwickler zurück.
Tabelle 3: Die wichtigsten Events der GuiApplication
10
Der weitere Teil des Kapitels gehört nicht zur Leseprobe.
2 Arbeitsvorgänge erfassen und implementieren
Mit diesem Kapitel erfolgt der Übergang zur Praxis. Es wird schrittweise der Weg zum
Aufbau eines automatisierten Arbeitsablaufes dargestellt, beginnend mit der
Vorbereitung der Entwicklungsumgebung.
2.1 Vorbereiten der Entwicklungsumgebung
2.1.1 Aktivieren der Scripting-Schnittstelle in der SAP® GUI
Um einen Zugriff auf die SAP® GUI überhaupt möglich zu machen, muss vorab die
entsprechende Einstellung in den Optionen der SAP® GUI vorgenommen werden. Hierzu
wählt man aus dem Bereich „Barrierefreiheit & Scripting“ die Seite „Scripting“ und setzt
einen Haken bei „Scripting aktivieren“. Falls gewünscht, kann bei jedem
Verbindungsaufbau durch ein Script eine Benachrichtigung aktiviert werden.
Abbildung 8: Scripting-Optionen der SAP® GUI
23
2.1.2 IntelliSense® mit den SAP® GUI Objekten in VBA® nutzen
IntelliSense® ist ein von Microsoft® angebotenes Hilfsmittel zur automatischen
Vervollständigung bei der Eingabe von Quellcode. Dabei erhält der Entwickler während
seiner Arbeit zusätzliche Informationen über einzelne Methoden und Eigenschaften, die
ihm die Arbeit erleichtern und die insbesondere den Umfang des manuell
einzugebenden Quellcodes reduzieren sollen.
Diese Funktion ist rein optional und erleichtert die Arbeit lediglich. Ein Beispiel für einen
Intellisense-Vorschlag durch VBA® wird in der folgenden Abbildung veranschaulicht.
Abbildung 9: Intellisense-Funktion während der Eingabe von Programmcode
Da VBA® grundsätzlich die Objekte der SAP® GUI Scripting API nicht kennt, müssen diese
zunächst „angelernt“ werden. Dies geschieht über einen Verweis auf eine
entsprechende Bibliothek, die sämtliche Informationen über die SAP® GUI Objekte
bereitstellt. Zu finden ist diese Datei in aller Regel direkt im Installationsordner des SAP®
FrontEnd:
C:\Programme\SAP\FrontEnd\SAPgui\sapfewse.ocx
24
Der weitere Teil des Kapitels gehört nicht zur Leseprobe.
2.2.2 In bestehende Verbindungen einklinken
Sowohl aufgrund der soeben beschriebenen Einschränkungen beim Erstellen einer
neuen Verbindung durch SAP® GUI Scripting als auch wegen Sicherheitsaspekten
empfiehlt es sich stets, eine bereits bestehende Verbindung für den Script-Betrieb zu
nutzen. Wie bereits in Abschnitt 1.1 Die Objekthierarchie in der SAP® GUI erläutert,
finden sich die einzelnen Verbindungen als GuiConnection in der GuiApplication wieder.
Vor Ausführung eines Scripts muss eine hierfür passende GuiSession gewählt werden, in
der die Interaktionen stattfinden sollen. Sicher soll ein Script nie in einem beliebigen
SAP® System aufgeführt werden. Um die passende GuiSession zu finden, müssen alle
GuiConnections auf die gewünschte Verbindung hin durchsucht werden. Zur
Identifizierung einer Verbindung kann die SessionInfo einer beliebigen GuiSession
ausgelesen werden. Die Eigenschaften SystemName und Client repräsentieren dabei die
SID des Systems und den eingeloggten Mandanten.
Nachfolgender Code zeigt beispielhaft, wie man alle GuiSessions aller bestehenden
GuiConnections auflistet und deren Eigenschaften ausliest.
'Das Arbeitsblatt leeren Cells.Clear 'Überschriften setzen Rows(1).Font.Bold = True Cells(1, 1).Value = "ID" Cells(1, 2).Value = "#" Cells(1, 3).Value = "SID" Cells(1, 4).Value = "Mandant" Cells(1, 5).Value = "Benutzer" Cells(1, 6).Value = "Aktuelle Transaktion" 'Zelle A2 auswählen Cells(2, 1).Select 'Variablendeklaration Dim GuiApplication As SAPFEWSELib.GuiApplication Dim GuiConnection As SAPFEWSELib.GuiConnection Dim GuiSession As SAPFEWSELib.GuiSession 'Mit der SAP® GUI verbinden Set GuiApplication = GetObject("SAPGUI").GetScriptingEngine
29
Der weitere Teil des Kapitels gehört nicht zur Leseprobe.
2.3 Unterstützende Software
Gerade bei der Implementierung von umfangreicheren Scripts empfiehlt es sich, auf
Tools zurückzugreifen, die die Suche nach den benötigten Objekten und deren
Methoden erleichtern. Nachfolgend werden drei Werkzeuge vorgestellt, welche die
Arbeit an Automatisierungen in der SAP® GUI effizienter gestalten.
Der SAP® Script-Rekorder
Seit Veröffentlichung der Version 6.20 der SAP® GUI befindet sich darin für alle
Anwender verfügbar ein einfacher Script-Rekorder. Der klare Aufbau erinnert an ein
Aufnahme- und Abspielgerät: Es gibt jeweils eine Schaltfläche für Abspielen,
Aufzeichnen und Stoppen.
Abbildung 17: Der SAP® Script-Rekorder mit erweiterten Einstellungsmöglichkeiten
Gestartet werden kann der Rekorder aus dem Options-Menü jeder beliebigen Session
unter „Script-Aufzeichnung und –Playback…“. Ausführliche Instruktionen zum Umgang
mit diesem Werkzeug folgen unter 2.5 Scripte aufzeichnen.
Scripting Tracker
Dieses professionelle Hilfsmittel bietet einen stark erweiterten Funktionsumfang
gegenüber den SAP®-eigenen Entwicklertools. Der Scripting Tracker besteht aus zwei
Komponenten, die im Folgenden beschrieben werden.
Per Analyzer können alle aktiven GuiSessions gescannt und im Detail untersucht werden.
Für jedes gefundene Objekt werden die wichtigsten Daten wie ID, Type und Name
32
ausgelesen. Diese Informationen werden benötigt, um die Objekte richtig zu
identifizieren und über die Funktion FindById anzusprechen.
Per Rechtsklick auf das entsprechende Objekt in der Baumansicht kann das Element in
der GUI mit einem roten Rahmen gekennzeichnet und damit identifiziert werden. So
behält man stets den Überblick – auch bei umfangreicheren Darstellungen.
Eine detaillierte Beschreibung zur richtigen Anwendung der Software ist in Abschnitt
2.4.3 Identifizierung von Objekten mit Hilfe des Scripting Trackers und 2.5 Scripte
aufzeichnen zu finden.
Abbildung 18: Die Analyzer-Funktion des Scripting Trackers
33
Der Recorder ersetzt die SAP®-eigenen Entwicklungstools und bietet dabei noch einen
erweiterten Funktionsumfang. Wichtigstes Feature ist, dass alle Aufzeichnungen in
Echtzeit, also während der Laufzeit, mitverfolgt werden können. Hierdurch wird ein
besseres Verständnis des aufgezeichneten Codes gewährleistet. Die anschließende
Umsetzung der Aufzeichnung nach VBA® fällt so in der Regel wesentlich leichter.
Abbildung 19: Die Recorder-Funktion des Scripting-Trackers
Weitere Informationen zu der Anwendung sind im Internet unter tracker.stschnell.de zu
finden. Ebenfalls kann das Tool dort heruntergeladen werden.
Eine Videovorstellung mit Anwendungsbeispiel gibt es online auf YouTube unter
youtu.be/jZQP6vwedsc.
query panel Add-in für Microsoft® Excel® und Access®
Dieses eigens entwickelte Add-in bietet eine große Auswahl an nützlichen Funktionen
rund ums SAP® GUI Scripting, dem Import von Daten aus der SAP® GUI nach Microsoft®
Excel® und Access® und der anschließenden Datenverarbeitung. Eine detaillierte
Dokumentation ist Kapitel 3 query panel: Ein Excel®- und Access®-Add-in für SAP® GUI
Scripting zu entnehmen.
34
2.4 GUI Objekte richtig identifizieren
Um den vollen Funktionsumfang der verschiedenen Objekte in einer SAP®-Transaktion
nutzen zu können, ist es Voraussetzung, zu wissen, mit welchem Objekt-Typ man es
überhaupt zu tun hat. Erst dann kann man sich über deren Eigenschaften, Methoden
und Events informieren (siehe Abschnitt 1.2 Die wichtigsten GUI Objekte, ihre
Eigenschaften, Methoden und Events) und diese entsprechend für die eigenen Zwecke
nutzen. Die Identifikation von Objekten erfolgt dabei ausschließlich über spezielle ID-
Strukturen in der SAP® GUI. Nachfolgend wird zunächst der Aufbau dieser IDs erläutert
um anschließend zwei Möglichkeiten zu deren Bestimmung vorzustellen.
2.4.1 Aufbau von SAP® GUI IDs
Bereits beim Aufzeichnen von Makros hat man ausschließlich mit Objekten zu tun, die
über die GUI ID identifiziert werden. Die Zuordnung stellt dabei stets die Funktion
FindById sicher. Die Struktur der GUI IDs innerhalb einer GuiSession ist dabei
folgendermaßen aufgebaut:
wnd[0]/usr/cntlALV_CONTAINER/shellcont/shell
Beschreibt das Fenster der
Session, in dem sich das
Objekt befindet. Der Wert 0
verweist auf das
GuiMainWindow, alle
höheren Werte auf das
jeweils nächste
GuiModalWindow.
Dieser Teil beschreibt den
Bereich im jeweiligen
Fenster, in dem sich das
Objekt befindet. Die
Bereiche, wie in Abbildung 4
auf Seite 8 dargestellt, sind
folgendermaßen kodiert:
• GuiMenubar: mbar
• GuiToolbar: tbar
• GuiUserArea: usr
• GuiStatusbar: sbar
Dieser Wert entspricht dem
technischen Namen des
Objekts. Auch hier können
noch weitere hierarchische
Gliederungen auftreten, wie
auch in diesem Beispiel zu
sehen ist.
35
Der weitere Teil des Kapitels gehört nicht zur Leseprobe.
Über den Aufnahme-Button beginnt die Aufzeichnung aller durchgeführten Aktionen in
der SAP® GUI. Zum Abschluss der Aufzeichnung wird der Stopp-Button betätigt. Das
aufgenommene Script wird als Textdatei abgespeichert. Beim Betrachten der erstellten
Script-Datei kann der Code in folgende Inhalte gegliedert werden.
Abbildung 22: Abschnitte im Quellcode eines aufgenommenen Scripts durch den SAP® Script-Rekorder
Manche Funktionen in der SAP® GUI können nicht aufgezeichnet werden. Beispielsweise
können zwar Kontextmenüs geöffnet, jedoch deren Aktionen mit den enthaltenen
Einträgen nicht aufgenommen werden. Warum SAP® an dieser Stelle die Funktionen des
Rekorders einstellt, ist nicht näher bekannt. Möglicherweise handelt es sich hierbei auch
um einen Fehler in der Schnittstelle.
2.6 Auslesen von Daten aus Tabellen
Ein besonderes Augenmerk in Bezug auf eine langfristig funktionierende
Automatisierung sollte dem Export von Daten aus SAP® zur Weiterverarbeitung
gewidmet werden. Bei der von SAP® meist angebotenen Exportfunktion, wie sie
Abbildung 23 zeigt, können in der Struktur der Daten Unregelmäßigkeiten auftreten, die
sich besonders gravierend bei der anschließenden Verarbeitung auswirken können.
Schon eine verschobene Spalte oder eine ungewollte Leerzeile können dabei
maßgeblich stören.
38
Der weitere Teil des Kapitels gehört nicht zur Leseprobe.
2.6.2 Daten im Table Control
Eine weitere gängige Darstellungsart für Daten in der SAP® GUI ist das Table Control, ein
Objekt der Klasse GuiTableControl, vorgestellt in 1.2.10 GuiTableControl. Obwohl es
einen wesentlich kleineren Funktionsumfang als das ALV Grid Control bietet und
schwieriger zu handeln ist, wird es noch in vielen Transaktionen mit langen Datensätzen
wie beispielsweise der Transaktion MD04 als Datenbrowser verwendet. Auf den ersten
Blick erscheinen beide Controls recht ähnlich, zum Auslesen müssen sie jedoch
unterschiedlich bedient werden.
Abbildung 29: Die Transaktion MD04 mit einem GuiTableControl (roter Rahmen)
44
Der weitere Teil des Kapitels gehört nicht zur Leseprobe.
2.6.4 Auslesezeiten
Je größer die Anzahl der Datenfelder in einer auszulesenden Tabelle ist, desto länger ist
die hierfür benötigte Zeit. Um ein Gefühl für die Dauer eines solchen Vorgangs zu
vermitteln, wurde eine Zeitmessung während der Datenübertragung aus einem ALV Grid
View in eine CSV-Datei durchgeführt. Bei jeder der drei Messungen wurden die
Tabellendimensionen (Spalten und Reihen) variiert, die Anzahl der Datenfelder blieb
jedoch konstant bei 150.000.
Die Messung wurde an einem PC mit einer Taktung von 3,2 GHZ durchgeführt. Als
Messinstrument wurde in den Programmverlauf eine Stoppuhr implementiert, die auf
die Millisekunde exakt misst (siehe Anhang auf Seite X). Die folgende Tabelle zeigt die
Ergebnisse der drei Messungen.
Dimension
Datenfelder
Auslesezeit in [s]
Zeit pro Datensatz in [ms.]
3 x 50.000 150.000 175,252 1,17 ms.
5 x 30.000 150.000 169,649 1,13 ms.
15 x 10.000 150.000 173,649 1,16 ms. Tabelle 21: Ergebnisse der Zeitmessung während des Datenexports aus einem ALV Grid View
Die gemessenen Zeiten für den Export von 150.000 Datenfeldern bewegten sich
zwischen 169 und 175 Sekunden. Die kürzeste Zeit wurde bei der zweiten Messung
beobachtet. Die Dimension einer Tabelle scheint also keinen direkten Einfluss auf die
Dauer der Auslesezeit zu haben. Im Mittel kann beim Datenexport von Tabellen in dieser
Größenordnung mit einer Dauer von 1,2 Millisekunden pro Datenfeld kalkuliert werden.
49
Alternativen zum Auslesen von Tabellen
Ergänzend sei an dieser Stelle erwähnt, dass es eine wesentlich effizientere Methode
gibt, große Datenmengen aus SAP® Tabellen auszulesen. Hier bietet die Funktion
RFC_READ_TABLE aus der RFC Schnittstelle von SAP® wesentlich schnellere
Auslesezeiten. Diese Variante funktioniert für alle Tabellen, die über die Transaktion
ZE16 aufgerufen werden können. Für die übrigen ist die soeben dargestellte Methode
via GUI Scripting die richtige.
2.7 Exception-Handling in VBA® und der SAP® GUI
Exception-Handling wird ins Deutsche als „Behandlung von Ausnahmen“ übersetzt. Mit
Ausnahmen sind in der Softwareentwicklung Fehlersituationen gemeint, die in einem
Programm oder Script während der Ausführung entstehen können. Auf solche Fehler
sollte stets reagiert werden, was unter dem Begriff „Exception-Handling“, zu Deutsch
„Behandeln von Fehlern“, zu verstehen ist.
Exceptions treten immer erst zur Laufzeit ein, das heißt erst bei der Ausführung des
Programms oder Scripts. In der Regel treten Ausnahmen bei arithmetischen
Operationen, Typkonvertierungen, Verletzung von Arraygrenzen oder beim Zugriff auf
noch nicht erzeugte Objekte auf. Im folgenden Kapitel wird es neben den eben
beschriebenen Ausnahmen im Code selbst auch um solche Exceptions gehen, die
während eines automatisierten Vorgangs direkt in der SAP® GUI selbst auftreten können
und wie darauf reagiert werden kann.
50
2.7.1 Programmablauf verfolgen
Zur Vorbereitung auf eine gute Fehlerbehandlung gilt es in erster Linie zu verstehen, was
der Quellcode macht, ihn zur Laufzeit zu beobachten und zu prüfen, ob der Ablauf wie
geplant stattfindet und ob alle Variablen die erwarteten Inhalte besitzen. Hierfür bietet
VBA® verschiedene Techniken, die meist in Kombination angewendet werden:
• Zeilenweise Ausführung: Der Code wird zeilenweise von Anfang an ausgeführt.
So lässt sich Schritt für Schritt oder besser Zeile für Zeile beobachten, wie sich
der Code verhält.
• Haltepunkt: Diese Funktion ermöglicht es, mit einem sogenannten Haltepunkt
den Ablauf des Programms an einer festgelegten Stelle gezielt zu stoppen.
• Überwachungs-Ausdrücke: Wenn die Inhalte von einzelnen Variablen
überwacht werden sollen, kann diese Funktion genutzt werden.
Code zeilenweise ausführen
Bisher wurde ein Codeabschnitt üblicherweise mit der F5-Taste oder dem
entsprechenden Toolbarsymbol gestartet. Das entspricht dem Menübefehl
„Ausführen“, „Sub/Userform ausführen“ und lässt die Anweisungen ohne
Unterbrechung (bis zum Auftreten eines Fehlers) laufen. Im Debuggen-Menü finden sich
jedoch noch viele Alternativen und Ergänzungen hierzu:
• Einzelschritt: Mit der Taste F8 kann der Code schrittweise ausgeführt werden.
Dabei wird stets die Zeile gelb gefärbt, die als nächstes ausgeführt wird.
• Prozedurschritt: Wenn in einer Prozedur weitere Unterprozeduren aufgerufen
werden, kann man sich deren Details ersparen, indem man diese Zeilen mit
Umschalt+F8 in einem Schritt bis zum Prozedurende ausführt. Mit F8 könnte man
auch solche Unterprozeduren weiter zeilenweise ausführen.
• Prozedur abschließen: Mit STRG+Umschalt+F8 kann man eine bereits
begonnene Prozedur bis zum Ende abschließen. Handelt es sich hierbei um eine
51
Unterprozedur, kehrt man anschließend automatisch zur übergeordneten
zurück.
• Ausführen bis Cursor-Position: Anstelle der Verwendung von vielen
Haltemarken lässt sich auch der Cursor als eine solche verwenden. Er muss hierzu
einfach an die gewünschte Zeile gestellt werden und anschließend kann mit
Strg+F8 der Code bis zur gewählten Position ausgeführt werden.
Code anhalten
Es gibt Varianten, den Code automatisch anzuhalten, wenn er ausgeführt wird:
• Haltepunkte: Dies sind temporäre Markierungen, an denen der Code
automatisch stoppt. Eine Zeile mit Haltepunkt wird in VBA® rot gekennzeichnet.
Ist der Compiler an diesem Punkt angelangt, wird die Zeile gelb hinterlegt. Mit
den zuvor beschriebenen Funktionen aus „Code zeilenweise ausführen“ könnte
nun ab dem Haltepunkt weiter schrittweise kompiliert werden.
• Stopp: Mit dieser VBA®-Anweisung kann ebenfalls an jeder beliebigen Stelle die
Codeausführung angehalten werden.
Während die Stopp-Anweisung wie jedes andere VBA®-Schlüsselwort dauerhaft im Code
enthalten bleibt, werden Haltepunkte nicht gespeichert. Diese können mit „Debuggen“,
„Alle Haltepunkte löschen“ auch komplett entfernt werden, ohne die Anwendung
schließen zu müssen.
52
Abbildung 33: Beispiel zur Verwendung eines Haltepunkts
In der obigen Abbildung ist ein dunkelrot hinterlegter Haltepunkt zu sehen, die
Codeausführung hat vor der markierten Zeile gestoppt. Bevor der Code weiter
ausgeführt wird, kann durch Überfahren einer Variablen mit der Maus im QuickInfo
deren Inhalt angezeigt werden, in Abbildung 33 beispielsweise von der Variablen
WinKennung.
Überwachungen hinzufügen
Da nicht alle Variablen ihren Inhalt anzeigen können, wenn man während einer
Laufzeitunterbrechung die Maus über ihrem Namen ruhen lässt, gibt es noch die
Möglichkeit, Überwachungen für Variablen zu definieren. Deren Ergebnisse werden in
einem eigenen Fenster gelistet und dürfen nicht nur einzelne Variablen, sondern ebenso
Funktionen, Berechnungen und vor allem Objekte enthalten.
Um einen bestimmten Wert zu überwachen, muss dieser zunächst markiert werden. Per
Rechtsklick wählt man aus dem Popup-Menü den Befehl „Überwachung hinzufügen“
aus.
53
Der weitere Teil des Kapitels gehört nicht zur Leseprobe.
3 query panel: Ein Excel®- und Access®-Add-in für SAP® GUI Scripting
Im Zuge dieser Arbeit entstand ein mittlerweile sehr umfangreiches (2.050 LOC) Add-in
für Microsoft Excel® und Access®. Dieses Paket stellt einen erweiterten
Funktionsumfang für die Entwicklungsumgebung der beiden genannten Anwendungen
von Microsoft® dar.
Ein Entwickler kann mit Hilfe dieser Add-ins wesentlich schneller und übersichtlicher
programmieren. Die enthaltenen Methoden und Funktionen sind als Bausteine zu
verstehen, die je nach Bedarf mit entsprechenden Parametern genutzt werden können.
Oft benötigte und nützliche Programmabschnitte wurden optimiert und mit einem
ausgereiften Exception-Handling versehen.
Das Herzstück des Add-ins bilden die einzelnen Klassenmodule (siehe Abbildung 37:
Hierarchischer Aufbau des Add-ins). Darin sind alle wichtigen Funktionsbausteine
kategorisiert, mit denen wesentlich effizientere und übersichtlichere Programmabläufe
gestaltet werden können.
Abbildung 37: Hierarchischer Aufbau des Add-ins
57
Unterstützt werden die Funktionen von einer grafischen Oberfläche (frmReport), in der
alle Aktivitäten protokolliert werden und deren Fortschritt überwacht werden kann
(siehe Abbildung 38: Report-Fenster des Add-ins während der Laufzeit).
Abbildung 38: Report-Fenster des Add-ins während der Laufzeit
Im nachfolgenden Abschnitt werden die Aufgaben der in den Klassen enthaltenen
Funktionen und Methoden genau erläutert.
Der Abschnitt 3.2 belegt, wie effizient diese einzelnen Bausteine in einem Script
verwendet werden können. Verdeutlicht wird dies, indem umfangreiche
Codeabschnitte des Script-Rekorders durch eine einzige Funktion des Add-ins
substituiert werden und damit sowohl die Übersicht maximiert als auch die
Fehleranfälligkeit minimiert werden.
Im letzten Abschnitt wird beispielhaft der Weg zur Automatisierung eines
Arbeitsvorgangs aufgezeigt. Obwohl das dargestellte Projekt einfach und damit
überschaubar ist, enthält es alle wichtigen Schritte zu einem effizienten
Automatisierungs-Tool.
58
3.1 Funktionsumfang der Klassen
Dieser Abschnitt gibt einen Überblick über alle Funktionen, die derzeit in query panel
enthalten sind. Jede Methode und Funktion wird mit Parameter und Rückgabewert –
sofern vorhanden – deklariert und anschließend beschrieben. In eckigen Klammern
gelegte Parameter gelten als optional und müssen daher nicht zwingend mitgegeben
werden. Insgesamt unterteilt sich der Funktionsumfang zum aktuellen Zeitpunkt in
sieben Kategorien, die jeweils als Klasse modelliert sind:
1. SAPGUI
2. RFC
3. Report
4. TimeAndDate
5. FilesAndFolders
6. Functionlib
7. Excel (nur in der Version für Excel® enthalten)
3.1.1 SAPGUI
Diese Bibliothek beinhaltet das Herzstück der Software. Alles was nötig ist, um mit der
SAP® GUI zu kommunizieren, ist in dieser Klasse enthalten. Alternativ zu diesen
Bausteinen kann auch direkt mit den öffentlichen Variablen gearbeitet werden.
Öffentliche Variablen
Um den vollen Funktionsumfang der SAP® GUI Scripting Schnittstelle auch im Add-in
anzubieten, werden alle wichtigen GUI Objekte in dieser Klasse öffentlich bereitgestellt:
• GuiApplication (siehe 1.2.1 GuiApplication)
• GuiConnection (siehe 1.2.2 GuiConnection)
• Session (siehe 1.2.3 GuiSession)
• MainWindow (siehe 1.2.5 GuiMainWindow & GuiModalWindow)
59
OpenSession Paramter: [SID As String], [Client As Integer] Rückgabewert: Boolean
Diese Funktion erstellt eine neue Instanz, falls die SAP® GUI mit dem gewünschten
System (SID) und Mandant (Client) verbunden ist. Beide Parameter sind optional. Wird
keine SID angegeben, erscheint ein Auswahldialog, aus dem der Anwender aus allen
aktiven Verbindungen wählen kann. Ist der Parameter Client nicht deklariert, wird keine
Rücksicht auf den Mandanten eines Systems genommen. Als Rückgabewert gibt die
Funktion Auskunft darüber, ob eine neue Instanz erfolgreich erstellt werden konnte.
Nach erfolgreichem Verbindungsaufbau kann die erstellte Session über die
Objektvariable SAPGUI.Session und deren Hauptfenster über SAPGUI.MainWindow
angesteuert werden.
CloseSession
Mit dieser Methode wird eine zuvor erstellte Instanz geschlossen. Falls es sich dabei um
die letzte Instanz einer Verbindung handelt, wird diese zugleich getrennt. Auf die
Objektvariablen SAPGUI.Session und SAPGUI.MainWindow wird ein Nullverweis gelegt.
setGuiApplication Rückgabewert: Boolean
Per setGuiApplication wird die Objektvariable SAPGUI.GuiApplication mit der SAP® GUI
verbunden. Der Rückgabewert gibt Aufschluss über den Erfolg dieser Kopplung. Ist die
SAP® GUI zwar vorhanden, jedoch die Scriptingfunktion deaktiviert, ist der
Rückgabewert False. Eine Meldung mit dem Hinweis, dass die Scripting-Einstellungen
nicht aktiviert sind, erscheint zusätzlich im Report-Fenster des Add-ins.
setGuiConnection Paramter: [SID As String], [Client As Integer] Rückgabewert: Boolean
Über diese Funktion wird die Objektvariable SAPGUI.GuiConnection mit einer
bestehenden Verbindung der SAP® GUI verknüpft, falls eine SID als Parameter
angegeben wurde. Ist dies nicht der Fall, erscheint ein Auswahldialog mit allen
verfügbaren Verbindungen. Optional kann ebenfalls ein Mandant (Client) angegeben
60
werden. Ist der Mandant nicht angegeben, wird er beim Verbindungsaufbau nicht
berücksichtigt.
ScriptingActive Rückgabewert: Boolean
Diese Funktion gibt Auskunft über die Scripting-Einstellungen im System. Ist Scripting
aktiviert, wird der Wert True zurückgegeben, andernfalls False.
ChooseConnection Rückgabewert: Boolean
Eine neue Verbindung kann auch über diesen Befehl hergestellt werden. Dabei erscheint
ein Auswahlfenster mit allen verfügbaren Verbindungen, die aktuell in dem System
bestehen. Die getroffene Auswahl wird anschließend der Objektvariable
SAPGUI.GuiConnection zugeordnet.
ActiveConnectionsCount Rückgabewert: Integer
Die Anzahl der aktiven Verbindungen kann mithilfe dieser Funktion ermittelt werden.
StartTransaction Parameter: Trans As String, [DoNotReport As Boolean = False] Rückgabewert: Boolean
Diese Funktion startet eine bestimmte Transaktion in der aktuellen Instanz
(SAPGUI.Session). Optional kann eine Meldung im Report-Fenster über den Parameter
DoNotReport verhindert werden. Diese Option kann beispielsweise bei sich oft
wiederholenden Transaktionsaufrufen genutzt werden, um eine Überflutung des
Report-Fensters zu vermeiden.
Auch hier gibt der Rückgabewert Auskunft über den Erfolg der Funktion. Gibt es eine
Transaktion beispielsweise nicht oder hat der Anwender keinen Zugriff darauf, ist der
Wert False.
61
PressKey Parameter: Key As guiKey
Diese Methode sendet einen Tastaturbefehl an die verbundene Instanz. Die
Enumeration von guiKey sieht dabei folgendermaßen aus:
Enum guiKey keyEnter = 0 keyDetails = 2 keyZurück = 3 keyAusführen = 8 keyExportieren = 9 keyAbbrechen = 12 End Enum
Abbildung 39: Die Enumeration von guiKey.
InStrMainWindowText Parameter: SearchStr As String Rückgabewert: Boolean
Mit diesem Befehl lässt sich ermitteln, ob sich eine bestimmte Zeichenkette im
Fenstertext des Hauptfensters der jeweiligen Session (SAPGUI.MainWindow) befindet.
Bei allen Vergleichsfunktionen in query panel spielt die Groß- und Kleinschreibung der
Zeichenketten keine Rolle.
StatusBarText Rückgabewert: String
Mit StatusBarText lässt sich der Inhalt der StatusBar im Hauptfenster ermitteln (siehe
Abbildung 4: Die Aufteilung der SAP® GUI Oberfläche auf Seite 8).
InStrStatusBarText Parameter: SearchStr As String Rückgabewert: Boolean
Besitzt dieselbe Funktion wie InStrMainWindowText, nur dass hier die
Vergleichszeichenkette aus der StatusBar verwendet wird stammt.
WindowText Parameter: [Wnd As Integer = 1] Rückgabewert: String
Gibt den Titel eines bestimmten Fensters zurück. Standardmäßig ist das erste Fenster
hierarchisch unter dem Hauptfenster (1) definiert.
62
WindowExists Parameter: [Wnd As Integer = 1] Rückgabewert: Boolean
Dieser Befehl prüft, ob es ein bestimmtes Fenster der aktuellen Instanz der SAP® GUI
existiert. Das Hauptfenster trägt dabei den Index 0, alle weiteren haben einen um eins
erhöhten Wert. Mit dieser Funktion kann beispielsweise geprüft werden, ob eine Warn-
oder Fehlermeldung von der SAP® GUI erzeugt wurde.
WindowClose Parameter: [Wnd As Integer = 1] Rückgabewert: Boolean
Dieser Befehl schließt ein bestimmtes Fenster. Der Parameterwert 0 stellt dabei das
MainWindow dar; jeder höhere Wert das nächste hierarchisch niedrigere Fenster. Der
Rückgabewert gibt Auskunft darüber, ob das Fenster erfolgreich geschlossen werden
konnte. Wenn das Fenster nicht existiert, wird der Wert False zurückgegeben.
setALVGridView Rückgabewert: Boolean
Über diesen Befehl kann eine Datentabelle als ALV-Gridview (siehe Abschnitt 2.6.1
Daten im ALV Grid Control) umgestellt werden. Der Rückgabewert gibt Auskunft über
den Erfolg der Umstellung.
ExportToCSV Parameter: ID As String, FileName As String, [FormatValues = True] Rückgabewert: Boolean
Diese Funktion exportiert ein GuiGridView oder ein GuiTableControl in das CSV-Format.
Der Parameter ID stellt dabei die SAP® GUI ID (siehe 2.4.1 Aufbau von SAP® GUI IDs)
des Objekts dar. Auch hier gibt der Rückgabewert Aufschluss über den Erfolg des
Exports.
ExportToXLSX Parameter: saveAs As String, [showWarnings = False] Rückgabewert: Boolean
Exportiert Daten in der SAP® GUI in das XLSX-Dateiformat von Microsoft® Office® Excel®.
Dieser Befehl nutzt dabei die Funktion der SAP® GUI selbst. Die Datenstruktur muss also
die Funktion zur Verfügung stellen, ansonsten wird der Rückgabewert False geliefert.
63
Bei dieser Art von Export wird von der SAP® GUI eine Formatierung der Tabelle
mitgeliefert.
ExportToList Parameter: saveAs As String, [showWarnings = False], [setGridView As Boolean = False] Rückgabewert: Boolean
Dieser Befehl nutzt ebenso die Export-Funktion der SAP® GUI. Dabei wird zwar eine XLS-
Datei erzeugt, die aber nicht wirklich das XLS-Format darstellt. Vielmehr handelt es sich
um eine Art CSV-Dateiformat speziell für Excel®. Auch hier wird keine Formatierung oder
ähnliches hinterlegt.
selectKeyFigures Parameter: KeyFigures As String Rückgabewert: Boolean
Hiermit können eine Reihe von Kennzahlen für die Datenanforderung gewählt werden.
Die einzelnen gewünschten Kennzahlen müssen dabei mit einem Komma getrennt
werden.
selectLayout Parameter: Layout As String Rückgabewert: Boolean
Falls vorhanden, wird ein bestimmtes Layout in einer Transaktion gewählt. Kann das
gewünschte Layout nicht gefunden werden, ist der Rückgabewert False.
clickButton Parameter: Button As guiButton Rückgabewert: Boolean
Mit diesem Befehl kann einer der Buttons in der GUI betätigt werden. Dabei sieht die
beliebig erweiterbare zugehörige Enumeration wie folgt aus:
Enum guiButton btnHaken = 0 btnFreigeben = 25 btnSpeichern = 11 End Enum
Abbildung 40: Die Enumeration von guiButton.
64
Die in der Liste enthaltenen Buttons stellen die im Folgenden aufgezeigten Buttons in
der SAP® GUI dar:
Abbildung 41: Schalflächen in der SAP® GUI
selectVariante Parameter: Variante As String Rückgabewert: Boolean
Diese Funktion wählt in einer Transaktions-Eingabemaske eine bestimmte Variante aus.
Kann diese im Katalog gefunden und ausgewählt werden, ist der Rückgabewert True,
andernfalls False.
Abbildung 42: Dialog zur Variantenwahl in der SAP® GUI
changeVerticalSection Parameter: VerticalSection As String Rückgabewert: Boolean
Dieser Befehl ändert den Aufriss in einer Datenansicht. Kann nicht nach der
gewünschten Spalte kategorisiert werden, wird der Wert False zurückgegeben.
65
3.1.2 RFC
Diese Klasse bietet verschiedene Bausteine für die reibungslose Kommunikation per RFC
(Abk. für „Remote Function Call“). Eine Dokumentation dieser alternativen Schnittstelle
ist nicht Teil dieser Arbeit, wohl aber ein wichtiger und umfangreicher Teil des Add-ins
query panel. Genau wie bei der Klasse SAPGUI kann auch hier direkt mit den wichtigsten
öffentlichen Variablen gearbeitet werden:
Öffentliche Variablen
• RfcLogon
• RfcConnection
• RfcFunctions
• RfcDataTable
setRfcConnection Rückgabewert: Boolean
Über einen Auswahlbildschirm kann eine Verbindung mit einem beliebigen SAP® System
aufgebaut werden. Die Daten der angezeigten Systeme werden aus der SAPLOGON.ini
gezogen. Die Objektvariable RfcConnection repräsentiert die gewählte Verbindung nach
erfolgreichem Aufbau.
closeRfcConnection
Eine bereits hergestellte Verbindung kann über diese Methode wieder geschlossen
werden. Auf die Objektvariable RFC.Connection wird anschließend wieder ein
Nullverweis gelegt.
getTable Parameter: TableName As String, Fields As Variant, [Options As String] Rückgabewert: Boolean
Über diese Funktion kann der Inhalt einer beliebigen Tabelle abgerufen und in die
öffentliche Variable RfcDataTable überführt werden. Als Parameter werden der Name
der Tabelle, die benötigten Felder und die Filteroptionen benötigt. Wird nur ein Feld
benötigt, kann der Parameter Fields als einfache Zeichenkette angegeben werden, bei
66
mehreren als String-Array. Die Filteroptionen müssen stets in Form von Open-SQL-
Statements angegeben werden. Diese unterscheiden sich geringfügig von der Syntax des
Standard-SQL. Anbei einige Exempel, wie gültige Statements auszusehen haben:
"WERKS = '0300' OR WERKS = '0021'" "(WERKS = '0300' OR WERKS = '0021') AND PRCTR LIKE 'RBG%'" "SPRAS = 'DE' AND PRCTR LIKE 'RBG%'" "ABWKZ > 0" "(WERKS = '0300' OR WERKS = '0021') AND SALK3 > '0'"
Abbildung 43: Beispiele für gültige Open-SQL-Statements
Insbesondere ist hier auch die richtige Platzierung von Leerzeichen funktionsrelevant.
Jeder Vergleichsoperator muss von genau einer Leerstelle geführt und gefolgt werden.
Schon kleinste Abweichungen vom Open-SQL-Standard verhindern eine erfolgreiche
Datenabfrage.
copyTable Parameter: DestinationTable As String, DeleteOldData As Boolean Rückgabewert: Boolean
Befinden sich Daten in dem Objekt RfcDataTable, so kann mit dieser Funktion deren
Inhalt in eine beliebige Access-Tabelle kopiert werden. Der Parameter DeleteOldData
bestimmt, ob die Zieltabelle vorher geleert wird, oder nicht.
updateTable Parameter: DestinationTable As String, stWHEREname As String, stWHEREcol As Integer, stSETname As String, stSETcol As Integer Rückgabewert: Boolean
Um nur bestimmte Werte in einer Tabelle zu aktualisieren, kann diese Funktion genutzt
werden. Ähnlich wie in dem SQL-Statement UPDATE muss hier eine WHERE-Anweisung
als Parameter angegeben werden, damit die Funktion weiß, welche Werte aktualisiert
werden sollen.
getTableValue Parameter: Row As Long, Col As Integer Rückgabewert: String
Liefert einen bestimmten Wert der Tabelle RfcDataTable als Zeichenkette zurück. Um
eine ordentliche Formatierung zu gewährleisten, wird auf das Ergebnis auch die
Funktion AdjustString aus der Klasse Functionlib angewendet.
67
TableRowCount Rückgabewert: Long
TableRowCount liefert die Anzahl der Datensätze in RfcDataTable zurück.
3.1.3 Report
In dieser Klasse sind alle Bausteine zum Steuern des Report-Fensters enthalten. Neben
dem Hinzufügen und Bestätigen von Einträgen in diesem Fenster ist es auch möglich,
bestimmte Zeilen zu ändern und einen Fortschrittsbalken zu verwenden.
Abbildung 44: Das Report-Fenster von query panel während der Laufzeit
Add Parameter: Value As String
Um einen neuen Eintrag im Report-Fenster hinzuzufügen und gleichzeitig das Fenster
erscheinen zu lassen, kann dieser Befehl verwendet werden.
EditLastEntry Parameter: Value As String
Über diesen Befehl lässt sich der letzte Eintrag durch eine Zeichenkette ersetzen.
68
AddLastEntry Parameter: Value As String
Dem letzten Eintrag kann durch diesen Befehl eine beliebige Zeichenkette angefügt
werden.
Confirm Parameter: Value As Boolean
Diese Methode bestätigt den letzten Eintrag wahlweise positiv (Daumen hoch) oder
negativ (Daumen runter).
setPercent Parameter: Percent As Double
Per setPercent kann der Fortschrittsbalken des Report-Fensters aktiviert und gesetzt
werden. Als Parameter ist ein Prozentwert zwischen 0 und 1 valide.
Clear
Dieser Befehl löscht alle Einträge aus dem Report-Fenster.
Hide [Parameter: Delay As Integer = 2]
Mit Hide kann das Report-Fenster geschlossen werden. Optional kann eine Verzögerung
in Sekunden angegeben werden. Wird kein Parameter mitgegeben, wird zwei Sekunden
gewartet, bevor das Fenster geschlossen wird. Um das Fenster sofort zu schließen, muss
der Parameter 0 gesetzt werden. Oft empfiehlt es sich aber dem Anwender einen kurzen
Moment zu geben, um ihm die letzten Geschehnisse aus dem Report-Fenster erkennen
zu lassen.
69
3.1.4 TimeAndDate
Bei vielen Automatisierungen spielen Termine eine wichtige Rolle. Diese Klasse
unterstützt den Anwender hierbei mit allem, was nötig ist, um mit Zeit und Datum
korrekt zu rechnen. Insbesondere wird der bereits vorhandene Funktionsumfang in
Bezug auf die Berücksichtigung von Feier- und Werktagen erweitert.
Wait Parameter: [Sec As Double = 1]
Per Wait kann der Programmablauf für eine bestimmte Zeit angehalten werden. Sofern
kein Parameter explizit angegeben wurde, beträgt die Standardzeit eine Sekunde. Die
Wartezeit kann als Gleitkommazahl angegeben werden; damit sind exakte Wartezeiten
im Tausendstelsekunden-Bereich möglich.
isFeiertag Parameter: Datum As Date Rückgabewert: Boolean
Diese Funktion prüft, ob ein bestimmtes Datum auf einen Feiertag fällt. Dabei werden
neben den datumsfixen Feiertagen auch alle variablen Festtage, wie beispielsweise
Ostern, korrekt berechnet.
getFeiertag Parameter: Datum As Date Rückgabewert: String
Diese Funktion arbeitet ähnlich wie isFeiertag, jedoch entspricht hier der Rückgabewert
der exakten Bezeichnung des jeweiligen Feiertags. Handelt es sich um keinen Feiertag,
wird ein Leerstring zurückgegeben.
In der Funktion sind alle möglichen deutschen Feiertage hinterlegt. Je nach Bundesland,
für das man die Feiertage prüfen möchte, müssen die entsprechenden Tage im
Programmcode angepasst werden.
70
isWorkday Parameter: Datum As Date, [SaturdayIsWorkday As Boolean = False] Rückgabewert: Boolean
isWorkday prüft, ob ein bestimmtes Datum ein Werktag ist. Über den Parameter
SaturdayIsWorkday kann angegeben werden, ob auch Samstage als Werktage gezählt
werden sollen oder nicht. Als Standard ist hier False festgelegt worden. Dieser
Parameter ist auch in allen folgenden Funktionen, die mit Werktagen rechnen,
einstellbar.
Diese Funktion berücksichtigt natürlich auch die geltenden Feiertage der Funktion
getFeiertag.
addWorkdays Parameter: Datum As Date, RW As Integer, [SaturdayIsWorkday As Boolean = False] Rückgabewert: Date
Um eine beliebige Anzahl von Werktagen zu einem Datum zu addieren oder von diesem
zusubtrahieren, kann diese Funktion verwendet werden. Ist der Parameter RW positiv,
so werden Tage hinzugezählt, ist er negativ, werden sie abgezogen.
lastWorkday Parameter: [SaturdayIsWorkday As Boolean = False] Rückgabewert: Date
Mit lastWorkday kann das Datum des letzten Werktages vor heute ermittelt werden.
countWorkdays Parameter: Von As Date, Bis As Date, [SaturdayIsWorkday As Boolean = False] Rückgabewert: Integer
Diese Funktion zählt die Arbeitstage zwischen zwei Daten und gibt die Differenz als
Ergebnis zurück.
getDate Parameter: [Msg As String], [Default As Date], [AskIfPast As Boolean = False] Rückgabewert: Date
Der Funktionsaufruf startet ein Eingabefenster, in dem ein Datum eingegeben werden
kann. Diese Zeichenkette wird anschließend auf korrekte Formatierung geprüft und
anschließend als Date zurückgegeben. Der Parameter AskIfPast kann dazu verwendet
71
werden, eine Rückfrage anzuzeigen, ob das Datum wirklich verwendet werden soll,
sofern es in der Vergangenheit liegt.
KWDIN Parameter: Datum As Date Rückgabewert: Integer
Da die Excel-Funktion Application.WorksheetFunction.WeekNum die Kalenderwochen
teilweise nicht DIN-genau berechnet, wurde diese Funktion in die Klasse TimeAndDate
mit aufgenommen. Sie errechnet die Kalenderwochen exakt nach vorgeschriebener
DIN-Norm.
DateInKW Parameter: Jahr As Integer, KW As Integer, WT As VbDayOfWeek Rückgabewert: Date
Diese Funktion gibt das Datum eines bestimmten Wochentags in einer Kalenderwoche
zurück. Als Parameter muss das Jahr, die Kalenderwoche und der gewünschte Tag als
VbDayOfWeek (vbMonday, vbThuesday, …) angegeben werden.
FormatDateSQL Parameter: D As Date Rückgabewert: String
Um in Access nach einen Datum filtern zu können, muss mit der entsprechenden SQL-
Schreibweise gearbeitet werden. Bei diesem Sonderformat wird das Datum mit voran-
und nachgestellten Rauten dargestellt; außerdem werden Tag, Monat und Jahr durch
Schrägstriche getrennt: #24/12/2014#. Die Funktion formatiert ein beliebiges Datum
entsprechend diesen Bedingungen und gibt es als Zeichenkette zurück.
72
3.1.5 FilesAndFolders
Diese Klasse bietet eine Auswahl an Methoden und Funktionen, die nötig sind, um
schnell und einfach mit lokalen Ordnern und Dateien zu arbeiten. Eine ganze Reihe an
Prüffunktionen verhindert mögliche Fehler beim Schreiben von Dateien in
automatisierten Vorgängen.
Download Parameter: URL As String, saveAs As String Rückgabewert: Boolean
Um aus dem Inter- oder Intranet eine beliebige Datei herunterzuladen und zu speichern,
kann diese Funktion verwendet werden. Ihr Rückgabewert gibt Auskunft über den Erfolg
des Vorgangs.
isDir Parameter: Dir As String Rückgabewert: Boolean
Um zu prüfen, ob ein bestimmtes Verzeichnis wirklich existiert, kann isDir genutzt
werden.
validDir Parameter: Dir As String Rückgabewert: Boolean
Mit dieser Funktion können sowohl die Existenz, als auch die Schreibrechte in einem
bestimmten Verzeichnis geprüft werden. Das Ergebnis wird als Wahrheitswert
zurückgegeben.
makeDir Parameter: Str As String Rückgabewert: Boolean
makeDir erstellt ein Verzeichnis und gibt bei Erfolg den Wert True zurück.
73
saveAsName Parameter: [Str As String]
Mittels eines Speichern-Unter-Dialogs wird angeboten, die Arbeitsmappe zu speichern.
Optional kann ein Namensvorschlag als Parameter mit angegeben werden.
getFolder Parameter: [Msg As String] Rückgabewert: String
Diese Funktion startet einen Dialog zur Auswahl eines Ordners und gibt dessen Pfad als
Zeichenkette zurück. Optional kann eine Nachricht an den Anwender hinzugefügt
werden.
getValidFolder As String
Diese Funktion arbeitet ähnlich wie getFolder, mit dem Unterschied, dass in dem
ausgewählten Ordner Schreibrechte vorhanden sein müssen, um einen Rückgabewert
zu erhalten.
getFile Parameter: [Title As String] Rückgabewert: String
Über einen Auswahldialog kann der Anwender eine beliebige Datei wählen. Der Pfad
mitsamt Dateiname wird anschließend als Zeichenkette zurückgegeben. Optional kann
dem Dialog ein Titel gegeben werden.
checkFile Parameter: FName As String Rückgabewert: Boolean
Mit dieser Funktion kann geprüft werden, ob eine bestimmte Datei vor maximal fünf
Sekunden aktualisiert bzw. erstellt worden ist. Nur so kann beispielsweise der Erfolg
eines SAP®-Exports überprüft werden, da per Scripting hier kein Fehler abgefangen
werden kann.
74
3.1.6 Functionlib
Diese Klasse enthält all jene Funktionen, die in keiner anderen Kategorie zugeordnet
werden konnte. Teilweise werden diese Funktionen von den weiteren Klassen
mitbenutzt.
WinUser Rückgabewert: String
In vielen Fällen ist nötig, zu prüfen, wer ein Script gerade ausführt. Diese Funktion gibt
hierfür den aktuell angemeldeten Windows®-Benutzer als Zeichenkette zurück.
DesktopDir Rückgabewert: String
Um beispielsweise schnell Daten auf dem Desktop speichern zu können, wird mit
DesktopDir dieser Pfad ermittelt.
RandomInteger Parameter: min As Integer, max As Integer Rückgabewert: Integer
Mit dieser Funktion kann eine Zufallszahl zwischen zwei beliebigen Grenzen erstellt
werden.
inArray Parameter: searchString As String, searchArray As Variant Rückgabewert: Boolean
Da es oft mühselig ist, herauszufinden, ob sich ein bestimmter Wert in einem Array
befindet, wurde diese Funktion modelliert.
AdjustString Parameter: ByVal Value As String Rückgabewert: String
Wendet die beschriebenen Funktionen DeleteSpacesLeftAndRight und
DeleteLeadingZeros auf eine beliebige Zeichenkette an, sofern es sich dabei nicht um ein
Datum oder eine Zeichenkette handelt.
75
DeleteSpacesLeftAndRight Parameter: ByVal Value As String Rückgabewert: String
Befinden sich führende oder nachfolgende Leerzeichen in einer Zeichenkette, werden
diese von der Funktion gelöscht.
DeleteLeadingZeros Parameter: ByVal Value As String Rückgabewert: String
Bei Zeichenketten in SAP®, die eigentlich eine Zahl darstellen, werden in vielen Fällen
führende Nullen zum Auffüllen der Zeilen integriert. Diese Funktion löscht diese Nullen
und gibt auch hier den bereinigten Wert zurück.
3.1.7 Excel
Hier ist eine Sammlung an Funktionen zum Umgang mit Excel® Arbeitsmappen, Tabellen
und Zellen enthalten. Folglich befindet sich diese Bibliothek nur in der Excel®-Version
von query panel.
Öffentliche Variablen
Für den Funktionsumfang von OpenSheetLink werden zwei öffentliche Variablen
bereitgestellt; sie dienen für Verweise auf externe Arbeitsmappen und Tabellen:
• wbExt
• sheetExt
OpenSheetLink Parameter: File As String Rückgabewert: Boolean
Diese Funktion erstellt eine Verbindung zu einer beliebigen Excel®-Datei. Hierzu wird die
Arbeitsmappe geöffnet und es werden zwei öffentliche Variablen initialisiert: wbExt
verweist dabei auf die verlinkte Arbeitsmappe, sheetExt auf die erste Tabelle der
Arbeitsmappe. Der Rückgabewert gibt Auskunft über den erfolgreichen
Verbindungsaufbau.
76
CloseSheetLink Rückgabewert: Boolean
Eine zuvor geschlossene Verbindung mit einer Arbeitsmappe kann mit dieser Methode
wieder getrennt werden. Beiden öffentlichen Variablen wbExt und sheetExt sind
anschließend wieder freigegeben.
CopySheetContent Parameter: ByVal movedSheet As Worksheet, ByVal moveAfter As Worksheet, [NewSheetName As String] Rückgabewert: Boolean
Aus einer verlinkten Tabelle kann mittels dieser Funktion in die Script-Mappe kopiert
werden. Optional kann im Parameter NewSheetName ein neuer Tabellenname
bestimmt werden.
OpenSheetLinkWithSearch Parameter: [WorkbookName As String], [SheetName As Variant = 1], [SearchInStr As Boolean = True] Rückgabewert: Boolean
Diese Funktion baut ebenso wie OpenSheetLink eine Verbindung zu einer anderen
Excel®-Tabelle auf. Die Erweiterung besteht daran, dass die Tabelle, auf die die Variable
sheetExt verweist, nicht die erste sein muss. Im Parameter SheetName kann ein
entsprechender Suchstring, also der Name der zu verlinkenden Tabelle, angegeben
werden. Wird dieser in der Arbeitsmappe gefunden, wird der Verweis von sheetExt nicht
auf die erste Tabelle, sondern auf das Suchergebnis gelegt.
lastRow Parameter: ByVal Sheet As Worksheet, ByVal Spalte As Long Rückgabewert: Long
Mit lastRow lässt sich die die Nummer der zuletzt beschriebenen Reihe in einer
bestimmten Spalte der Tabelle ermitteln.
lastCol Parameter: ByVal Sheet As Worksheet, ByVal Zeile As Long Rückgabewert: Long
lastCol ist das Pendant zur vorangegangenen Funktion lastRow und gibt die Nummer der
zuletzt beschriebenen Spalte in einer bestimmten Reihe einer Tabelle zurück.
77
getSpeed Parameter: [Value As Boolean = True]
getSpeed deaktiviert alle Funktionen in Excel®, die bei komplexen und umfangreichen
Berechnungen stören: die automatische Zellenberechnung, alle Events und die
Aktualisierung des Bildschirms. Damit wird eine bessere Performance bei
umfangreichen Berechnungen erreicht.
Nach der Nutzung muss der Wert unbedingt wieder auf False gesetzt werden, um die
ordnungsgemäße Funktion von Excel® zu gewährleisten.
searchCol Parameter: ByVal Sheet As Worksheet, Str As String Rückgabewert: Long
Diese Funktion nutzt die Excel®-Suchfunktion in einer bestimmten Tabelle und gibt bei
Erfolg die Spalte der ersten Ergebniszelle zurück.
searchRow Parameter: ByVal Sheet As Worksheet, Str As String Rückgabewert: Long
Analog zu searchCol gibt diese Funktion die Reihe der ersten gefundenen Zelle zurück.
WorksheetExists Parameter: WorksheetName As String Rückgabewert: Boolean
Diese Funktion prüft, ob in der aktuellen Arbeitsmappe ein bestimmtes Worksheet
wirklich existiert und gibt das Ergebnis als Wahrheitswert zurück.
DeleteSheet Parameter: WorksheetName As String
Löscht eine Tabelle in der Arbeitsmappe ohne die übliche Rückfrage von Excel®. Existiert
das zu löschende Tabellenblatt nicht, wird keine Fehlermeldung angezeigt. Der
Programmablauf kann ungehindert fortgesetzt werden.
78
convertToDate Parameter: Rng As Range
Dieser Methodenaufruf konvertiert den Inhalt eines bestimmten Bereichs (Range) als
Datum.
convertToText Parameter: Rng As Range
Ähnlich der vorherigen Methode konvertiert diese den Inhalt einer bestimmten Range
als reinen Text.
resizeExcel Parameter: [WindowState As Integer], [Top As Long], [Left As Long], [Height As Long], [Width As Long]
Diese Funktion ändert die Größe der Excel®-Anwendung. Der Parameter WindowState
kann als xlNormal, xlMaximized und xlMinimized festgelegt werden.
79
3.2 Substitution von aufgenommenen Script-Befehlen durch Add-in-Funktionen
Hinter den Methoden und Funktionen des vorherigen Abschnitts verbergen sich teils
sehr umfangreiche Funktionen. Ebenfalls hat jede dieser Funktionen ein ausgereiftes
Exception-Handling implementiert, das verhindert, dass bei auftretenden Fehlern eine
Unterbrechung oder gar ein Absturz erfolgt.
Anhand zweier Beispiele wird verdeutlicht, wie einfach und übersichtlich ein mit query
panel erstelltes Script im Vergleich zu einem herkömmlich aufgenommenen aussehen
kann.
Starten einer Transaktion in der SAP® GUI
Ruft man eine beliebige Transaktion aus der SAP® GUI auf und hat dabei den Script-
Rekorder im Aufnahmemodus, erhält man beispielsweise die folgenden Codezeilen:
session.findById("wnd[0]/tbar[0]/okcd").text = "MD04" session.findById("wnd[0]").sendVKey 0
Abbildung 45: Aufgenommener Scirptcode beim Aufruf der Transaktion MD04
Im Grunde könnte man diese beiden Zeilen dazu nutzen, eine Transaktion in einem
Script aufzurufen um in dieser dann weitere Schritt durchzuführen. Doch welche
Probleme können hierbei entstehen? Unter welchen Umständen könnten diese Zeilen
nicht die gewünschte Transaktion starten?
1. Ist das angesteuerte GUI-Fenster noch in einer anderen Transaktion, so kann
über das Eingabefeld der GUI keine Transaktion neu aufgerufen werden. Man
müsste zunächst mit dem Abbrechen-Button ins Hauptmenü zurückkehren.
2. Hat der Benutzer keine Berechtigung für die aufzurufende Transaktion, erscheint
in der Statusbar eine entsprechende Meldung.
80
In beiden Fällen ist alles, was nach den Zeilen aus Abbildung 45 passiert, hinfällig und
führt zu einer Reihe an Fehlern. Die GUI befindet sich nicht in der gewünschten
Transaktion.
Eine Lösung bietet die Funktion StartTransaction des Add-in query panel. Dank dessen
Rückgabewert erhält der Entwickler Aufschluss über den Erfolg bzw. Misserfolg des
Transaktionsaufrufs. Ein Script, das sich an den Funktionen von query panel bedient,
könnte beispielsweise so aussehen:
If qp.SAPGUI.StartTransaction("MD04") Then 'Weitere Anweisungen 'in der Transaktion MD04. Else 'Dieser Code wird ausgeführt, 'wenn die Transaktion nicht 'gestartet werden konnte. End If
Abbildung 46: Scriptcode zum Aufruf der Transaktion MD04 mit Erfolgsprüfung
Mittels einer Wenn-Dann-Sonst-Schleife wird geprüft, ob der Rückgabewert True oder
False ist. Entsprechend dem Ergebnis wird dann in die Abfrage verzweigt und der
passende Code ausgeführt. So kann vermieden werden, dass im Falle eines nicht
erfolgreichen Transaktionsstarts keine weiteren Befehle in der SAP® GUI ausgeführt
werden.
Eine Variante für eine Eingabemaske auswählen
In beinahe allen Eingabemasken von Transaktionen lassen sich sogenannte Varianten
erstellen und aufrufen. In Ihnen werden eingegebene Werte und Ansichten gesichert.
Um eine solche Variante per Scripting aufzurufen, würde man sich zunächst am
Scripting-Recorder bedienen und die entsprechenden Schritte aufnehmen. Das Ergebnis
könnte beispielsweise wie folgt aussehen:
81
Der weitere Teil des Kapitels gehört nicht zur Leseprobe.
4 Résumé
Die vorhergehenden Kapitel hat dargelegt, wie man Schritt um Schritt bei der
Automatisierung eines Arbeitsvorgangs vorgeht. Um nun das vermittelte Wissen
effizient umsetzen zu können, wird noch vor allem eines benötigt: Übung. Es ist
unerlässlich, nach dem Prinzip „learning by doing“ mit zunächst einfachen Prozessen zu
beginnen um sich dann an komplexere Vorgänge zu wagen.
Nachfolgend vermittelt der Autor einige private Tipps aus der eigenen Praxis, um dem
Leser die dargelegten Fehler zu ersparen. Ebenfalls wird Stellung zu
sicherheitsbezogenen Fragen zum Thema SAP® GUI Scripting genommen. Im letzten
Punkt gibt es einen Überblick von themenbezogenen Netzwerken, auf denen man Hilfe
und Tipps finden kann.
4.1 Tipps aus der Praxis
Code stets ausführlich kommentieren! – Gerade im Scriptingbereich verwende ich
regelmäßig Teile aus Programmabschnitten, die bereits lange zuvor von mir entwickelt
wurden. Um sich auch nach dieser Zeit noch gut im eigenen Quellcode zurecht zu finden,
ist die konsequente Anwendung von Kommentaren im Programmcode sinnvoll. Sie
helfen, sich schnell wieder an teilweise lang vergangene Gedankenschritte zu erinnern
und sparen damit wertvolle Zeit bei Anpassungen oder der Fehlersuche.
Verantwortungsbewusst arbeiten! – Jeder Mensch macht Fehler. Ein Fehler in einem
automatisierten Ablauf bedeutet einen Fehler in jedem seiner Durchgänge. Daher ist es
nach der Implementierung unerlässlich, das Script zunächst ausgiebig in Testsystemen
zu beobachten, bevor man es in einem Produktivsystem einführt. Ein Programmierstil
nach dem „Try & Error“-Prinzip ist hier nur in einer Testumgebung zu empfehlen.
Klein anfangen – Bevor man sich an umfassende Datenverarbeitung in einem
Produktivsystem wagt, sollte man mit einfachen Prozessen beginnen.
90
Weiter denken – Wenn man eine neue Anwendung entwirft, sollte unbedingt
durchdacht werden, ob es noch weitere Gebiete gibt, in denen diese Verwendung finden
kann. Gibt es ähnliche Prozesse, in denen Arbeitsabläufe dieser Art stattfinden? Wie ist
die Anwendung zu gestalten, um mehr Möglichkeiten zu haben? Wo lohnt es sich
langfristig, den Programmablauf variabel zu gestalten?
4.2 Sicherheitsbezogene Fragen & Antworten
Kann ein Script ein SAP® System beschädigen?
Nein. Alle Änderungen, die durch ein Script durchgeführt werden, unterliegen
denselben Zugangsrichtlinien wie die des damit angemeldeten Benutzers.
Kann ein laufendes Script die Systemperformance beeinflussen?
Ja. Ein Script arbeitet immer mit der vollen Systemleistung. Daher ist während
dessen Ausführung in erster Linie der Compiler (meist Excel® oder Access®) voll
ausgelastet. Ein Zugriff auf dieses Programm wird während der Ausführung, wenn
überhaupt, nur sehr eingeschränkt möglich sein.
Kann ein Script auf Daten zugreifen, für das der Benutzer eigentlich keine Berechtigung
besitzt?
Nein. Ein Script unterliegt denselben Zugangsrichtlinien, wie die des angemeldeten
Benutzers.
Kann ein Script Daten auslesen, die man als Anwender nicht exportieren könnte?
Ja. Auch wenn der Export von bestimmten Daten in SAP® nicht erlaubt ist, ist es
möglich, diese aus der SAP® GUI auszulesen und zu speichern. Jedoch könnte ein
Anwender auch ohne Script einfach solche Daten speichern, beispielsweise über
einen einfachen Screenshot. Grundsätzlich gilt aber: Per SAP® GUI Scripting kann
91
nur auf Daten zugegriffen werden, die am Bildschirm sichtbar gemacht werden
können.
Kann ein Script Interaktionen eines Benutzers mit der SAP® GUI aufzeichnen?
Ja. Jedoch wird der Benutzer hierüber benachrichtigt, es sei denn, die Funktion
wurde in den Systemeinstellungen deaktiviert (siehe hierzu Abschnitt 2.1.1
Aktivieren der Scripting-Schnittstelle in der SAP® GUI).
Kann ein Script die Eingabe von Passwörtern in der SAP® GUI ausspähen?
Nein. Alle Passworteingaben können von Script-Rekordern nicht erfasst werden.
Kann ein Script im Hintergrund ausgeführt werden, ohne dass der Benutzer es
mitbekommt?
Nein. Sobald ein Script ausgeführt wird, erhält der Benutzer hierüber eine
Nachricht, sofern diese Funktion nicht deaktiviert wurde (siehe hierzu 2.1.2
IntelliSense® mit den SAP® GUI Objekten in VBA® nutzen). Davon abgesehen
benötigt ein Script immer eine (sichtbare) SAP® GUI. Eine „heimliche“ Steuerung
der SAP® GUI im Hintergrund ist daher nicht möglich.
92
4.3 Themenbezogene Netzwerke und Verweise
Wie bereits im Vorwort angemerkt, gab es vor dieser Arbeit zum Thema SAP® GUI
Scripting keine Literatur. Online existieren jedoch zwei interessante Communities, die
sich unter anderem auch mit SAP® GUI Scripting auseinandersetzen.
Das «SAP® Community Network»
Das SCN ist die offizielle Community der SAP® AG. Anwender, Entwickler,
Vertriebsmitarbeiter und Studenten nutzen das Netzwerk, um Hilfe zu erhalten, Ideen
zu teilen und sich auszutauschen. Mit dem Stand vom April 2012 gibt es 2,5 Millionen
Benutzer, die täglich etwa 3.000 Einträge erstellen (vgl. [Shau12]).
Die über 430 Foren in englischer Sprache bieten zu jedem Thema des Softwareangebots
von SAP® einen Platz zum Austauschen. Darunter natürlich auch zum Thema GUI
Scripting:
http://scn.sap.com/community/scripting-languages
Der «Tricktresor»
Der Tricktresor ist eine Sammlung aus nützlichen Tipps rund um das ERP-System der
SAP® AG. Die Datenbank ist hauptsächlich für kleinere Tricks aus dem Gebiet der
Programmierung aber auch anwendungsübergreifende Themen gedacht.
Ein Teil des Themengebiets „Programmierung“ bezieht sich dabei auch auf GUI Scripting.
Besonders im Forum auf der Social-Network-Plattform Xing erhält man viele
deutschsprachige Informationen über dieses Thema:
https://www.xing.com/net/prid95eebx/tricktresor/forums
93
Anhang
GuiMessageBoxOption Enumeration
Enumeration Wert Beschreibung
MSG_OPTION_OK 0 Die Message-Box wird nur mit einem Ok-Button angezeigt.
MSG_OPTION_YESNO 1 Der Dialog kann mit Ja oder Nein beantwortet werden.
MSG_OPTION_OKCANCEL 2 Es erscheint ein Ok- und Abbrechen-Button.
Tabelle 22: Die GuiMessageBoxOption Enumeration
GuiMessageBoxType Enumeration
Enumeration Wert Icon
MSG_TYPE_INFORMATION 0
MSG_TYPE_QUESTION 1
MSG_TYPE_WARNING 2
MSG_TYPE_ERROR 3
MSG_TYPE_PLAIN 4 Kein Symbol.
Tabelle 23: Die GuiMessageBoxType Enumeration
GuiMessageBoxResult Enumeration
Enumeration Wert Beschreibung
MSG_RESULT_CANCEL 0 Rückgabewert beim Klicken des Abbrechen-Buttons.
MSG_RESULT_OK 1 Rückgabewert beim Klicken des Ok-Buttons.
MSG_RESULT_YES 2 Rückgabewert beim Klicken des Ja-Buttons.
MSG_RESULT_NO 3 Rückgabewert beim Klicken des Nein-Buttons. Tabelle 24: Die GuiMessageBoxResult Enumeration
V
Der weitere Teil des Kapitels gehört nicht zur Leseprobe.
Abbildungsverzeichnis
Abbildung 1: Der Visual Basic® Editor (IDE) ............................................................................... 4
Abbildung 2: Hierarchische Darstellung der GUI-Objekte und deren Kinds-Objekte ................ 7
Abbildung 3: Die Kinds-Objekte des GuiMainWindow .............................................................. 7
Abbildung 4: Die Aufteilung der SAP® GUI Oberfläche .............................................................. 8
Abbildung 5: Die SAP® GUI in klassischer Ansicht ...................................................................... 8
Abbildung 6: Erstellen einer neuen Instanz in der SAP® GUI ................................................... 12
Abbildung 7: Die Kommandozeile der SAP® GUI ..................................................................... 12
Abbildung 8: Scripting-Optionen der SAP® GUI ....................................................................... 23
Abbildung 9: Intellisense-Funktion während der Eingabe von Programmcode ...................... 24
Abbildung 10: Der Weg zu den Verweisen im VBA®-Editor ..................................................... 25
Abbildung 11: Der Verweise-Manager in VBA® ....................................................................... 25
Abbildung 12: Der Verweise-Manager in VBA® mit aktivierter SAP® GUI Scripting API .......... 26
Abbildung 13: Programmcode zum Erstellen einer neuen Verbindung zu einem SAP® System
.......................................................................................................................................... 28
Abbildung 14: Programmcode zum Listen aller SAP® GUI Sessions ........................................ 30
Abbildung 15: Ergebnistabelle mit Auflistung verschiedener GUI Sessions und deren
Eigenschaften ................................................................................................................... 30
Abbildung 16: Programmcode zur Identifzierung und Verbindung zu einem SAP® System ... 31
Abbildung 17: Der SAP® Script-Rekorder mit erweiterten Einstellungsmöglichkeiten ........... 32
Abbildung 18: Die Analyzer-Funktion des Scripting Trackers .................................................. 33
Abbildung 19: Die Recorder-Funktion des Scripting-Trackers ................................................. 34
Abbildung 20: Scripting Tracker im Identifikations-Modus während der Identifizierung von
Objekten der SAP® GUI .................................................................................................... 37
Abbildung 21: Der SAP® Script-Rekorder ................................................................................. 37
Abbildung 22: Abschnitte im Quellcode eines aufgenommenen Scripts durch den SAP®
Script-Rekorder ................................................................................................................ 38
Abbildung 23: Das Auswahlfenster der Export-Funktion der SAP® GUI .................................. 39
Abbildung 24: SE16-Standardliste ............................................................................................ 40
Abbildung 25: ALV-Grid-Darstellung ........................................................................................ 40
XV
Abbildung 26: Die Benutzereinstellungen der SAP® GUI ......................................................... 41
Abbildung 27: Deklaration und Initialisierung eines GuiGridView-Objekts ............................. 41
Abbildung 28: Programmcode, um Dateninhalt aus einem GuiGridView in eine CSV-Datei zu
übertragen ........................................................................................................................ 43
Abbildung 29: Die Transaktion MD04 mit einem GuiTableControl (roter Rahmen) ................ 44
Abbildung 30: Programmcode, um Dateninhalt aus einem GuiTableControl in eine CSV-Datei
zu übertragen ................................................................................................................... 46
Abbildung 31: UML Aktivitätsdiagramm einer Funktion zur Formatierung von Zeichenketten
der SAP® GUI .................................................................................................................... 47
Abbildung 32: Programmcode zum Formatieren von Zeichenketten der SAP® GUI ............... 48
Abbildung 33: Beispiel zur Verwendung eines Haltepunkts .................................................... 53
Abbildung 34: Hinzufügen einer Variablen-Überwachung ...................................................... 54
Abbildung 35: Das Überwachungsausdrücke-Fenster während der Kompilierung ................. 54
Abbildung 36: Funktion zur Prüfung auf ein existierendes GuiModalWindow ....................... 55
Abbildung 37: Hierarchischer Aufbau des Add-ins .................................................................. 57
Abbildung 38: Report-Fenster des Add-ins während der Laufzeit ........................................... 58
Abbildung 39: Die Enumeration von guiKey. ........................................................................... 62
Abbildung 40: Die Enumeration von guiButton. ...................................................................... 64
Abbildung 41: Schalflächen in der SAP® GUI............................................................................ 65
Abbildung 42: Dialog zur Variantenwahl in der SAP® GUI ....................................................... 65
Abbildung 43: Beispiele für gültige Open-SQL-Statements ..................................................... 67
Abbildung 44: Das Report-Fenster von query panel während der Laufzeit ............................ 68
Abbildung 45: Aufgenommener Scirptcode beim Aufruf der Transaktion MD04 ................... 80
Abbildung 46: Scriptcode zum Aufruf der Transaktion MD04 mit Erfolgsprüfung .................. 81
Abbildung 47: Aufgenommener Scriptcode zur Auswahl einer bestimmten Variante ........... 82
Abbildung 48: Variantenauswahldialog eine Transaktion ....................................................... 82
Abbildung 49: Variantenkatalog der Transaktion /SIE/AD_ZPR_P_BW_930_GRID ................ 83
Abbildung 50: Scriptcode zur Auswahl einer Variante mit Erfolgsprüfung ............................. 83
Abbildung 51: Script zur Aktualisierung eines Eckstart- und Eckendtermins .......................... 86
Abbildung 52: Bereinigtes Script zur Anpassung eines Eckstart- und Eckendtermins............. 87
Abbildung 53: Substituiertes Script zur Anpassung eines Eckstart- und Eckendtermins ........ 87
Abbildung 54: Schleife zur Aktualisierung von mehreren Eckstart- und Eckendterminen ...... 88
XVI
Abbildung 55: Anwendung zur Aktualisierung von Eckstart- und Eckendterminen während
der Laufzeit ....................................................................................................................... 89
Abbildung 56: Klassenentwurf einer Stoppuhr mit millisekundengenauer Messung ............... X
Abbildung 57: Script zur zuverlässigen Aktualisierung von Eckstart- und Eckendterminen mit
Berücksichtigung aller Unregelmäßigkeiten. ................................................................... XII
XVII
Tabellenverzeichnis
Tabelle 1: Die wichtigsten Methoden der GuiApplication ......................................................... 9
Tabelle 2: Die wichtigsten Eigenschaften der GuiApplication ................................................. 10
Tabelle 3: Die wichtigsten Events der GuiApplication ............................................................. 10
Tabelle 4: Die wichtigsten Methoden der GuiConnection ....................................................... 11
Tabelle 5: Die wichtigsten Eigenschaften der GuiConnection.................................................. 11
Tabelle 6: Die wichtigsten Methoden der GuiSession ............................................................. 12
Tabelle 7: Die wichtigsten Eigenschaften der GuiSession ........................................................ 13
Tabelle 8: Die wichtigsten Events der GuiSession .................................................................... 13
Tabelle 9: Die wichtigsten Eigenschaften der GuiSessionInfo.................................................. 14
Tabelle 10: Die wichtigsten Methoden des GuiMainWindow und des GuiModalWindow ..... 16
Tabelle 11: Die wichtigsten Eigenschaften des GuiMainWindow und des GuiModalWindow 16
Tabelle 12: Die wichtigsten Methoden des GuiButton ............................................................ 16
Tabelle 13: Die wichtigsten Eigenschaften des GuiButton....................................................... 17
Tabelle 14: Die wichtigsten Eigenschaften der GuiComponent ............................................... 17
Tabelle 15: Die wichtigsten Methoden der GuiComponentCollection ..................................... 18
Tabelle 16: Die wichtigsten Eigenschaften der GuiComponentCollection ............................... 18
Tabelle 17: Die wichtigsten Methoden des GuiGridView ........................................................ 20
Tabelle 18: Die wichtigsten Eigenschaften des GuiGridView ................................................... 20
Tabelle 19: Die wichtigsten Methoden des GuiTableControls ................................................. 21
Tabelle 20: Die wichtigsten Eigenschaften des GuiTableControls ........................................... 22
Tabelle 21: Ergebnisse der Zeitmessung während des Datenexports aus einem ALV Grid View
.......................................................................................................................................... 49
Tabelle 22: Die GuiMessageBoxOption Enumeration ................................................................ V
Tabelle 23: Die GuiMessageBoxType Enumeration ................................................................... V
Tabelle 24: Die GuiMessageBoxResult Enumeration ................................................................. V
Tabelle 25: Die GuiErrorType Enumeration............................................................................... VI
Tabelle 26: Die GuiErrorType Enumeration (Fortsetzung von Tabelle 25) .............................. VII
Tabelle 27: Die GuiEventType Enumeration ............................................................................ VIII
Tabelle 28: Die GuiComponentType Enumeration .................................................................... IX
XVIII
Über den Autor
Maximilian Queck hat an der Ostbayerischen Technischen
Hochschule Regensburg an der Fakultät für Informatik und
Mathematik das Fach Wirtschaftsinformatik studiert. Im
Anschluss absolvierte er im Zuge dieser Arbeit den
Masterstudiengang Logistik.
Den Praxisbezug erhält er als Entwickler bei der Siemens AG am
Standort Regensburg.
XIX
Urheberrechtshinweis
Alle Inhalte dieser Arbeit, insbesondere Texte, Fotografien und Grafiken, sind urheberrechtlich
geschützt. Das Urheberrecht liegt, soweit nicht ausdrücklich anders gekennzeichnet, bei dem
Autor Maximilian Queck.
Bitte kontaktieren Sie den Autor per E-Mail ([email protected]), falls Sie Inhalte
dieser Arbeit verwenden möchten.
Wer gegen das Urheberrecht verstößt, macht sich gem. § 106 ff. Urhebergesetz strafbar.
Inhaltskopien können durch Suchmaschinen ohne großen Aufwand gefunden und
nachverfolgt werden.
XXII