Читать книгу: «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:

http://www.fico-forum.de.

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

2.2 Attribute und Methoden

Die wichtigsten Komponenten einer Klasse sind Attribute und Methoden. Die Attribute stellen die Eigenschaften des Objekts dar, welches die Klasse repräsentiert. Um diese Attribute zu ermitteln und zu verarbeiten, werden die Methoden benötigt.

Es gibt sie als Instanzkomponenten und statische Komponenten.

Instanzkomponenten sind die eigentlichen Eigenschaften und Verarbeitungsmethoden des Objekts. Sie sind nur ansprechbar, nachdem aus der Klasse ein Objekt gebildet (instanziiert) wurde. Werden mehrere Objekte aus der Klasse instanziiert, hat jedes Objekt seine eigenen Werte in den Instanzattributen.

Statische Komponenten hingegen sind jederzeit verwendbar. Es müssen nicht erst Objekte aus der Klasse gebildet werden, um mit den statischen Komponenten arbeiten zu können. Statische Attribute haben nur einen Wert innerhalb der Klasse, auch wenn mehrere Objekte aus dieser instanziiert wurden. Sie sind nur notwendig, wenn alle Objekte auf den gleichen Wert zugreifen müssen, oder falls sie gebraucht werden, bevor mit der Klasse ein Objekt erzeugt wurde.

2.2.1 Attribute

Attribute können als Variablen oder Konstanten angelegt werden. Es wird empfohlen, variable Attribute immer im Sichtbarkeitsbereich »private« anzulegen, um den Objektschutzgedanken der Klasse zu erfüllen. Zur Verarbeitung benötigt man dann sogenannte SET- und GET-Methoden. Die SET-Methode wird verwendet, um das Attribut mit einem Wert zu füllen, und mit der GET-Methode lesen Sie den Wert des Attributs. Jede Klasse soll allein für die Versorgung ihrer eigenen Attribute zuständig sein.

Attribute nie »public« ohne »read-only«

In letzter Zeit mehren sich allerdings die Stimmen, die sagen, man soll variable Attribute aus Performancegründen als »public« und »read-only« deklarieren. In diesem Fall kann man sich die GET-Methoden ersparen. Die Klasse füllt dann das Attribut mit einem Wert, Aufrufer der Klasse können das Attribut aber nur lesen. Legen Sie nie ein variables Attribut »public« ohne »read-only« an!

Konstanten können »private«, »protected« oder »public« sein, weil sie nicht verändert werden können. Sie sind immer eine statische Komponente.

Lokale Klassen

Statische variable Attribute werden bei der Deklaration mit CLASS-DATA angelegt, Instanzattribute nur mit DATA.

CLASS lcl_airplane DEFINITION.

PUBLIC SECTION.

DATA gv_carrier_id TYPE s_carr_id READ-ONLY.

CONSTANTS gc_carrid_lufthansa

TYPE s_carr_id VALUE 'LH'.

PRIVATE SECTION.

DATA: gv_windows TYPE i,

gv_seats TYPE i.

CLASS-DATA gv_editor TYPE c LENGTH 20.

CONSTANTS gc_carrid_american

TYPE s_carr_id VALUE 'AA'.

ENDCLASS.

CLASS lcl_airplane IMPLEMENTATION.

ENDCLASS.

Listing 2.3

In Listing 2.3 sehen Sie das variable Instanzattribut GV_CARRIER_ID, welches als »public« und »read-only« definiert ist, sowie eine Konstante GC_CARRID_LUFTHANSA im Public-Bereich.

Im Private-Bereich befinden sich die variablen Instanzattribute GV_WINDOWS und GV_SEATS, das variable statische Attribut GV_EDITOR sowie die Konstante GC_CARRID_AMERICAN.

Globale Klassen

Um in einer globalen Klasse ein Attribut anzulegen, wechseln Sie auf die Registerkarte Attribute (siehe Abbildung 2.5).


Abbildung 2.5: Class Builder – Detailansicht Attribute

1. Rufen Sie die Klasse Z_CL_FLIGHT im Class Builder (Transaktion SE24) auf.

2. Wechseln Sie auf den Reiter Attribute.

3. Geben Sie im Feld Attribut den Namen GV_CONNID ein.

