Kitabı oku: «Schnelleinstieg in SAP ABAP Objects»
Rüdiger Deppe
Schnelleinstieg in SAP® ABAP Objects
2., erweiterte Auflage
ISBN: | 978-3-96012-311-8 (ePUB) |
Lektorat: | Anja Achilles |
Korrektorat: | Christine Weber |
Coverdesign: | Philip Esch, Martin Munzel |
Coverfoto: | fotolia #51365859 | Urheber: miloje |
Satz & Layout : | Johann-Christian Hanke |
Alle Rechte vorbehalten
2. Aufl. 2017, Gleichen
© Espresso Tutorials GmbH
URL: www.espresso-tutorials.com
Das vorliegende Werk ist in allen seinen Teilen urheberrechtlich geschützt. Alle Rechte vorbehalten, insbesondere das Recht der Übersetzung, des Vortrags, der Reproduktion und der Vervielfältigung. Espresso Tutorials GmbH, Zum Gelenberg 11, 37130 Gleichen, Deutschland.
Ungeachtet der Sorgfalt, die auf die Erstellung von Text und Abbildungen verwendet wurde, können weder der Verlag noch Autoren oder Herausgeber für mögliche Fehler und deren Folgen eine juristische Verantwortung oder Haftung übernehmen.
Feedback: Wir freuen uns über Fragen und Anmerkungen jeglicher Art. Bitte senden Sie diese an: info@espresso-tutorials.com.
Inhaltsverzeichnis
Cover
Titelseite
Copyright / Impressum
Vorwort
1 ABAP Objects versus prozedurales ABAP
1.1 Begriffsbestimmung
1.2 Warum ABAP Objects?
1.3 Gedankenmodelle und Herangehensweisen beider Varianten
2 Klassen und Objekte in ABAP Objects
2.1 Globale und lokale Klassen
2.2 Attribute und Methoden
2.3 Eigenständige Datentypen einer Klasse
2.4 Konstruktoren
2.5 Objekte erzeugen und verarbeiten
2.6 Vererbung
2.7 Interfaces
2.8 Aliasse
2.9 Friends
2.10 Arbeiten mit Objektreferenzen
2.11 Polymorphie
2.12 Ereignisse
2.13 Ausnahmebehandlung
3 Fortgeschrittene Techniken
3.1 OO-Transaktion
3.2 Object Services
3.3 Die Factory-Methode
3.4 Shared Objects
3.5 Das MVC-Prinzip
3.6 Datenreferenzen
3.7 Run Time Type Services (RTTS)
3.8 ABAP-Unit-Tests/TDD
4 Zusammenfassung
A Autor
B Disclaimer
Willkommen bei Espresso Tutorials!
Unser Ziel ist es, SAP-Wissen wie einen Espresso zu servieren: Auf das Wesentliche verdichtete Informationen anstelle langatmiger Kompendien – für ein effektives Lernen an konkreten Fallbeispielen. Viele unserer Bücher enthalten zusätzlich Videos, mit denen Sie Schritt für Schritt die vermittelten Inhalte nachvollziehen können. Besuchen Sie unseren YouTube-Kanal mit einer umfangreichen Auswahl frei zugänglicher Videos:
https://www.youtube.com/user/EspressoTutorials.
Kennen Sie schon unser Forum? Hier erhalten Sie stets aktuelle Informationen zu Entwicklungen der SAP-Software, Hilfe zu Ihren Fragen und die Gelegenheit, mit anderen Anwendern zu diskutieren:
Eine Auswahl weiterer Bücher von Espresso Tutorials:
Antje Kunz: SAP® Legacy System Migration Workbench (LSMW)
Dr. Boris Rubarth: Schnelleinstieg in ABAP®
Thomas Stutenbäumer: SAP® Praxishandbuch ABAP Teil 1 – Konzeption, Entwicklung und Debugging
Michal Krawczyk: SAP® SOA Integration – Enterprise Service Monitoring
Thomas Stutenbäumer: SAP® Praxishandbuch ABAP Teil 2 – Performance, Erweiterungen, Transportwesen
Kathi Kones: SAP® List Viewer (ALV) – A Practical Guide for ABAP Developers
Marcel Schmiechen: Adobe® Interactive Forms – Interaktive Formulare in SAP®
Jelena Perfiljeva: What on Earth is an SAP® IDoc?
Paul Bakker & Rick Bakker: How to Pass the SAP® ABAP Certification Exam
Christoph Lordieck: SAP®-Schnelleinstieg: ABAP-Entwicklung in Eclipse
Ulrich Bähr, Axel Treusch: Praxisbuch SAP® Interactive Forms und Adobe LiveCycle Designer
Rüder Deppe: ABAP-Programmierung unter SAP® S/4HANA
Vorwort
SAP hat mit ABAP eine leistungsfähige Programmiersprache entwickelt, die immer wieder Neuerungen unterworfen ist. Solange seitens SAP ausschließlich die prozedurale Variante von ABAP verfügbar war, stand diese Programmiersprache in der Kritik, da sie gegenüber den damals schon existierenden objektorientierten Programmiersprachen als veraltet galt.
Schließlich hat die SAP ABAP Objects als objektorientierte Variante entwickelt. Während lange Zeit das alte prozedurale ABAP und ABAP Objects gleichberechtigt nebeneinander eingesetzt werden konnten, sind die neuen SAP-Features nur noch mit ABAP Objects anwendbar. So sind z.B. die modernen Benutzeroberflächen ab WebDynpro-Technik nur noch objektorientiert nutzbar.
Dieses Buch ist sowohl für Anfänger in ABAP Objects als auch für Fortgeschrittene geeignet. Als Anfänger finden Sie hier mühelos anwendbare Übungsprogramme, mit denen Ihnen das Thema »ABAP Objects« auf leicht verständliche Weise nähergebracht wird. Sie sollten aber zumindest ABAP-Grundkenntnisse besitzen. Falls Sie bereits fortgeschrittener Anwender sind, finden Sie hier neue Anregungen zum Umgang mit der objektorientierten Arbeitsweise.
In Kapitel 1 werden zunächst das prozedurale ABAP und ABAP Objects gegenübergestellt. Hier erkläre ich Ihnen, welche Vorteile ABAP Objects gegenüber dem prozeduralen ABAP bietet. Außerdem stelle ich die hinter beiden Programmierweisen stehenden Gedankenmodelle vor und erkläre, wie man planungs- und gedankenmäßig in ein ABAP-Objects-Programm einsteigen sollte.
In Kapitel 2 werden Ihnen die Grundlagen von ABAP Objects dargelegt. Ich stelle Ihnen die unterschiedlichen Arten von Klassen vor und erläutere, wie man solche Klassen aufbaut. Außerdem vermittle ich Ihnen, wie Sie mit den aus den Klassen generierten Objekten weiter verfahren. Mit ABAP-Release 7.4 haben sich diverse Neuerungen in der ABAP-Sprache ergeben. An Stellen, an denen sich diese Änderungen auf ABAP Objects auswirken, verweise ich explizit auf die aktuellen Codings.
Das ABAP-Release 7.5 hat für ABAP Objects keine weiteren Modifikationen gebracht und findet daher in diesem Buch keine Berücksichtigung.
In Kapitel 3 finden Fortgeschrittene gute Anregungen für ihre tägliche Arbeit mit ABAP Objects. Um dieses Kapitel zu verstehen, sind durchaus einige Fertigkeiten im Umgang mit ABAP Objects notwendig. Sie lernen OO-Transaktionen kennen und erfahren, wie man mit den Object Services, dem Persistenzdienst für ABAP Objects, umgeht. Außerdem werden die Factory-Methode als moderne Vorgehensweise in ABAP Objects, das Shared Memory als benutzer- und programmübergreifendes Hauptspeichermedium sowie das MVC-Prinzip vorgestellt. Danach erkläre ich den Umgang mit Datenreferenzen und den Run Time Type Services (RTTS). Als Abschluss erfahren Sie, welche Möglichkeiten sich Ihnen mit dem gegenüber früher deutlich verbesserten Tool ABAP-Unit-Test (TDD) bieten.
Der Leser dieses Buches findet viele Übungsprogramme, mithilfe derer er seine gelernte Theorie gleich in die Praxis umsetzen kann. Bei den Übungsprogrammen für Kapitel 2 ist es erforderlich, dass Sie diese von Anfang bis Ende durcharbeiten, weil sie jeweils auf das vorher Gelernte aufbauen. Auch bei den Übungsprogrammen des Kapitels 3 ist dieses Vorgehen teilweise anzuraten.
Ich bedanke mich bei dem Team von Espresso Tutorials für die Unterstützung bei der Erstellung dieses Buches, vor allem bei Anja Achilles, Johann-Christian Hanke und Martin Munzel. Außerdem gilt mein Dank meiner Frau Ivon für ihren administrativen Beistand.
Im Text verwenden wir Kästen, um wichtige Informationen besonders hervorzuheben. Jeder Kasten ist zusätzlich mit einem Piktogramm versehen, das diesen genauer klassifiziert:
Hinweis
Hinweise bieten praktische Tipps zum Umgang mit dem jeweiligen Thema.
Beispiel
Beispiele dienen dazu, ein Thema besser zu illustrieren.
Achtung
Warnungen weisen auf mögliche Fehlerquellen oder Stolpersteine im Zusammenhang mit einem Thema hin.
Zum Abschluss des Vorwortes noch ein Hinweis zum Urheberrecht: Sämtliche in diesem Buch abgedruckten Screenshots unterliegen dem Copyright der SAP SE. Alle Rechte an den Screenshots hält die SAP SE. Der Einfachheit halber haben wir im Rest des Buches darauf verzichtet, dies unter jedem Screenshot gesondert auszuweisen.
Optimale Anzeige der Quelltexte
Dieses Buch enthält zahlreiche Computerquelltexte mit Programmiercode. Damit Sie die korrekten Umbrüche sehen, empfehlen wir Ihnen, Ihr Lesegerät ggf. in den Landschaftsmodus (Querformat) zu schalten.
1 ABAP Objects versus prozedurales ABAP
Sie haben bisher erfolgreich mit prozeduralem ABAP gearbeitet. Dieses Kapitel gibt Auskunft darüber, warum Sie auf ABAP Objects umsteigen und wie Sie gedanklich an die neue Problemstellung herangehen sollten.
1.1 Begriffsbestimmung
Die frühere, althergebrachte Variante der ABAP-Programmierung bezeichnen wir als prozedurales ABAP. Es wird ein Programm erstellt, an dessen Anfang die Selektion von Daten steht. Diese werden anschließend verarbeitet und am Ende des Programms ausgegeben.
Die neue Variante der ABAP-Programmierung bezeichnen wir als ABAP Objects oder ABAP OO. ABAP Objects besteht aus Klassen. Jede Klasse stellt ein betriebswirtschaftliches Objekt (ein Haus, ein Auto, ein Flugzeug) dar, mit welchem sich das Programm beschäftigt.
Eine Klasse in ABAP Objects besteht aus Komponenten. Dieses sind die
Attribute (die Eigenschaften des betriebswirtschaftlichen Objekts),
Methoden (Verarbeitung der Attribute),
Ereignisse (Veröffentlichungen von Zustandsänderungen der Klasse, die klassenintern oder klassenübergreifend Methoden auslösen).
1.2 Warum ABAP Objects?
Viele Entwickler arbeiten bereits seit Langem erfolgreich mit prozeduralem ABAP. Das ist das, was sie gelernt haben, was sie schnell und einfach programmieren können. Sie fragen sich vermutlich: »Warum sollte ich ABAP Objects benutzen?«
Wenn man Klassen, Attribute, Methoden und Ereignisse mit geeigneten sprechenden Bezeichnungen versieht, ist eine Wartung des Programms wesentlich einfacher und damit schneller sowie komfortabler durchführbar, als es bei prozeduralem ABAP möglich ist, weil die Modularisierung wesentlich ausgeprägter ist. Methoden sollten allerdings nach Möglichkeit nicht aus zu viel Coding bestehen.
Eine Klasse ist nur über klar definierte Schnittstellen von anderen Klassen oder Programmstellen aus ansprechbar. Dadurch bekommt der Verwender (ein Programm, ein Funktionsbaustein oder andere Klassen) der Klasse nur das zu sehen, was ihn interessieren muss. Interne Vorgänge innerhalb der Klasse bleiben verborgen und somit bleibt die Konsistenz des Klassenobjekts erhalten. Dieser Kapselungsgedanken der Objektorientierung ist perfekt.
Bei den Ausnahmeklassen (Klassen, die im Fall einer Ausnahme erzeugt werden) lassen sich im Fehlerfall die Ausnahmen besser verwalten, als dieses bei prozeduralen Ausnahmen der Fall ist.
Mehrere betriebswirtschaftliche Objekte des gleichen Typs lassen sich mithilfe von Klassen wesentlich besser und einfacher verwalten als mit Funktionsgruppen. Bei Klassen spricht man in diesem Zusammenhang von Mehrfachinstanziierung. In Funktionsgruppen gibt es nur programmlokale Variablen, mit denen die gleichzeitige Verarbeitung mehrerer Objekte schwierig ist.
Neue ABAP-Konzepte wie z.B. WebDynpro für ABAP sind nur noch unter Einsatz von ABAP Objects durchführbar.
Die prozedurale Form-Routine (FORM … ENDFORM bzw. PERFORM) wurde von SAP inzwischen für obsolet erklärt.
Der einzige Nachteil von ABAP Objects besteht darin, dass keine SAP-GUI-Dynpros in Klassen angelegt werden können. Daher können Sie in Klassen keine CALL SCREEN-Anweisung verwenden. Zu diesem Zweck sollten Sie den CALL SCREEN-Aufruf in einem Funktionsbaustein durchführen, den Sie dann in einer Klasse aufrufen.
Ein Umschwenken auf ABAP Objects ist schwierig und der Umgang mit ABAP Objects zunächst ungewohnt. Aber nach längerer Zeit mit ABAP Objects werden Sie sich wundern, warum Sie es früher anders gemacht haben.
1.3 Gedankenmodelle und Herangehensweisen beider Varianten
Wenn Sie Ihre Programmentwicklung von prozeduralem ABAP nach ABAP Objects ändern, müssen Sie sich darüber im Klaren sein, dass Sie Ihre gedankliche Herangehensweise an das zu lösende Problem vollständig ändern müssen.
Hausbau mit prozeduralem ABAP
Nehmen wir an, Sie schreiben ein Programm zum Bauen eines Hauses. Beim prozeduralen ABAP fangen Sie an, indem Sie Bauarbeiter, Maschinen und Baustoffe selektieren. Danach werden diese Ressourcen verarbeitet, und irgendwann am Ende Ihres Programms steht das Haus.
Bei dieser Vorgehensweise wird außer Acht gelassen, dass es sich bei dem Haus lediglich um ein virtuelles Zahlenkonstrukt innerhalb des Computers handelt. Dieses besteht aus beispielsweise 4 Außenwänden, 8 Innenwänden, 10 m Höhe und 7 Fenstern. Ihr Programm ist nicht dazu da, die Tätigkeiten des Hausbaus abzubilden, sondern sollte das fertige Haus darstellen.
Hausbau mit ABAP Objects
Das virtuelle Zahlenkonstrukt des Hauses wird in der Klasse dargestellt, die das Haus repräsentiert. Sie besitzt die Attribute: Außenwände 4, Innenwände 8, Höhe 10 und Fenster 7. Ermittelt und bearbeitet werden diese Attribute in den Methoden dieser Klasse.
Machen Sie sich bei ABAP Objects erst bewusst, welches Objekt Ihre Klasse konkret abbilden soll. Erst dann legen Sie die Attribute, also die Eigenschaften dieses Objekts, an. Anschließend erstellen Sie die Methoden, mit denen Sie die Werte für die Attribute ermitteln und verarbeiten.
Wenn man sich mit ABAP Objects befasst, taucht zwangsläufig die Frage auf, wie viele und welche Klassen angelegt werden sollen. Dieses erfordert einige Übung und Erfahrung. Als Pauschalregel kann man ansetzen, dass für jede Anwendungs-Datenbanktabelle eine entsprechende Klasse erstellt wird. Es ist aber aufgrund von Vererbung, MVC-Prinzip oder anderer Umstände eventuell notwendig, noch weitere Klassen anzulegen. Die Begriffe »Vererbung« sowie »MVC-Prinzip« werde ich später in den Abschnitten 2.6 bzw. 3.5 noch näher erläutern. Für Customizingtabellen ist es meist nicht erforderlich, eine Klasse zu erstellen.
Vergessen Sie alles, was Sie bisher über prozedurale Programmentwicklung gehört und gedacht haben. Programmieren Sie mit ABAP Objects! Sogar das Anlegen eines Programms können Sie, wenn Sie möchten, vergessen, weil Sie mithilfe einer OO-Transaktion Ihren Transaktionscode direkt mit einer Klasse verbinden können.
2 Klassen und Objekte in ABAP Objects
Was sind Klassen? Aus welchen Komponenten bestehen sie, und wie arbeitet man mit ihnen? Wie werden Instanzen (Objekte) erzeugt? Antworten auf diese Fragen finden Sie in diesem Kapitel.
2.1 Globale und lokale Klassen
Die Klasse ist der elementare Hauptbestandteil von ABAP Objects (wie übrigens bei jeder anderen objektorientierten Programmiersprache auch). Eine Klasse bezeichnet ein Objekt aus der realen Welt, das mittels dieser Klasse beschrieben werden soll. Einfach ausgedrückt, hieße das z.B.: Ein Flugzeug wird durch die Klasse FLUGZEUG dargestellt, ein Haus durch die Klasse HAUS. Allerdings gilt es, die im jeweiligen Unternehmen vorhandenen Namenskonventionen zu beachten.
Als Pauschalregel kann zugrunde gelegt werden, dass jede Anwendungs-Datenbanktabelle durch eine Klasse repräsentiert wird. Später werden wir noch darauf kommen, dass eine Anwendungs-Datenbanktabelle auch durch mehrere vorhandene Klassen repräsentiert werden kann.
Sie können die Teile eines Objekts auf mehrere Klassen verteilen. Dieses geschieht vor allem in Fällen der Vererbung (siehe Abschnitt 2.6), bei der ein Objekt auf Ober- und Unterklassen aufgeteilt wird, und des MVC-Prinzips (siehe Abschnitt 3.5), wo es für jedes Objekt eine Datenmodell-, eine Verarbeitungs- und eine View-Klasse gibt.
Man unterscheidet lokale und globale Klassen. Lokale Klassen werden innerhalb eines Programms definiert (so wie eine normale Datendeklaration) und sind nur innerhalb dieses Programms vorhanden. Globale Klassen werden im Class Builder mit der Transaktion SE24 definiert und stehen systemweit für eine beliebige Verwendung zur Verfügung.
Eine Klasse besteht aus bis zu drei Sichtbarkeitsbereichen:
public,
private,
protected.
Komponenten (Attribute, Methoden und Ereignisse), die als public definiert sind, sind aus jedem Programm oder jeder Klasse aufrufbar und sichtbar. Bei der lokalen Klasse beschränkt sich die Aufrufbarkeit auf das Programm, in welchem die Klasse definiert wurde. Als protected definierte Komponenten sind nur innerhalb der eigenen Klasse, die diese deklariert hat, und innerhalb der Vererbungshierarchie nach unten aufrufbar und sichtbar, während als private definierte Komponenten dies ausschließlich innerhalb der eigenen Klasse sind.
2.1.1 Lokale Klassen
Lokale Klassen werden relativ selten benutzt. Sie werden innerhalb eines Programms angelegt und sind nur in diesem Programm sichtbar sowie verwendungsfähig.
Wir werden uns jetzt nach und nach eine lokale Klasse für ein FLUGZEUG aufbauen.
CLASS lcl_airplane DEFINITION.
ENDCLASS.
CLASS lcl_airplane IMPLEMENTATION.
ENDCLASS.
Listing 2.1
Dieses erste kurze Coding aus Listing 2.1 zeigt, dass Klassen grundsätzlich aus einem Definitionsteil und einem Implementierungsteil bestehen. Bei lokalen Klassen wird dieses besonders deutlich, da beide Teile im Programm explizit ausgefüllt werden.
CLASS lcl_airplane DEFINITION.
PUBLIC SECTION.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS lcl_airplane IMPLEMENTATION.
ENDCLASS.
Listing 2.2
Wie Sie in Listing 2.2 sehen, werden im Definitionsteil die einzelnen Sichtbarkeitsbereiche angelegt.
Später werden wir sehen, dass innerhalb der Sichtbarkeitsbereiche die Komponenten definiert werden. Im Rahmen des Implementierungsteils werden wir die Methoden mit Coding füllen.
2.1.2 Globale Klassen
Globale Klassen werden im sogenannten Class Builder (Transaktion SE24) angelegt und stehen dann im gesamten SAP-System zur Verfügung. Sie können den Class Builder auch starten, indem Sie die Transaktion SE80 aufrufen und im Dropdown-Menü Klasse/Interface wählen.
Im Folgenden werden wir eine globale Klasse für Flugdaten erstellen.
1. Rufen Sie die Transaktion SE24 auf. Es öffnet sich der in Abbildung 2.1 gezeigte Screen.
Abbildung 2.1: Class Builder – Einstiegsbild
2. Geben Sie im Feld Objekttyp den Namen der gewünschten Klasse ein (in diesem Fall Z_CL_FLIGHT).
3. Drücken Sie den Button Anlegen.
4. Wählen Sie im darauffolgenden Screen (siehe Abbildung 2.2) die Option Klasse. Auf Interfaces kommen wir in Abschnitt 2.7 noch zu sprechen.
Abbildung 2.2: Class Builder – Benennung Objekttyp
5. Geben Sie im Feld Beschreibung eine Bezeichnung ein (siehe Abbildung 2.3).
Abbildung 2.3: Class Builder – Beschreiben der Klasse
6. Wählen Sie für Inst.-Erzeugung den Eintrag Public. Dies bedeutet, dass jedes Programm oder jede Klasse mithilfe dieser anzulegenden Klasse ein Objekt erzeugen kann. Im Falle von »private« oder »protected« kann das nur innerhalb dieser Sichtbarkeitsbereiche geschehen. Wenn Sie den Eintrag »abstract« wählen, kann kein Objekt aus der Klasse erzeugt werden.
7. Als Klassentyp wählen Sie Gewöhnliche ABAP-Klasse.
8. Setzen Sie einen Haken bei der Checkbox FINAL. Das bewirkt, dass die Klasse nicht vererbt werden kann.
9. Drücken Sie den Button Sichern.
10. Geben Sie ein Paket und danach einen Transportauftrag an. Legen Sie in diesem Fall ein lokales Objekt als Paket an.
Jetzt sind Sie in der Klasse, wie Sie in Abbildung 2.4 sehen, und können diese mit Leben füllen, indem Sie die einzelnen Komponenten anlegen.
Abbildung 2.4: Class Builder – Methodenansicht