4. Wählen Sie als Art Instance Attribute (mit Wertehilfe auswählbar).

5. Wählen Sie die Sichtbarkeit Public (mit Wertehilfe auswählbar).

6. Setzen Sie den Haken bei Schreibg. (besser bekannt als »read-only«).

7. Das Feld Typisierung ist mit Type vorbelegt. Hier sind Werte wie in der DATA-Deklaration möglich.

8. Geben Sie als Bezugstyp ein Datenelement an, in diesem Fall S_CONN_ID.

9. Drücken Sie Enter. Dadurch wird das Feld Beschreibung vorbelegt.

10. Wenn Sie möchten, können Sie in das Feld Initialwert einen Startwert eingeben.

11. Geben Sie nun ein weiteres Attribut namens GC_CITY_LONDON ein.

12. Wählen Sie hierfür die Art Constant (mit Wertehilfe auswählbar).

13. Wählen Sie die Sichtbarkeit Public (mit Wertehilfe auswählbar).

14. Das Feld Typisierung ist auch hier mit Type vorbelegt.

15. Geben Sie als Bezugstyp ein Datenelement an, in diesem Fall S_FROM_CIT.

16. Drücken Sie Enter. Dadurch wird das Feld Beschreibung vorbelegt. Ergänzen Sie den Wert um den Zusatz London.

17. Geben Sie als Initialwert London ein.

18. Geben Sie ein Attribut namens GV_CARRID ein.

19. Wählen Sie als Art Instance attribute (mit Wertehilfe auswählbar).

20. Wählen Sie die Sichtbarkeit Private (mit Wertehilfe auswählbar).

21. Das Feld Typisierung ist mit Type vorbelegt.

22. Geben Sie als Bezugstyp ein Datenelement an, in diesem Fall S_CARR_ID.

23. Drücken Sie Enter. Dadurch wird das Feld Beschreibung vorbelegt.

24. Aktivieren Sie die Klasse, indem Sie auf den Aktivierungsbutton drücken.

Sie kommen auf einen Screen, wie Sie ihn in Abbildung 2.6 sehen.


Abbildung 2.6: Aktivierungsbild der Klasse

25. Drücken Sie den Button mit dem grünen Häkchen, um die Aktivierung zu bestätigen.

2.2.2 Methoden

Die Methoden ermitteln und verarbeiten die Werte der Attribute. Die Behandlung der Methoden ähnelt stark der Behandlung von Funktionsbausteinen. Methoden, die nur den Wert eines Attributs setzen, bezeichnet man auch als SET-Methode, und solche, die nur den Wert eines Attributs lesen, als GET-Methode.

Statische Methoden können nur auf statische Attribute zugreifen und ebenso nur statische Ereignisse auslösen. Demgegenüber sind Instanzmethoden in der Lage, auf alle Komponenten zugreifen.

Methoden können neben Ausnahmen folgende Parameter besitzen:

 Import-Parameter

 Export-Parameter

 Changing-Parameter

 Returning-Parameter.

Ein Returning-Parameter gibt wie ein Export-Parameter Werte an den Aufrufer heraus, hat aber den Vorteil, dass die Methode einfacher aufgerufen werden kann:

GV_VARIABLE = METHODE( ), wenn die Methode einen Returning-Parameter hat. In GV_VARIABLE steht dann der Wert, den der Returning-Parameter ausgegeben hat.

Eine Methode kann nur einen einzigen Returning-Parameter besitzen.

Parameter können auch als »optional« deklariert werden – so wie bei Funktionsbausteinen auch.

Normalerweise findet eine Referenzübergabe zwischen dem Aufrufer und der Methode statt. Die Parameter können aber entsprechend den Funktionsbausteinen auch als Wert-Übergabe definiert werden.

Vor Release 6.10 müssen Methoden wie folgt aufgerufen werden:

CALL METHOD methode

EXPORTING

parameter1 = variable1

parameter2 = variable2

IMPORTING

parameter3 = variable3

parameter4 = variable4

CHANGING

parameter5 = variable5

parameter6 = variable6

EXCEPTIONS

exception1 = 1

exception2 = 2.

Ab Release 6.10 können Methoden wie folgt aufgerufen werden:

methode(

EXPORTING

parameter1 = variable1

parameter2 = variable2

IMPORTING

parameter3 = variable3

parameter4 = variable4

CHANGING

parameter5 = variable5

parameter6 = variable6

EXCEPTIONS

exception1 = 1

exception2 = 2 ).

Wenn es nur Import-Parameter gibt, kann die Methode auch so aufgerufen werden:

methode(

parameter1 = variable1

parameter2 = variable2 ).

Gibt es nur einen Import-Parameter, ist die folgende Variante möglich:

methode( variable1 ).

Gibt es einen Returning-Parameter, sind diese Möglichkeiten gegeben:

gv_variable = methode(

EXPORTING

parameter1 = variable2

parameter2 = variable2 ).

oder

methode(

RECEIVING

parameter = gv_variable ).

oder

gv_variable = methode( ).

Vor ABAP-Release 7.4 kann eine Methode, die einen Returning-Parameter besitzt, nur weitere Importing-Parameter besitzen. Ab Release 7.4 ist es möglich, dass eine Methode mit Returning-Parameter auch Exporting- und Changing-Parameter besitzt.

Lokale Klassen

Statische Methoden werden bei der Deklaration mit CLASS-METHODS angelegt. Instanzmethoden werden mit METHODS deklariert.

CLASS lcl_airplane DEFINITION.

PUBLIC SECTION.

DATA gv_carrier_id TYPE s_carr_id READ-ONLY.

CONSTANTS gc_carrid_lufthansa

TYPE s_carr_id VALUE 'LH'.

METHODS: set_carrier_id,

set_windows

IMPORTING iv_windows TYPE i,

set_seats

IMPORTING iv_seats TYPE i,

get_windows

EXPORTING ev_windows TYPE i,

get_seats

EXPORTING ev_seats TYPE i,

compute_windows

IMPORTING iv_windows_basic TYPE i.

CLASS-METHODS compute_data

IMPORTING iv_number_1 TYPE i

iv_number_2 TYPE i

RETURNING value(rv_sum) TYPE i.


PRIVATE SECTION.

DATA: gv_windows TYPE i,

gv_seats TYPE i.

CLASS-DATA gv_editor TYPE c LENGTH 20.

CONSTANTS gc_carrid_american

TYPE s_carr_id VALUE 'AA'.

METHODS add_seats

IMPORTING iv_number_of_seats TYPE i.

ENDCLASS.


CLASS lcl_airplane IMPLEMENTATION.

METHOD set_carrier_id.

gv_carrier_id = gc_carrid_lufthansa.

ENDMETHOD.


METHOD set_windows.

gv_windows = iv_windows.

ENDMETHOD.


METHOD set_seats.

gv_seats = iv_seats.


add_seats( 3 ).

ENDMETHOD.


METHOD get_windows.

ev_windows = gv_windows.

ENDMETHOD.


METHOD get_seats.

ev_seats = gv_seats.

ENDMETHOD.


METHOD add_seats.

gv_seats = gv_seats + iv_number_of_seats.

ENDMETHOD.


METHOD compute_data.

rv_sum = iv_number_1 + iv_number_2.

ENDMETHOD.


METHOD compute_windows.

DATA lv_windows LIKE gv_windows.


lv_windows = iv_windows_basic + 4.

set_windows(

EXPORTING

iv_windows = lv_windows ).

ENDMETHOD.

ENDCLASS.

Listing 2.4

Über das in Listing 2.4 aufgeführte Coding werden im Public-Bereich neben den Attributen auch die Instanzmethoden SET_CARRIER_ID, SET_WINDOWS, SET_SEATS, GET_WINDOWS, GET_SEATS und COMPUTER_WINDOWS angelegt sowie eine statische Methode COMPUTE_DATA deklariert.

Im Private-Bereich gibt es neben den Attributen die Instanzmethode ADD_SEATS.

Im Implementierungsbereich werden die Methoden schließlich mit Leben gefüllt:

 SET_CARRIER_ID füllt das Attribut GV_CARRIER_ID mit der Konstante GC_CARRID_LUFTHANSA.

 SET_WINDOWS setzt das Attribut GV_WINDOWS mit dem Import-Parameter IV_WINDOWS.

 SET_SEATS füllt das Attribut GV_SEATS mit dem Import-Parameter IV_SEATS. Außerdem wird die Methode ADD_SEATS gerufen und ihr die Zahl 3 zur Verarbeitung übergeben.

 GET_WINDOWS liest das Attribut GV_WINDOWS aus und übergibt den Wert an den Export-Parameter EV_WINDOWS.

 GET_SEATS liest den Wert des Attributs GV_SEATS und übergibt ihn an den Export-Parameter EV_SEATS.

 ADD_SEATS berechnet den Wert des Attributs GV_SEATS.

 COMPUTE_DATA ermittelt den Wert des Returning-Parameters RV_SUM aus zwei Import-Parametern.

 COMPUTE_WINDWS hat ein lokales Attribut LV_WINDOWS, dessen Wert berechnet wird. Anschließend wird dieser Wert an die Methode SET_WINDOWS übergeben.

Globale Klassen

Um in einer globalen Klasse eine Methode anzulegen, wechseln Sie auf die Registerkarte Methoden.

1. Rufen Sie im Class Builder die Klasse Z_CL_FLIGHT auf und wechseln Sie auf den Reiter Methoden.

2. Geben Sie in Methode den Namen einer Methode ein, in diesem Fall GET_CARRID (siehe Methode in Abbildung 2.7).


Abbildung 2.7: Methoden der Klasse Z_CL_FLIGHT

3. Wählen Sie unter Art eine der Methodenarten: »Instance Method« oder »Static Method«, in diesem Fall Instance Method.

4. Wählen Sie im Feld Sichtbarkeit den Sichtbarkeitsbereich »public«, »protected« oder »private«, in diesem Fall Public.

5. Geben Sie in Beschreibung eine Bezeichnung für die Methode ein, in diesem Fall Get CARRID.

6. Legen Sie einen Parameter an, indem Sie den Cursor auf den Namen GET_CARRID setzen und auf den Button Parameter drücken.

7. Geben Sie im Feld Parameter den Namen des Parameters an, in diesem Fall RV_CARRID (siehe Abbildung 2.8).


Abbildung 2.8: Parameter für Methode GET_CARRID

8. Wählen Sie im Feld Art den Typ (»Importing«, »Exporting«, »Changing« oder »Returning«), in diesem Fall Returning.

9. Geben Sie im Feld Bezugstyp den Namen des Datenelements an, in diesem Fall S_CARR_ID.

10. Drücken Sie Enter. Dadurch wird auch das Feld Beschreibung gefüllt.

11. Drücken Sie den Button Methoden. So gelangen Sie zurück auf die Methodenübersicht.

12. Machen Sie einen Doppelklick auf den Namen der Methode GET_CARRID. Sie kommen jetzt in den Implementierungsteil der Methode und können die Methode zwischen dem Coding METHOD und ENDMETHOD mit Leben füllen.

13. Drücken Sie in der Drucktastenzeile auf Signatur.

Sie sehen jetzt wie in Abbildung 2.9 oberhalb des Codings die Parameter, die Sie für Ihre Methode angelegt haben, in diesem Fall nur einen Parameter. Als Signatur wird die Schnittstelle der Methode bezeichnet.


Abbildung 2.9: Signatur der Methode GET_CARRID

Ein erneutes Anklicken von Signatur blendet die Parameter wieder aus.

14. Schreiben Sie das folgende Coding in Ihre Methode:

METHOD get_carrid.

rv_carrid = gv_carrid.

ENDMETHOD.

Listing 2.5

Dadurch übergeben Sie den Inhalt des Attributs GV_CARRID an den Returning-Parameter RV_CARRID. Programmteile, die diese Methode aufrufen, können dadurch den Inhalt des Attributs GV_CARRID lesen.

Sie können in der Methode auch lokale Variablen definieren, um dort mit ihnen zu arbeiten.

Für das Attribut GV_CONNID benötigen wir keine GET-Methode, weil wir dieses Attribut als »public read-only« definiert haben.

15. Mit dem Button Zurück gelangen Sie wieder in die Klassenübersicht.

16. Legen Sie die weiteren Methoden DETERMINE_FLIGHT, COMPUTE_DATA und DETERMINE_DESTINATION wie in Abbildung 2.7 ersichtlich an.

17. Legen Sie die Methode SET_CARRID als Instanzmethode mit Sichtbarkeitsbereich »private« an.

18. Legen Sie für diese Methode einen Import-Parameter IV_CARRID mit Bezug zum Datenelement S_CARR_ID an.

19. Füllen Sie die Methode SET_CARRID mit folgendem Coding:

METHOD set_carrid.

gv_carrid = iv_carrid.

ENDMETHOD.

Listing 2.6

20. Legen Sie die Methode SET_CONNID als Instanzmethode mit Sichtbarkeitsbereich »private« an.

21. Legen Sie für diese Methode einen Import-Parameter IV_CONNID mit Bezug zum Datenelement S_CONN_ID an.

22. Füllen Sie die Methode SET_CONNID mit folgendem Coding:

METHOD set_connid.

gv_connid = iv_connid.

ENDMETHOD.

Listing 2.7

23. Aktivieren Sie die Klasse.

Wenn Sie sich im Codingteil einer Methode befinden, können Sie jederzeit über das Menü Springen • Klassendefinition in Ihre Klassendefinition und über das Menü Springen • Methodendefinition in Ihre Methodendefinition gelangen.

2.3 Eigenständige Datentypen einer Klasse

Wenn die Datentypen oder Datenelemente, die im SAP-System vorhanden sind, nicht ausreichen, können Sie in der Klasse auch eigenständige Datentypen erstellen. Diese gelten dann als statische Komponenten.

Sie haben zum einen die Möglichkeit, in der Methode lokale Datentypen, die nur für die Methode gelten, oder in der Klasse globale Datentypen anzulegen, die für die gesamte Klasse gelten. Wenn Sie den Datentyp als »public« definieren, können auch alle Programmteile, die die Klasse verwenden, auf den Datentyp zugreifen.

Zum Anlegen eines klasseneigenen Datentyps wechseln Sie auf die Registerkarte Typen der globalen Klasse.

1. Rufen Sie die Klasse Z_CL_FLIGHT auf und wechseln Sie auf den Reiter Typen.

2. Geben Sie im Feld Typ den Namen des neuen Datentyps an, in diesem Fall TY_AIRPLANE (gemäß Abbildung 2.10).


Abbildung 2.10: Class Builder – Ansicht eigene Datentypen

3. Wählen Sie unter Sichtbarkeit den Sichtbarkeitsbereich des Datentyps an, in diesem Fall Private.

4. Wenn Sie sich auf ein im SAP-System vorhandenes Datenobjekt beziehen wollen, wählen Sie für Typisierung Type. Für den Bezug auf eine bestehende Klasse wählen Sie hier »TYPE REF TO«. Geben Sie im Feld Bezugstyp das SAP-Objekt an. Meist aber werden Sie einen neuen Datentyp, z.B. eine neue Struktur, benötigen. Wählen Sie dazu den Pfeilbutton zwischen Bezugstyp und Beschreibung.

Wenn Sie sich für den PFEILBUTTON entscheiden, kommen Sie in den Editor für den Sichtbarkeitsbereich, so wie Sie es in Abbildung 2.11 sehen, und können dort als TYPES einen entsprechenden Datentyp anlegen.


Abbildung 2.11: Anlegen einer Struktur für eigene Datentypen

5. Mit dem Button Zurück kommen Sie wieder in die Klassenübersicht.

6. Geben Sie im Feld Beschreibung eine Erläuterung zum Datentyp an.

In der Klasse können Sie jetzt Attribute anlegen, deren Typ sich auf diesen angelegten Datentyp bezieht.

7. Aktivieren Sie die Klasse.

2.4 Konstruktoren

Konstruktoren sind eine besondere Form von Methoden. Sie sind dazu gedacht, die Attribute der Klasse in einen Anfangszustand zu versetzen, damit mit Ihnen gearbeitet werden kann. Sie füllen erstmalig die Attribute des Objekts, damit sie von den Methoden weiter verarbeitet werden können.

Konstruktoren lassen sich nicht über einen Methodenaufruf starten, sondern werden vom Programm automatisch aufgerufen.

Es gibt den CONSTRUCTOR, eine Instanzmethode, die bei der Erzeugung eines Objekts der Klasse genau einmal automatisch aufgerufen wird, und es gibt den CLASS_CONSTRUCTOR, eine statische Methode, die automatisch einmal vor dem ersten Zugriff des Programms auf die Klasse ausgeführt wird. Die Namen CONSTRUCTOR bzw. CLASS_CONSTRUCTOR sind fest vorgegeben.

Ein CONSTRUCTOR kann nur Import-Parameter besitzen und kann Ausnahmen erzeugen.

Ein CLASS_CONSTRUCTOR hat weder Parameter, noch kann er Ausnahmen erzeugen.

Lokale Klassen

CLASS lcl_airplane DEFINITION.

PUBLIC SECTION.

DATA gv_carrier_id TYPE s_carr_id READ-ONLY.

CONSTANTS gc_carrid_lufthansa

TYPE s_carr_id VALUE 'LH'.

METHODS: constructor

IMPORTING

iv_windows TYPE i

iv_seats TYPE i,

set_carrier_id,

set_windows

IMPORTING iv_windows TYPE i,

set_seats

IMPORTING iv_seats TYPE i,

get_windows

EXPORTING ev_windows TYPE i,

get_seats

EXPORTING ev_seats TYPE i,

compute_windows

IMPORTING iv_windows_basic TYPE i.

CLASS-METHODS compute_data

IMPORTING iv_number_1 TYPE i

iv_number_2 TYPE i

RETURNING VALUE(rv_sum) TYPE i.


PRIVATE SECTION.

DATA: gv_windows TYPE i,

gv_seats TYPE i.

CLASS-DATA gv_editor TYPE c LENGTH 20.

CONSTANTS gc_carrid_american

TYPE s_carr_id VALUE 'AA'.

METHODS add_seats

IMPORTING iv_number_of_seats TYPE i.

ENDCLASS.


CLASS lcl_airplane IMPLEMENTATION.

METHOD constructor.

set_carrier_id( ).

set_windows( iv_windows ).

set_seats( iv_seats ).

ENDMETHOD.


METHOD set_carrier_id.

gv_carrier_id = gc_carrid_lufthansa.

ENDMETHOD.


METHOD set_windows.

gv_windows = iv_windows.

ENDMETHOD.


METHOD set_seats.

gv_seats = iv_seats.


add_seats( 3 ).

ENDMETHOD.


METHOD get_windows.

ev_windows = gv_windows.

ENDMETHOD.


METHOD get_seats.

ev_seats = gv_seats.

ENDMETHOD.


METHOD add_seats.

gv_seats = gv_seats + iv_number_of_seats.

ENDMETHOD.


METHOD compute_data.

rv_sum = iv_number_1 + iv_number_2.

ENDMETHOD.


METHOD compute_windows.

DATA lv_windows LIKE gv_windows.


lv_windows = iv_windows_basic + 4.

set_windows(

EXPORTING

iv_windows = lv_windows ).

ENDMETHOD.

ENDCLASS.

Listing 2.8

In Listing 2.8 wurde das Coding der lokalen Klasse LCL_AIRPLANE um die Definition und Implementierung des CONSTRUCTORS ergänzt. Der CONSTRUCTOR besitzt zwei Parameter: IV_WINDOWS und IV_SEATS. Denken Sie bitte daran, dass deren Type I auch durch Datenelemente ersetzt werden kann.

In der Methode CONSTRUCTOR werden drei Methoden aufgerufen, um die Attribute mit Werten zu füllen: SET_CARRIER_ID, SET_WINDOWS und SET_SEATS.

Einen CLASS_CONSTRUCTOR können Sie anlegen, indem Sie ihn im Definitionsteil mit CLASS-METHODS CLASS_CONSTRUCTOR anlegen und anschließend im Implementierungsteil mit Leben füllen.

Бесплатный фрагмент закончился.

1 801,05 ₽

Жанры и теги

Возрастное ограничение:
0+
Дата выхода на Литрес:
22 декабря 2023
Объем:
216 стр. 127 иллюстраций
ISBN:
9783960123118
Издатель:
Правообладатель:
Автор
Формат скачивания:

Похожие книги