Rheinwerk < openbook > SAP-Wissen aus erster Hand
SAP-Wissen aus erster Hand.
 
Inhaltsverzeichnis
Vorwort zur vierten Auflage
1 ABAP und die ersten Schritte im SAP-System
2 ABAP Dictionary
3 Programmieren im ABAP Editor
4 Felder und Berechnungen
5 Modifikation von Zeichenketten
6 Debugging von Programmen
7 Modifikation von transparenten Datenbanktabellen
8 Rechnen mit Datum und Zeit, Mengen und Währungen
9 Mit Daten in einer Datenbanktabelle arbeiten
10 Programmablaufsteuerung und logische Ausdrücke
11 Selektionsbildschirme
12 Interne Tabellen
13 Modularisierung von Programmen
14 Weiterführende Themen
A Icons auf einen Blick
B Abkürzungsverzeichnis
C Die Autoren
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 23 KB

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Einstieg in ABAP von Karl-Heinz Kühnhauser, Thorsten Franz
Buch: Einstieg in ABAP

Einstieg in ABAP
Pfeil 13 Modularisierung von Programmen
Pfeil 13.1 Überblick
Pfeil 13.2 Quelltext-Module
Pfeil 13.3 Prozeduren
Pfeil 13.3.1 Unterprogramme
Pfeil 13.3.2 Funktionsbausteine
Pfeil 13.3.3 ABAP-Klassen
Pfeil 13.4 Speicherbereiche für Datenübergabe
Pfeil 13.4.1 Globales SAP Memory
Pfeil 13.4.2 Lokales SAP Memory
Pfeil 13.4.3 ABAP Memory
Pfeil 13.4.4 Shared Objects
Pfeil 13.5 Codebeispiele zur Modularisierung
Pfeil 13.6 Codebeispiele zum Aufruf fremder Reports
 
Zum Seitenanfang

13.3    Prozeduren Zur vorigen ÜberschriftZur nächsten Überschrift

Im Gegensatz zu Quelltext-Modulen verfügen Prozeduren über Schnittstellen für die Datenübergabe zwischen rufendem Programm und Prozedur. Wie erwähnt, können Prozeduren auch über eigene Datendeklarationen verfügen, die nur innerhalb dieser Prozedur bekannt sind.

 
Zum Seitenanfang

13.3.1    Unterprogramme Zur vorigen ÜberschriftZur nächsten Überschrift

Unterprogramme dienen hauptsächlich der programminternen Modularisierung von Aufgaben. Beispielsweise könnte eine abgegrenzte Aufgabe von verschiedenen Stellen des Hauptprogramms aus aufgerufen werden, oder Sie möchten inhaltlich zusammengehörige Aufgaben in ein gemeinsames Unterprogramm legen.

Der Report Z_TEILNEHMERLISTE12_ITAB_WA (siehe Listing 12.1) hat beispielsweise nur eine Ebene, auf der Deklarationen, Ereignisse, Anweisungen für die Programmablaufsteuerung und die Verarbeitung liegen.

[+]  Nur steuernde Komponenten auf erster Ebene

Auf der obersten Programmebene sollten aus Gründen der Übersichtlichkeit nur steuernde Komponenten enthalten sein, keine verarbeitenden. Das Füllen einer internen Tabelle stellt aber eine Verarbeitung dar. Deshalb gehören nach diesem Prinzip in das Ereignis START-OF-SELECTION eigentlich nur vier Anweisungen, nämlich vier Unterprogrammaufrufe. Die Verarbeitung selbst, d. h. das Füllen einer internen Tabelle wie in diesem Beispiel, sollte dann im Unterprogramm stattfinden. Falls die Verarbeitung wiederum aus mehreren Verarbeitungsschritten besteht, sollten auch die einzelnen Verarbeitungsschritte in eigenen Unterprogrammen liegen. Wie tief die Verarbeitung gegliedert ist, hängt in der Praxis von der Komplexität und vom Umfang der Aufgabenstellung ab.

Möchten Sie beispielsweise das Unterprogramm ITAB01_FUELLEN aufrufen, lautet die Anweisung:

PERFORM itab01_fuellen.

Am einfachsten ist es, ein Unterprogramm durch Vorwärtsnavigation anzulegen. Nach dem Doppelklick auf den Namen des Unterprogramms fragt Sie das System, ob Sie das Objekt anlegen möchten. Sie antworten mit Ja, und das System bietet Ihnen nun verschiedene Möglichkeiten an.

[+]  Rahmenprogramm

Sie sollten sich für das Anlegen des Unterprogramms im Rahmenprogramm entscheiden (siehe Abbildung 13.3), da die Aufgabe, eine interne Tabelle zu füllen, inhaltlich nicht zu den Deklarationen gehört und Sie auch kein neues Include-Programm anlegen möchten. Ein Include-Programm bietet, wie erwähnt, keine Datenschnittstelle und wirkt wie das Kopieren von Quellcode an die Aufrufstelle.

Unterprogramm in Rahmenprogramm einfügen

Abbildung 13.3    Unterprogramm in Rahmenprogramm einfügen

Um das Unterprogramm in Ihrem Rahmenprogramm Z_TEILNEHMERLISTE13 anzulegen, markieren Sie den entsprechenden Zeilenkopf und klicken auf den Weiter-Button (inline image).

Das System fügt nun am Ende Ihres Hauptprogramms Kommentarzeilen ein sowie die beiden Anweisungen FORM und ENDFORM (siehe Abbildung 13.4).

Struktur eines Unterprogramms

Abbildung 13.4    Struktur eines Unterprogramms

Die Anweisung FORM deklariert den Anfang des Unterprogramms, die ENDFORM-Anweisung dessen Ende. Mit der Anweisung PERFORM wird vom rufenden Programm zur FORM-Anweisung des jeweiligen Unterprogramms verzweigt. Nach dem Durchlaufen der ENDFORM-Anweisung setzt das System die Verarbeitung in der rufenden Struktur nach der PERFORM-Anweisung fort. Zwischen FORM und ENDFORM stehen die ABAP-Anweisungen, die in diesem Unterprogramm ausgeführt werden sollen. In unserem Beispiel sind dies die Anweisungen für das Füllen der internen Tabelle ITAB01. Nachdem Sie die Anweisungen eingefügt haben, kehren Sie mit dem Zurück-Button (inline image) zur Aufrufstelle zurück.

Globale und lokale Variablen

Bisher haben Sie nur mit globalen Variablen gearbeitet, d. h. dass alle Variablen im Unterprogramm die gleichen Namen wie im Hauptprogramm haben. Die globalen Variablen sind dementsprechend im Hauptprogramm deklariert. Wie Sie später noch im ABAP Debugger verfolgen können, sind sie in allen tiefer liegenden gerufenen Strukturen und Ebenen dieses Programms bekannt.

Im Gegensatz hierzu sind lokale Variablen nur auf der Ebene bekannt, auf der sie deklariert wurden, in diesem Fall nur im Unterprogramm, d. h. weder auf höher noch auf tiefer liegenden Ebenen. Der Sinn von lokalen Variablen liegt einerseits darin, dass Felder manchmal nur in bestimmten Modulen benötigt werden und durch die Zerlegung der insgesamt benötigten Variablen in mehrere Bereiche die Komplexität sinkt. Andererseits liegt er darin, dass die Module hierdurch von den rufenden Modulen entkoppelt werden können. Damit sind sie als Bausteine universell verwendbar.

Durch die Aufteilung und Zuordnung von globalen und lokalen Variablen können solche Module von einer beliebigen Stelle aus aufgerufen werden. Über die Datenschnittstelle werden die globalen Namen den lokalen Namen zugeordnet und die Inhalte übergeben. Damit können die Namen in den rufenden Strukturen völlig unterschiedlich sein. Durch die Aufteilung in globale und lokale Variablen ist es möglich, Prozeduren auch einzeln zu testen, und sie sind leichter separat änderbar: Sowohl die steuernde Ebene des Hauptprogramms als auch die verarbeitende Ebene einzelner Prozeduren kann geändert werden, ohne dass sich Auswirkungen auf die jeweils andere Ebene ergeben.

Für die Deklaration von lokalen Variablen gibt es zwei Möglichkeiten: explizit oder implizit.

  • Lokale Variable explizit deklarieren
    Bei der expliziten Deklaration schreiben Sie in die FORM-Prozedur eine oder mehrere DATA-Anweisungen, mit denen Sie die notwendigen Felder deklarieren. Mit Datentypen und anderen Datenobjekten verfahren Sie entsprechend. Wie erwähnt, bleiben die Datenobjekte und deren Inhalte innerhalb dieser FORM-Routine isoliert; die Weiterverarbeitung muss von hier aus erfolgen:

    FORM itab03_fuellen .
    DATA lok_tmax TYPE i VALUE 10.
    * Anweisungsblock
    ENDFORM.

    In diesem Codebeispiel wurde die Variable LOK_TMAX lokal deklariert. Sollte die Variable modifiziert und deren Inhalt beispielsweise in einer Liste ausgegeben werden, müsste die jeweilige WRITE-Anweisung im Anweisungsblock des Unterprogramms enthalten sein.

  • Lokale Variable implizit deklarieren
    Implizit deklarieren Sie lokale Variablen, wenn Sie die Datenschnittstelle verwenden. Bereits beim Aufruf des Unterprogramms geben Sie mit der PERFORM-Anweisung und dem Zusatz USING eine Liste von Feldern bzw. Tabellen als Operanden mit.

    Eine Besonderheit von Unterprogrammen gegenüber Methoden und Funktionsbausteinen ist, dass es sich bei den Parametern um Stellungsoperanden handelt; es ist daher wieder die Reihenfolge der Felder wichtig:

    PERFORM itab04_liste USING par04     zzaehler_itab04.
    FORM itab04_liste USING lok_par04 lok_zzaehler.
    * Anweisungsblock
    ...
    CHECK lok_par04 IS NOT INITIAL.
    ...
    ENDFORM.

    Sowohl die PERFORM- als auch die FORM-Anweisung müssen hinsichtlich dieser Feldliste eine identische Anzahl von Feldern beinhalten; die Namen können unterschiedlich sein. Das erste Feld in der Liste der FORM-Anweisung wird im Unterprogramm so deklariert wie das erste Feld in der Liste bei der PERFORM-Anweisung, das zweite und alle weiteren entsprechend ihrer Anordnung. Das Feld LOK_ZZAEHLER des Unterprogramms wird beispielsweise wie das Feld ZZAEHLER_ITAB04 deklariert. Man kann die Wirkung mit dem Zusatz TYPE bei der DATA-Anweisung vergleichen.

Zum Zeitpunkt der PERFORM-Anweisung sind im Beispiel die Felder PAR04 und ZZAEHLER_ITAB04 deklariert und dem System bekannt. Mit dem Aufruf des Unterprogramms werden die Feldinhalte aus den Feldern der Liste in die zugehörigen Unterprogrammfelder kopiert.

Wie in Abbildung 13.5 am Beispiel der CHECK-Anweisung deutlich zu erkennen ist, werden die Felder im Unterprogramm mit ihrem lokalen Feldnamen angesprochen. Verändert sich der Inhalt der lokalen Variablen im Unterprogramm, verändert sich automatisch auch der Inhalt der übergeordneten (globalen) Variablen.

Nach dem Durchlaufen der Anweisung ENDFORM sind die lokale Variable und deren Inhalt dem System nicht mehr bekannt. Dies ist allerdings nicht schlimm, weil die Feldinhalte im Beispiel in den entsprechenden Variablen PAR04 und ZZAEHLER_ITAB04 enthalten sind, wie aus Abbildung 13.6 ersichtlich ist.

Globale und lokale Felder im Unterprogramm

Abbildung 13.5    Globale und lokale Felder im Unterprogramm

Lokale Variablen nach Ende des Unterprogramms nicht mehr bekannt

Abbildung 13.6    Lokale Variablen nach Ende des Unterprogramms nicht mehr bekannt

Interne Tabellen übergeben

Auch bei internen Tabellen ist die Übergabe an ein Unterprogramm möglich – bei der PERFORM-Anweisung benötigen Sie hierzu wieder den Zusatz USING. Besitzt die zu übergebende Tabelle eine Kopfzeile, ist Vorsicht geboten, denn wenn Sie etwas falsch machen, übergeben Sie nur die Kopfzeile und nicht den Tabellenrumpf. Das werden wir uns im Folgenden genauer anschauen.

Im Beispiel wurde die interne Tabelle ITAB02 ohne Kopfzeile deklariert. Möchten Sie sie im gekapselten Unterprogramm bearbeiten, lautet die Anweisung:

PERFORM itab_fuellen USING itab02.

Analog hierzu muss die FORM-Anweisung aufgebaut sein:

FORM itab_fuellen USING itab_universal TYPE table.
[»]  Kopfzeile beachten

Angenommen, die interne Tabelle ITAB02 wäre mit Kopfzeile deklariert worden, dann würde dem Unterprogramm mit der PERFORM-Anweisung nur die Kopfzeile zur Verfügung stehen. Soll demnach in diesem Beispiel der Tabellenrumpf dem Unterprogramm ebenfalls bereitstehen, müssten Sie – wie bei der CLEAR-Anweisung – wieder mit eckigen Klammern arbeiten, und die PERFORM-Anweisung würde lauten:

PERFORM itab_fuellen USING itab02[].

Wie Sie in Abbildung 13.7 am fehlenden Hut-Symbol erkennen können, wurde die interne Tabelle ITAB02 ohne Kopfzeile deklariert und ist noch leer.

Auch wenn die entsprechende lokale interne Tabelle (siehe Abbildung 13.8) mit einer Kopfzeile deklariert ist, werden bei der Übergabe mit dem Zusatz USING nur die Rumpfzeilen an das Unterprogramm und bei der ENDFORM-Anweisung wieder zurück an das rufende Programm übergeben.

Interne Tabelle an Unterprogramm übergeben

Abbildung 13.7    Interne Tabelle an Unterprogramm übergeben

Lokale interne Tabelle

Abbildung 13.8    Lokale interne Tabelle

Im Unterprogramm werden die interne Tabelle und deren Felder ausschließlich über ihre lokalen Namen angesprochen. Beispielsweise müsste eine WRITE-Anweisung folgendermaßen lauten:

WRITE: / itab_universal-zzkurstitel.

Dementsprechend sollte sie nicht so aussehen:

WRITE: / itab04-zzkurstitel.
[+]  Interne Tabellen im Unterprogramm

Ein weiterer Stolperstein könnte sein, dass für die Verarbeitung von internen Tabellen mit Kopfzeile andere Regeln und Mechanismen gelten als für solche ohne. Auch einige Kommandos wie CLEAR wirken unterschiedlich (siehe Kapitel 12, »Interne Tabellen«). Falls Ihr Hauptprogramm (entgegen der modernen Konvention) Tabellen mit Kopfzeilen verwendet, müssen Sie im Unterprogramm eventuell ein wenig umdenken – ein weiterer Grund, auf Kopfzeilen zu verzichten.

Externe Unterprogramme

ABAP bietet nicht nur die Möglichkeit, eigene Unterprogramme zu nutzen, sondern es kann auch Unterprogramme anderer Reports aufrufen oder andere Reports insgesamt als »Unterprogramm« einbinden. Diese Modularisierungstechnik ist in der modernen ABAP-Programmierung nahezu obsolet; an ihre Stelle sind objektorientierte Techniken wie das Aufrufen von Methoden anderer Klassen getreten. Doch schon aufgrund der schieren Menge existierenden ABAP-Programmcodes im SAP-Standard gilt: Auch wenn eine Programmiertechnik Staub angesetzt hat, bleibt sie doch in der Regel relevant für Neueinsteiger, denn sie wird Ihnen noch viele Male bei der Auseinandersetzung mit Programmen des SAP-Standards begegnen.

Sie können von Ihrem Report aus entweder in das gerufene Programm springen und dort bleiben oder nach der Ausführung des gerufenen Programms wieder in Ihren Report zurückkehren. Es gibt auch noch die Möglichkeit, das gerufene Programm über dessen Selektionsbildschirm zu starten oder diesen zu umgehen. Umgehen Sie den Selektionsbildschirm, ist es zu empfehlen, die erforderlichen Einstellungen entweder zu übergeben oder den Report über eine Variante zu starten.

Nach der Verarbeitung eines externen Unterprogramms kehrt das System immer wieder in Ihren Report zurück und setzt die Verarbeitung an der Stelle nach dem Unterprogrammaufruf fort. Die Wirkung des externen Unterprogrammaufrufs ist genau wie bei einem internen Unterprogramm. Sie benötigen den Namen des Unterprogramms, den Namen des Reports und Informationen über die Datenschnittstelle. Selbstverständlich sollten Sie auch die Funktion und Arbeitsweise des externen Unterprogramms genau kennen.

Möchten Sie beispielsweise aus Ihrem Report Z_TEILNEHMERLISTE13_B das externe Unterprogramm ITAB04_LISTE aus dem Report Z_TEILNEHMERLISTE13_A aufrufen, müssen Sie die Parameterliste des gerufenen Unterprogramms prüfen, die beispielsweise so aussehen könnte:

FORM itab04_liste USING lok_par04 lok_zzaehler.

Enthält sie wie hier zwei Stellungsoperanden, müssen Sie wissen, wozu diese Operanden dienen und Ihre Parameterliste beim Aufruf entsprechend gestalten.

Bei der PERFORM-Anweisung verwenden Sie den Zusatz IN PROGRAM. Die Anweisung könnte in Ihrem Report dann beispielsweise wie folgt lauten:

* Moderne Schreibweise
PERFORM itab04_liste IN PROGRAM z_teilnehmerliste13_a
USING nvml zzaehler_itab04.

Externe Reports

Soll ein externer ausführbarer Report von Ihrem Programm aufgerufen werden, ist eine der ersten Fragen, ob Ihr Report danach weiterarbeiten soll oder ob er mit dem Aufruf des fremden Reports endet. Ferner sollten Sie klären, ob Sie den gerufenen Report über dessen Selektionsbildschirm ausführen möchten oder ob er im Hintergrund laufen soll.

Der Selektionsbildschirm bietet zwar mehr Dialogmöglichkeiten, bremst aber auch den Ablauf. Verzichten Sie auf den Selektionsbildschirm des gerufenen Reports, sollten Sie trotzdem die nötigen Selektionen beachten. Hierzu bietet sich die Möglichkeit an, den Report über eine Variante zu starten oder die Werte für den Selektionsbildschirm aus Ihrem Programm heraus zu übergeben. Zum Start eines fremden Reports verwenden Sie in allen Fällen die Anweisung SUBMIT; nur die Zusätze sind unterschiedlich.

Im Folgenden verdeutlichen wir Ihnen die verschiedenen Möglichkeiten wieder an Beispielen.

[zB]  Beispiel 1: Aufruf eines fremden Reports beenden

Sie möchten mit dem Aufruf des fremden Reports Ihren Report beenden. Der fremde Report soll sich mit seinem Selektionsbildschirm melden. Er heißt Z_TEILNEHMERLISTE13_A.

Die Lösung erhalten Sie durch den Zusatz VIA SELECTION-SCREEN:

SUBMIT z_teilnehmerliste13_a VIA SELECTION-SCREEN.

Zunächst erhalten Sie den Selektionsbildschirm Ihres eigenen Reports. Sobald das SUBMIT-Kommando in Ihrem Quellcode ausgeführt wird, erhalten Sie den Selektionsbildschirm des gerufenen Reports, und Ihr Report endet. Die nachfolgenden Anweisungen in Ihrem Report werden nicht mehr ausgeführt. Anschließend arbeiten Sie im gerufenen Report weiter.

[zB]  Beispiel 2: Selektionsbildschirm des Folge-Reports steuern

Wie Sie wahrscheinlich in Beispiel 1 bemerkt haben, sind die bis zum SUBMIT ermittelten Zwischenergebnisse oder Inhalte von internen Tabellen Ihres Reports greifbar, danach jedoch nicht mehr. Das heißt, dass Sie sie entweder bis dahin verarbeitet haben oder sie verloren sind. Möglicherweise möchten Sie aber auch den Selektionsbildschirm des folgenden Reports damit versorgen oder steuern.

Zur Lösung des Problems verwenden Sie wieder das SUBMIT-Kommando, dieses Mal aber mit dem Zusatz WITH für jeden Parameter bzw. jede Selektionstabelle des Folge-Reports, der übergeben werden soll.

Möchten Sie beispielsweise den Report Z_TEILNEHMERLISTE13_A aufrufen, müssen Sie prüfen, wie dessen Selektionsbildschirm aufgebaut ist, wie die technischen Namen der entsprechenden Selektionsparameter lauten und welche Werte Sie sinnvollerweise übergeben sollten.

Im folgenden Codebeispiel übergeben Sie Werte für zwei Parameter des Folgeselektionsbildschirms. Ihre technischen Namen im Folge-Report sind PAR02 und PAR03; es handelt sich bei beiden Parametern um Ankreuzfelder, die mit einem Haken versehen werden sollen. Wie in Abschnitt 11.2.2, »Zusätze zur PARAMETERS-Anweisung«, beschrieben, sind solche Ankreuzfelder einstellige Character-Felder mit einem Leerzeichen oder einem X als Inhalt. Sie übergeben folglich für jeden Parameter das Literal 'X'. Zur Kontrolle lassen Sie sich den Selektionsbildschirm anzeigen. Die SUBMIT-Anweisung sieht dann folgendermaßen aus:

SUBMIT z_teilnehmerliste13_a
WITH par02 = 'X'
WITH par03 = 'X'
VIA SELECTION-SCREEN.
[zB]  Beispiel 3: Report ohne Selektionsbildschirm rufen

Angenommen, der fachliche Ablauf aus Beispiel 2 wäre nun korrekt, dann würde Sie die Anzeige des Selektionsbildschirms des Folge-Reports nur bei der Arbeit bremsen. Dieses Problem möchten Sie umgehen.

Mit der SUBMIT-Anweisung können Sie den Selektionsbildschirm des Folge-Reports übergehen, indem Sie den Zusatz VIA SELECTION-SCREEN weglassen. Beim Ausführen Ihres Reports würden Sie überhaupt nicht mehr merken, dass ein anderer Report die Arbeit übernommen und die Ergebnisse produziert hat.

Angenommen, Sie möchten nur den Parameter PAR02 übergeben und der gerufene Report soll im Hintergrund arbeiten, dann schreiben Sie:

SUBMIT z_teilnehmerliste13_a
WITH par02 = 'X'.
[zB]  Beispiel 4: Eigener Report soll weiterlaufen

Die ersten drei Beispiele dieses Kapitels waren für den Fall, dass Ihr Report beendet wird und ein anderer Report die Arbeit fortsetzt. Nun möchten Sie den fremden Report aber nur wie ein Unterprogramm einbinden, sodass nach dem fremden Report Ihr eigener Report wieder weiterarbeiten soll.

Auch dies ist mit der Anweisung SUBMIT möglich; sie hat dafür den Zusatz AND RETURN. In folgendem Beispiel wird der fremde Report Z_TEILNEHMERLISTE13_A aufgerufen. Ist dieser Report beendet, verzweigt das System wieder in Ihren ursprünglichen Report und setzt die Verarbeitung nach dem SUBMIT-Kommando mit der nächsten Anweisung fort:

SUBMIT z_teilnehmerliste13_a VIA SELECTION-SCREEN
AND RETURN.

Allerdings wird damit die Datenkonsistenz der beiden Reports insgesamt langsam schwieriger: Report A »weiß« ja grundsätzlich nichts von den Daten und Feldinhalten des Reports B und umgekehrt, da jeder Report prinzipiell unabhängig vom anderen läuft.

Um dieses kleine Problem zu lösen, verwenden Sie Arbeitsspeicherbereiche, auf die mehrere Programme gemeinsam zugreifen können. Sie müssen nur dafür sorgen, dass der richtige Report die richtigen Bereiche zur richtigen Zeit füllt, damit der andere Report dort sinnvolle Daten findet, wenn er sie benötigt. Auf diese gemeinsam genutzten Bereiche gehen wir in Abschnitt 13.4, »Speicherbereiche für Datenübergabe«, noch kurz ein.

 
Zum Seitenanfang

13.3.2    Funktionsbausteine Zur vorigen ÜberschriftZur nächsten Überschrift

Funktionsbausteine sind – wie auch Unterprogramme – Prozeduren, die sich von Unterprogrammen allerdings erheblich in der Art und Weise unterscheiden, wie sie gepflegt und verwendet werden. Funktionsbausteine werden für abgegrenzte Teilaufgaben eingesetzt, die im gesamten SAP-System an verschiedensten Stellen immer wieder einmal benötigt werden können. In diesem Abschnitt wird beispielsweise der Download einer internen Tabelle in eine lokale Datei beschrieben – eine Aufgabe, die in jedem Arbeitsgebiet und Bereich eines Unternehmens eines Tages aktuell werden könnte. Wenn Sie dann das Rad nicht neu erfinden müssen, sondern auf eine fertige Komponente zurückgreifen können, werden Sie die Vorteile von Funktionsbausteinen zu schätzen wissen.

Bereits mit dem SAP-Standard wird eine Vielzahl fertiger Funktionsbausteine ausgeliefert. Zusätzlich können kundenindividuelle Funktionsbausteine erstellt werden.

Function Builder

Funktionsbausteine werden in einer eigenen Funktionsbibliothek verwaltet. Hierzu existiert ein eigenes Werkzeug, der Function Builder. Mit diesem Werkzeug werden Funktionsbausteine entwickelt, verwaltet und getestet. Funktionsbausteine, die fachlich zu einem Arbeitsgebiet gehören, sind in Funktionsgruppen zusammengefasst. Auch das Anlegen und Verwalten von Funktionsgruppen geschieht mithilfe des Function Builders.

Für den Einstieg in ABAP genügt es zu wissen, wie Sie mit diesem Werkzeug Funktionsbausteine in der Bibliothek suchen, wie Sie ihre Dokumentation und Schnittstellen verstehen und wie Sie Funktionsbausteine testen und in Ihr ABAP-Programm einbinden können. Sie erreichen den Function Builder über SAP MenüWerkzeugeABAP WorkbenchEntwicklungFunction Builder oder über die Transaktion SE37.

Im Einstiegsbild des Function Builders rufen Sie zunächst über das Menü HilfsmittelSuchen das Repository-Infosystem auf (siehe Abbildung 13.9), um Funktionsbausteine zu suchen. Dieses Infosystem für alle SAP-Objekte können Sie auch eigenständig zur Suche anderer Objekte nutzen; hier ist es bereits automatisch integriert.

Funktionsbaustein im Function Builder suchen

Abbildung 13.9    Funktionsbaustein im Function Builder suchen

[+]  Keine Sisyphusarbeit

Natürlich sollten Sie sich bereits vorher überlegt haben, wofür Sie einen Funktionsbaustein suchen. Bei der angebotenen Fülle von Bausteinen – im Standard sind mehrere Hundert Funktionsbausteine enthalten – könnte die Sucharbeit sonst schnell zur Sisyphusarbeit ausarten. Auch Tipps von erfahrenen Praktikern zu Namensbestandteilen oder anderen Suchkriterien können sehr hilfreich sein.

Funktionsbaustein zum Starten eines Programms

Als erste Übung suchen Sie einen Funktionsbaustein, der ein lokales Programm auf dem Präsentationsserver startet. Da ausführbare Programme, die sogenannten exe-Dateien, vom englischen Wort »execute« für »ausführen« stammen, liegt die Vermutung nahe, dass eines dieser Wörter Namensbestandteil des gesuchten Bausteins sein könnte. Am besten suchen Sie generisch, d. h. mit Ersatzzeichen: Wie in Abbildung 13.10 gezeigt, geben Sie für den zu suchenden Namen bei Funktionsbaustein den Suchbegriff *execute* ein und klicken auf Ausführen.

Funktionsbausteine generisch suchen

Abbildung 13.10    Funktionsbausteine generisch suchen

In der Praxis beginnt natürlich kaum jemand so blind. Überwiegend arbeiten Entwickler in bestimmten Modulen und Anwendungen und kennen demzufolge die einschlägigen Pakete, Funktionsgruppen etc. Auch ist es nicht unbedingt ratsam, jeden Funktionsbaustein zu verwenden, nur weil er funktioniert und den momentan angestrebten Zweck erfüllt – als Softwareentwickler werden Sie ein Gespür dafür entwickeln, ob ein bestimmter fremder Baustein auch in zukünftigen Releases stabil laufen wird und ob er in der Zielumgebung, in der Ihr Programm produktiv laufen wird, vorhanden ist. Für den Einstieg in ABAP wäre dies jedoch zu viel verlangt.

Ist der generische Suchbegriff zu allgemein, erscheint eine sehr umfangreiche Liste, im Beispiel mit über 300 möglichen Treffern. Um das Vorgehen abzukürzen, versuchen Sie die nächste Suche mit *WS_EXEC*, und Sie erhalten eine schon übersichtlichere Liste möglicher Treffer (siehe Abbildung 13.11).

Trefferliste bei der Suche nach *WS_EXEC*

Abbildung 13.11    Trefferliste bei der Suche nach *WS_EXEC*

Funktionsbausteine, deren Kurztext mit »Obsolet« beginnt, sollten Sie normalerweise nicht mehr verwenden. Wir werden das in diesem Beispiel zunächst ausnahmsweise dennoch tun, um die Arbeit mit Funktionsbausteinen zu demonstrieren. Anschließend werden wir es richtig machen und anstelle des obsolet gewordenen Funktionsbausteins den empfohlenen Ersatzbaustein verwenden.

Die übrigen Bausteine können Sie sich informationshalber näher ansehen. Markieren Sie nun für dieses Beispiel das Ankreuzfeld des Funktionsbausteins WS_EXECUTE, und springen Sie über den Anzeigen-Button zurück in den Function Builder (siehe Abbildung 13.12).

Quellcode des Funktionsbausteins im Function Builder

Abbildung 13.12    Quellcode des Funktionsbausteins im Function Builder

Es werden Ihnen verschiedene Registerkarten angezeigt. Solange Sie den Funktionsbaustein unverändert einsetzen möchten, ist der Quellcode nur als Information interessant. Wichtiger sind in diesem Fall die anderen Registerkarten:

  • Eigenschaften
    Auf der Registerkarte Eigenschaften (siehe Abbildung 13.13) finden Sie allgemein die Eigenschaften des Bausteins. Bei der Ablaufart ist im Beispiel ein normaler Funktionsbaustein eingetragen; ein solcher Baustein ist wie ein Unterprogramm nutzbar. Er ist nicht dazu gedacht, mit einem fremden SAP-System zusammenzuarbeiten; er ist daher nicht remotefähig und übernimmt auch keine Verbuchungsaufgaben auf der Datenbank. Bei selbst erstellten Funktionsbausteinen können diese Optionen geändert werden.

    Eigenschaften des Funktionsbausteins

    Abbildung 13.13    Eigenschaften des Funktionsbausteins

  • Import
    Die Registerkarte Import (siehe Abbildung 13.14) beschreibt die Datenschnittstelle auf der Input-Seite des Bausteins, d. h. welche Informationen der Funktionsbaustein von Ihrem ABAP-Quellcode benötigt. Sie sehen, wie die betreffenden Parameter im Funktionsbaustein heißen, welchen Typ sie haben und ob sie mit Vorschlagswerten vorbelegt werden.

    Wichtig sind auch die Spalten Optional und Wertübergabe: Hat der Parameter in der Spalte Optional einen Haken, ist die Angabe des Parameters beim Aufruf des Funktionsbausteins nicht zwingend erforderlich. Fehlt der Haken wie im Beispiel, muss dem Parameter beim Aufruf des Funktionsbausteins ein Wert zugewiesen werden.

    Importparameter des Funktionsbausteins

    Abbildung 13.14    Importparameter des Funktionsbausteins

    Das Häkchen Wertübergabe steuert, ob das aufrufende Programm den Parameter per Wert oder per Referenz übergibt:

    • Die Übergabe per Wert bedeutet, dass der Funktionsbaustein beim Aufruf eine Kopie des übergebenen Parameterwertes aus dem aufrufenden Programm besitzt. Mit dieser Kopie kann der Funktionsbaustein intern beliebig arbeiten und sie verändern, ohne das aufrufende Programm zu beeinflussen.

    • Die Übergabe per Referenz bedeutet, dass der Funktionsbaustein Zugriff auf tatsächliche Datenobjekte des aufrufenden Programms erhält. Damit entfällt der Kopiervorgang (den das System aber als Optimierungsmaßnahme ohnehin nur ausführt, falls und wenn der übergebene Parameter verändert wird). Ein Referenzparameter ist innerhalb des gerufenen Funktionsbausteins gegen Überschreiben geschützt, um unerwünschte Nebeneffekte zu vermeiden.

  • Export
    Die Registerkarte Export (siehe Abbildung 13.15) zeigt die Parameter, die der Funktionsbaustein dem rufenden ABAP-Report zur Verfügung stellt. Ist die Registerkarte leer, stellt der Funktionsbaustein dem rufenden ABAP-Report keine Werte zur Verfügung. Im vorliegenden Fall wird ein Parameter zurückgeliefert.

    Exportparameter des Funktionsbausteins

    Abbildung 13.15    Exportparameter des Funktionsbausteins

  • Changing
    Die Registerkarte Changing (siehe Abbildung 13.16) enthält Parameter, die zwischen rufendem ABAP-Report und Funktionsbaustein gleichzeitig als Import- und als Exportparameter dienen. Beim Aufruf des Funktionsbausteins werden die Werte vom rufenden Programm an den Funktionsbaustein übergeben, während der Ausführung des Funktionsbausteins eventuell verändert und am Ende des Funktionsbausteins wieder zurück an das rufende Programm übermittelt. Ist die Registerkarte leer, gibt es keine Datenschnittstelle für solche Parameter.

    Changing-Parameter des Funktionsbausteins

    Abbildung 13.16    Changing-Parameter des Funktionsbausteins

  • Tabellen
    Auf der Registerkarte Tabellen (siehe Abbildung 13.17) werden die internen Tabellen gezeigt, die der Funktionsbaustein sowohl als Import- als auch als Exportparameter nutzt. Wichtig ist wieder, ob die Zuweisung einer internen Tabelle zwingend oder optional ist. Falls diese Registerkarte wie in diesem Beispiel ebenfalls leer ist, verfügt der Funktionsbaustein über keine solchen internen Tabellen.

    Übergabe von internen Tabellen im Funktionsbaustein

    Abbildung 13.17    Übergabe von internen Tabellen im Funktionsbaustein

  • Ausnahmen
    Die Einträge auf der Registerkarte Ausnahmen (siehe Abbildung 13.18) bilden die definierten Fehlerausgänge des Funktionsbausteins ab. Sie sehen, welche Fehlerfälle vorgesehen sind; die vorgesehenen Fehlerfälle werden vom rufenden Programm über den Returncode SY-SUBRC abgefragt und ausgewertet. Im aktuellen Beispiel weist diese Registerkarte einige Ausnahmen auf, für die jeweils eine Fehlerbehandlung durch das ABAP-Programm vorgesehen werden kann.

[»]  Schlichter Funktionsbaustein

Für den Einstieg in ABAP ist die Schnittstelle dieses Funktionsbausteins relativ gut geeignet: Sie ist unkompliziert, hat keine internen Tabellen, wenige Parameter und eine überschaubare Fehlerbehandlung. Sie können sich aber bestimmt schon denken, dass nicht alle Funktionsbausteinschnittstellen so schlicht konstruiert sind – dies werden Sie in einem späteren Beispiel noch sehen.

Parameter für Ausnahmen des Funktionsbausteins

Abbildung 13.18    Parameter für Ausnahmen des Funktionsbausteins

Falls Sie davon ausgehen, dass dieser Funktionsbaustein Ihrer Meinung nach die zugedachte Aufgabe erledigen könnte, sollten Sie im nächsten Schritt vorsichtshalber diesen Funktionsbaustein in einer Testumgebung ausprobieren, um zu überprüfen, ob er auch wirklich so funktioniert, wie Sie sich das vorstellen. Sie klicken hierzu den Button Testen/Ausführen an (inline image, siehe Abbildung 13.19) und gelangen in die Testumgebung des Function Builders (siehe Abbildung 13.20).

Testumgebung des Function Builders aufrufen

Abbildung 13.19    Testumgebung des Function Builders aufrufen

Importparameter testen

Abbildung 13.20    Importparameter testen

Beim Parameter PROGRAM geben Sie den Pfadnamen zu einem lokalen Programm ein, beim Parameter COMMANDLINE die zu öffnende Datei. Die anderen Parameter bleiben leer; sie werden für unsere Zwecke nicht benötigt.

In diesem Beispiel soll der Adobe Acrobat Reader gestartet werden, um die Datei TEST.PDF zu öffnen – mit dem Ausführen-Button (inline image) starten Sie den Test. Nach einer Rückfrage des Systems, ob der Parameter OUT_FILE wirklich leer bleiben soll, öffnet sich der Acrobat Reader mit der gewünschten Datei.

[»]  Pfadname kann genügen

Wenn Sie den Funktionsbaustein noch ein wenig testen, werden Sie merken, dass es auch genügt hätte, beim Parameter PROGRAM den Pfadnamen zur Datei C:\TEMP\TEST.PDF einzugeben; die anderen Parameter könnten leer bleiben. Dies funktioniert aber nur, wenn über das lokale Betriebssystem – bei Windows über die Registry – die Dateiendung, d. h. das Suffix, sauber mit dem entsprechenden Programm verknüpft ist und das lokale Betriebssystem »weiß«, dass es eine PDF-Datei immer mit dem Acrobat Reader öffnen soll.

Die Funktionsweise ist bei jedem lokalen Programm die gleiche. Wichtig ist nur, dass die Verzeichnisse vorhanden sind und die Programmnamen bzw. die Dateinamen stimmen. (Gleichen Sie diese gegebenenfalls an die für Ihren Rechner passenden Bezeichnungen an.) Auch Netzlaufwerke und Netzwerkpfade sind adressierbar, vorausgesetzt, Sie verfügen über die notwendigen Lese- und Schreibrechte.

Sind Sie nach dem Test überzeugt, dass der geprüfte Funktionsbaustein für Ihre Anforderung geeignet ist, binden Sie ihn in den ABAP-Quellcode ein. Am sichersten ist es, wenn Sie sich dabei vom System unterstützen lassen. Positionieren Sie hierzu den Cursor an die Stelle im Quellcode, an der Sie den Funktionsbaustein aufrufen möchten, und klicken Sie auf die Schaltfläche Muster (siehe Abbildung 13.21).

Muster in ABAP-Quellcode einfügen

Abbildung 13.21    Muster in ABAP-Quellcode einfügen

Im Dialogbildschirm Muster einfügen markieren Sie die Option CALL FUNCTION und tragen den Namen des einzufügenden Funktionsbausteins ein; hier ist es der getestete Funktionsbaustein WS_EXECUTE (siehe Abbildung 13.22). Anschließend klicken Sie auf den Weiter-Button (inline image).

Funktionsbaustein über Muster einfügen

Abbildung 13.22    Funktionsbaustein über Muster einfügen

Das System trägt nun (nachdem es den Hinweis darauf, dass der Funktionsbaustein als obsolet gekennzeichnet ist, zu Recht nicht unterlassen konnte) den vollständigen Aufruf des Funktionsbausteins mit allen Parametern, Tabellen und Ausnahmen in den ABAP-Quellcode ein; optionale Angaben werden hierbei, mit Sternchen versehen, kommentiert.

CALL FUNCTION 'WS_EXECUTE'
EXPORTING
document
cd
commandline
...
.

Wie Sie sehen, wird ein Funktionsbaustein mit der Anweisung CALL FUNCTION und seinem Namen aufgerufen. Der Name wird als Literal angegeben; die Buchstaben im Literal müssen Großbuchstaben sein. Statt des Literals könnten Sie aber auch eine Variable verwenden.

Die Anweisung CALL FUNCTION kann sehr umfangreich sein. Durch zahlreiche Parameter, Tabellen und Ausnahmen kann das Kommando eine gesamte Bildschirmseite füllen; es endet aber immer mit einem Punkt. Dies klingt an dieser Stelle zwar trivial, kann aber trotzdem ein Stolperstein sein, weil das System den Punkt in einer eigenen Zeile einfügt und dieser dann leicht übersehen wird. Falls Sie das stört, müssen Sie den Punkt entsprechend anders positionieren.

[»]  Import – Export, Export – Import

Noch eine weitere Bemerkung, die ebenfalls banal klingt: Die Sicht der Dinge ist unterschiedlich. Was für den Funktionsbaustein ein Import ist, ist für unser ABAP-Programm ein Export. Deshalb stehen die Importparameter des Funktionsbausteins im ABAP-Quellcode bei den Exportparametern. Die Exportparameter eines Funktionsbausteins befinden sich umgekehrt bei den Importparametern Ihres ABAP-Quellcodes. Dies werden Sie bei einem anderen Beispiel aber noch genauer sehen.

Obligatorische Parameter müssen immer eine Wertzuweisung erhalten. Dies ist bei dem vorliegenden Baustein für keinen Parameter der Fall, denn sie sind alle als optional gekennzeichnet (siehe Abbildung 13.14). Weisen Sie im Beispiel dem Parameter COMMANDLINE den Pfadnamen der zu öffnenden Datei als Literal zu. Beim Parameter PROGRAM tragen Sie den Pfadnamen des zu startenden Programms als Literal ein:

CALL FUNCTION 'WS_EXECUTE'
EXPORTING
commandline = 'C:\TEMP\TEST.PDF'
program = 'C:\Program Files (x86)\Adobe\Reader 11.0\
Reader\AcroRd32.exe'
.

Natürlich können Sie anstelle einer PDF-Datei auch eine beliebige andere Datei auf Ihrem Präsentationsserver öffnen, z. B. ein Textdokument. Bei der Schreibweise des Beispiels muss nur die Verknüpfung der Dateiendung mit dem Anwendungsprogramm korrekt sein. Versuchen Sie ruhig auch andere Kombinationen, und experimentieren Sie mit Ihren lokalen Programmen und Dateien.

Funktionsbaustein zum Download einer internen Tabelle

Um das anfängliche Such- und Auswahlverfahren abzukürzen, nehmen wir an, dass Sie sich für den Funktionsbaustein WS_DOWNLOAD entschieden haben. Dieser Funktionsbaustein hat eines mit dem Funktionsbaustein WS_EXECUTE gemeinsam: Auch er ist als obsolet gekennzeichnet und sollte normalerweise nicht mehr in neuen Programmen verwendet werden. Auch für ihn gilt, dass die Klasse CL_GUI_FRONTEND_SERVICES zukünftig seine Funktion übernimmt, und auch ihn werden wir ausnahmsweise verwenden, da wir bei der Demonstration zu Lehrzwecken etwas großzügiger sein können als in einem echten Projekt. (Als Alternative steht Ihnen übrigens der Funktionsbaustein GUI_DOWNLOAD zur Verfügung, der den von uns verwendeten Baustein als Nachfolger beerbt und nicht als obsolet gekennzeichnet ist. Für unser Beispiel ist WS_DOWNLOAD jedoch ausreichend.)

Der Funktionsbaustein ist hinsichtlich seiner Parameter etwas aufwendiger. Bereits auf der Registerkarte Import sehen Sie eine Vielzahl von (wieder durchgehend optionalen) Parametern (siehe Abbildung 13.23). An Informationen zu den einzelnen Parametern gelangen Sie jeweils über den Button in der Spalte Langtext (inline image). Eine Beschreibung des Funktionsbausteins mit Aufrufbeispielen erhalten Sie über den Button Fbausteindokumentation.

Importparameter des Funktionsbausteins

Abbildung 13.23    Importparameter des Funktionsbausteins

Der Funktionsbaustein WS_DOWNLOAD ist vorbildlich dokumentiert. Nehmen Sie sich einen Moment Zeit und genießen Sie den Luxus, jeden Parameter dokumentiert vorzufinden, denn dies wird Ihnen in Ihrer Karriere als SAP-Programmierer nicht oft widerfahren.

Wünschen Sie beispielsweise nähere Informationen zum Parameter FILETYP, klicken Sie in dessen Zeile auf die Schaltfläche Anzeigen (inline image) in der Spalte Langtext. Im Langtext sehen Sie dann die möglichen Werte und Wirkungen für diesen Parameter (siehe Abbildung 13.24). Entsprechend verfahren Sie mit den Parametern, Tabellen und Ausnahmen der anderen Registerkarten.

Langtext zum Importparameter FILETYPE des Funktionsbausteins WS_DOWNLOAD

Abbildung 13.24    Langtext zum Importparameter FILETYPE des Funktionsbausteins WS_DOWNLOAD

Prüfen Sie, welcher Funktionsbaustein für Ihre Anforderungen am besten geeignet scheint. Wie Sie an den beiden Beispielen GUI_DOWNLOAD und WS_DOWNLOAD erkennen können, bestehen Unterschiede bezüglich der Menge und Qualität der mitgelieferten Dokumentation und insbesondere bezüglich des Beispielcodes, der Ihnen bei der schnellen Einbindung des Funktionsbausteins hilft.

Das Einfügen des Funktionsbausteinaufrufs in den ABAP-Quellcode führen Sie am einfachsten wieder über die Schaltfläche Muster durch; der eingefügte Aufruf sieht dann wie in Listing 13.1 aus.

  CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
* bin_filesize = ' '
* codepage = ' '
* filename = ' '
* filetype = ' '
* mode = ' '
* ...
* IMPORTING
* filelength = ' '
TABLES
data_tab = itab04
* fieldnames =
* EXCEPTIONS
* file_open_error = 1
* file_write_error = 2
* invalid_filesize = 3
* invalid_type = 4
* no_batch = 5
* unknown_error = 6
* invalid_table_width = 7
* gui_refuse_filetransfer = 8
* customer_error = 9
* no_authority = 10
* OTHERS = 11
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
WRITE: /
'Download itab04 auf lokale Datei misslungen,
sy-subrc =', sy-subrc.
ENDIF.

Listing 13.1    Funktionsbaustein WS_DOWNLOAD

Sie sehen, dass der Aufruf etwas umfangreicher ist. Optionale Parameter sind als Kommentare mit Sternchen versehen. Möchten Sie diese nutzen, müssen Sie die Kommentarzeichen entfernen und die Parameter mit Werten versorgen (siehe Listing 13.2).

  CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
* BIN_FILESIZE = ' '
filename = locfile
filetype = 'DAT'
mode = ' '
* IMPORTING
* FILELENGTH =
TABLES
data_tab = itab04
EXCEPTIONS
file_open_error = 1
file_write_error = 2
invalid_filesize = 3
invalid_type = 4
no_batch = 5
unknown_error = 6
invalid_table_width = 7
gui_refuse_filetransfer = 8
customer_error = 9
no_authority = 10
OTHERS = 11
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
WRITE: /
'Download itab04 auf lokale Datei misslungen,
sy-subrc =', sy-subrc.
ENDIF.

Listing 13.2    Mit Übergabewerten gefüllter Funktionsbaustein WS_DOWNLOAD

Im Beispiel geben Sie bei den Exportparametern für den Namen der lokalen Datei eine Variable an, die den Namen enthält. Der Dateityp soll DAT lauten für Tabellenkalkulationsprogramme. Falls die Datei schon existiert, soll sie überschrieben werden, und die Spalten sollen durch ein Tabulatorzeichen getrennt sein. Bei den Tabellenparametern setzen Sie wieder die interne Tabelle ITAB04 ein.

[»]  Fehlerbehandlung

Interessant ist die Ausnahmebehandlung. Dieser Funktionsbaustein hat elf verschiedene Fehlerausgänge sowie einen allgemeinen Fehlerausgang und liefert Vorschlagswerte für diese Fehlerausgänge – z. B. die 1, falls es beim Schreiben der Datei auf dem Präsentationsserver Probleme gibt. Dies könnte beispielsweise der Fall sein, wenn die Datei in diesem Moment bereits von einem anderen Programm geöffnet ist.

Diese Vorschlagswerte können Sie bei Bedarf ändern. In jedem Fall werden sie als Returncode in SY-SUBRC eingetragen. Den Inhalt von SY-SUBRC fragen Sie unmittelbar nach der Anweisung CALL FUNCTION ab und werten ihn aus. Deshalb wird bereits beim Einfügen des Musters die IF-Struktur für die Fehlerbehandlung mit eingefügt; wie Sie die Fehlerbehandlung gestalten, bleibt allerdings Ihnen überlassen. Statt der IF-Struktur ist bei Bedarf natürlich auch eine CASE-Struktur einsetzbar.

 
Zum Seitenanfang

13.3.3    ABAP-Klassen Zur vorigen ÜberschriftZur nächsten Überschrift

Seit der Einführung von ABAP Objects ist die Sprache ABAP auch objektorientiert. Damit können zur Modularisierung neben prozeduralen (Funktionsbausteine) auch objektorientierte Konstrukte (Klassen) verwendet werden.

Klassen und Funktionsgruppen

Tatsächlich ähnelt eine Klasse in vieler Hinsicht einer Funktionsgruppe:

  • Eine Funktionsgruppe ist ein Hauptprogramm mit globalen Variablen, die nicht erlöschen, wenn einer ihrer Funktionsbausteine durchlaufen wurde – die Funktionsgruppe besitzt einen inneren Zustand, der erst verfällt, wenn das aufrufende Programm vollständig verarbeitet ist. Ähnlich besitzt eine Klasse Klassenattribute (Variablen) und damit einen internen Zustand.

  • Die Funktionsbausteine einer Funktionsgruppe entsprechen den Methoden einer Klasse: So wie logisch und funktional zusammengehörende Funktionsbausteine in einer Funktionsgruppe gebündelt werden, gehören auch die Methoden einer Klasse zusammen und operieren gemeinsam auf Basis eines internen Zustands.

Doch es gibt natürlich auch Abweichungen:

  • Objektinstanzen
    Der wichtigste Unterschied ist der, dass eine Klasse nicht nur einen Zustand besitzt, sondern von ihr beliebig viele unabhängige Kopien – Objektinstanzen, Objekte oder Instanzen genannt – erzeugt werden können. Jedes Objekt kann separat angesprochen werden und besitzt (und sieht ausschließlich) seinen eigenen Zustand.

    Stellen Sie sich einfach eine Klasse namens »Mitarbeiter« vor. Von dieser Klasse kann Ihr Programm so viele Objekte erzeugen, wie es Mitarbeiter gibt. Jedes Objekt der Klasse »Mitarbeiter« hat seine eigenen Werte für die Variablen (bei Klassen spricht man genau genommen von Attributen) Name, Geburtsdatum, Laufbahnstufe, Gehalt und Abteilung. Die Methoden der Klasse »Mitarbeiter« beschreiben die Operationen, die Sie für einen Mitarbeiter ausführen können: bearbeiten, Gehalt abrechnen, Resturlaub berechnen etc.

  • Sichtbarkeit
    Für jeden Bestandteil einer Klasse (alle Attribute und Methoden) können Sie die Sichtbarkeit festlegen. Damit können Sie steuern, ob z. B. eine Methode außerhalb der Klasse aufrufbar sein soll (PUBLIC) oder ob sie ausschließlich intern innerhalb der Klasse zur Verfügung steht (PRIVATE und PROTECTED). Indem Sie alle internen Methoden, deren Aufruf von außen keinen Sinn ergeben würde, vor der Außenwelt verstecken, machen Sie es anderen Programmierern viel leichter, Ihre – nun sehr viel übersichtlichere – Klassenschnittstelle zu verwenden.

  • Scope
    Jede Methode besitzt einen Scope: Sie ist entweder eine Instanzmethode oder eine Klassenmethode (auch statische Methode genannt). Instanzmethoden werden immer in Bezug auf eine einzelne Objektinstanz aufgerufen. Das bedeutet, dass Sie eine Instanzmethode nur aufrufen können, wenn Sie aktuell Zugriff auf eine Objektinstanz der Klasse haben. Eine solche Methode wäre im Beispiel der Klasse »Mitarbeiter« in Bezug auf einen einzelnen Mitarbeiter sinnvoll, etwa die Methode »Resturlaub berechnen«.

    Klassen- oder statische Methoden werden nicht in Bezug auf eine einzelne Objektinstanz aufgerufen und setzen daher auch nicht das Vorhandensein einer Instanz voraus. Klassenmethoden haben häufig einen übergreifenden Charakter und können sich z. B. auf die Gesamtheit aller Objektinstanzen beziehen (Beispiele: Start des Gehaltsabrechnungslaufs, Liste aller Mitarbeiter liefern) oder zum Erzeugen, Löschen oder Zusammenführen von Objektinstanzen dienen.

    Gleiches gilt für die an einer Klasse definierten Attribute: Sie sind entweder Klassenattribute und damit übergreifend gültig oder Instanzattribute, die für jede Objektinstanz einen anderen Wert annehmen können.

[+]  Für den tieferen Einstieg in die Objektorientierung

Eine ausführliche Darstellung der objektorientierten Programmierung würde den Rahmen dieses Buches deutlich überschreiten. Falls Sie nicht bereits durch Ihre Erfahrungen in einer anderen Programmiersprache zum Kenner der objektorientierten Programmierung geworden sind, empfehlen wir Ihnen das Buch Object-Oriented Programming with ABAP Objects von James Wood (2. Auflage, SAP PRESS 2015).

Globale und lokale Klassen

Globale und lokale Klassen stehen zueinander ähnlich wie Funktionsbausteine und Unterprogramme:

  • Globale Klassen sind wie Funktionsbausteine systemweit verfügbar und können in jedem Programm aufgerufen werden.

  • Lokale Klassen werden innerhalb eines Programms definiert und stehen auch nur innerhalb dieses Programms zur Verfügung.

Eine lokale Klasse ist sinnvoll, wenn die von ihr erfüllten Aufgaben sehr spezifisch für das sie umgebende Programm sind und ihre Verwendung außerhalb dieses Zusammenhangs durch andere Programme nicht gewünscht ist. Eine solche Spezialklasse, die lokale Hilfsarbeiten übernimmt, nennt man auch eine Helferklasse. Soll die Funktionalität Ihrer Klasse auch anderen Programmen zur Verfügung stehen, sollten Sie sie als globale Klasse anlegen.

Class Builder

Globale Klassen erstellen und verwalten Sie im Class Builder. Sie erreichen den Class Builder über SAP MenüWerkzeugeABAP WorkbenchEntwicklungClass Builder oder über Transaktion SE24.

Um nach Klassen zu suchen, gehen Sie genau so vor wie im Function Builder. Sehen Sie sich beispielhaft eine Klasse an. Geben Sie dazu den Namen der Klasse CL_GUI_FRONTEND_SERVICES ein (siehe Abbildung 13.25), oder suchen Sie die Klasse über das Infosystem. Klicken Sie anschließend auf Anzeigen, um die Klasse näher zu untersuchen.

Einstieg in den Class Builder

Abbildung 13.25    Einstieg in den Class Builder

Die wichtigste Registerkarte listet die Methoden der ABAP-Klasse auf. Jede Methode ist eine aufrufbare Prozedur, von denen jedoch nicht jede zur Verfügung steht: Nur Methoden mit der Sichtbarkeit PUBLIC können von außerhalb der Klasse aufgerufen werden.

Hier erkennen Sie auch, welche Methoden als statische Methoden und welche als Instanzmethoden gekennzeichnet sind (siehe Abbildung 13.26). Erstere können übergreifend, letzte nur in Bezug auf eine Objektinstanz aufgerufen werden.

Methoden einer Klasse

Abbildung 13.26    Methoden einer Klasse

[+]  Darstellung anpassen

Falls die Darstellung bei Ihnen abweicht oder Sie diese Darstellung nicht übersichtlich genug finden, können Sie sie über den Menüpfad HilfsmittelEinstellungen an Ihre Bedürfnisse anpassen. Bei Klassen, die Sie nur verwenden, aber nicht selbst bearbeiten möchten, ist es beispielsweise sinnvoll, alle privaten Komponenten auszublenden und nur die nach außen sichtbaren Methoden und Attribute anzuzeigen (siehe Abbildung 13.27).

Anzeigeeinstellungen im Class Builder

Abbildung 13.27    Anzeigeeinstellungen im Class Builder

Sehen Sie sich nun eine bestimmte Methode genauer an. Scrollen Sie durch die Liste der Methoden, bis Sie die Methode EXECUTE finden. Die Methode ist statisch (benötigt daher keine Objektinstanz) und öffentlich (PUBLIC), d. h. sie kann von außerhalb der Klasse aufgerufen werden.

Markieren Sie die Methode mit einem einfachen Mausklick, und klicken Sie auf Parameter. Ähnlich wie zuvor im Function Builder sehen Sie nun eine Übersicht über die Parameter dieser Methode (siehe Abbildung 13.28).

Methodenparameter

Abbildung 13.28    Methodenparameter

Die Methode EXECUTE erlaubt es, ein Programm auf dem Präsentationsserver auszuführen oder ein Dokument aufzurufen. Um die Methode zu testen, wählen Sie im Menü KlasseTesten. Die nun folgenden Vorschlagswerte für das Ersetzen generischer Parametertypen können Sie blind übernehmen, indem Sie auf Weiter (inline image) klicken.

Es erscheint eine Sicht auf alle verfügbaren Komponenten der Klasse. Da keine Objektinstanz existiert, werden nur statische Attribute und Methoden angezeigt, und da Sie die Klasse »von außen« sehen, werden Ihnen nur die öffentlichen Komponenten gezeigt. Neben den Methoden befindet sich jeweils das Ausführen-Icon (inline image). Klicken Sie auf das Icon zum Ausführen neben der Methode EXECUTE (siehe Abbildung 13.29).

Tragen Sie nun die gleichen Werte ein wie im vorangegangenen Beispiel, bei dem Sie ein PDF-Dokument im Acrobat Reader geöffnet haben, und klicken Sie auf Ausführen (siehe Abbildung 13.30). War der Aufruf erfolgreich, können Sie den nächsten Schritt in Angriff nehmen und den Aufruf in ein ABAP-Programm einbauen.

Klasse CL_GUI_FRONTEND_SERVICES testen

Abbildung 13.29    Klasse CL_GUI_FRONTEND_SERVICES testen

Parameter für den Test übergeben

Abbildung 13.30    Parameter für den Test übergeben

Im ABAP Editor rufen Sie wieder die Funktion Muster einfügen auf, wählen im folgenden Dialog (siehe auch Abbildung 13.22) die Option Muster zu ABAP Objects und klicken auf den Weiter-Button (inline image). Im Dialogbildschirm OO-Anweisungsmuster geben Sie nun den Namen der Klasse und Methode an, die Sie aufrufen möchten, und klicken auf den Weiter-Button (inline image).

Wie zuvor beim Muster für den Funktionsbaustein erzeugt das System nun das Coding für den Aufruf der Methode, wobei optionale Angaben wieder, mit Sternchen versehen, als Kommentar eingetragen sind.

CALL METHOD cl_gui_frontend_services=>execute
EXPORTING
document =
application =
...
.

Anders als der zuvor genutzte Funktionsbaustein erwartet die Methode, dass Sie entweder den Parameter document oder application füllen, aber nicht beide. Sie entscheiden sich für die Angabe des Pfads zum Dokument:

CALL METHOD cl_gui_frontend_services=>execute
EXPORTING
document = 'C:\TEMP\TEST.PDF'.

Damit ist der Aufruf vollständig. Sie können nun neben den Funktionsbausteinen des SAP-Standards auch seine globalen Klassen verwenden (auch wenn Sie momentan noch darauf beschränkt sind, statische Methoden aufzurufen).

Lokale Klassen

Lokale Klassen werden nicht im Class Builder, sondern ausschließlich über ABAP-Schlüsselwörter definiert. Sie werden innerhalb eines Programms entwickelt und sind – ebenso wie die in diesem Programm definierten Unterprogramme, Datentypen und globalen Variablen – nur innerhalb des Programms zugänglich.

Das umgebende Programm kann ein ABAP-Report, eine Funktionsgruppe oder auch ein Class Pool (das Hauptprogramm einer globalen Klasse) sein. Die lokale Klasse fristet damit gewissermaßen ein bescheidenes Dasein als Anhängsel eines anderen Programms und dient in der Regel dazu, als Helferklasse kleinere Routineaufgaben für dieses Programm zu erledigen.

Programmierer, die die objektorientierte Programmierung der in der ABAP-Welt häufig anzutreffenden rein prozeduralen Programmierung vorziehen, verwenden lokale Klassen gern, um innerhalb eines ABAP-Reports so viel Funktionalität wie möglich in Klassen zu verpacken. Durch die Nutzung objektorientierter Prinzipien wie abgestufter Sichtbarkeitsbereiche können sie so eine transparentere Programmstruktur erreichen.

Definition und Implementierung werden einfach in den Programmcode eingebettet. Dabei sollte die Definition zu Anfang des Programms – bei den Typdefinitionen – eingebettet werden und die Implementierung am Ende – bei den Unterprogrammen – ihren Platz finden:

CLASS lcl_my_local_class DEFINITION.
PUBLIC SECTION.
CLASS-METHODS main.
ENDCLASS.
CLASS lcl_my_local_class IMPLEMENTATION.
METHOD main.
WRITE: / 'Hello World!'.
ENDMETHOD.
ENDCLASS.

Im Hauptteil des Programms, beispielsweise zum Zeitpunkt START-OF-SELECTION, können Sie nun auf die Funktionalität der Klasse zugreifen:

START-OF-SELECTION.
CALL METHOD lcl_my_local_class=>main( ).

Auch wenn wir dieses Thema gern weiter vertiefen würden: Eine praktische Einführung in die Objektorientierung würde den Rahmen dieses Buches deutlich überschreiten. Sollten Sie bereits in einer anderen Programmiersprache Erfahrung mit objektorientierter Programmierung gesammelt haben, konnte Ihnen dieses Beispiel hoffentlich als Einstieg in die Besonderheiten in ABAP dienen. Anderenfalls weisen wir noch einmal auf die Buchempfehlung zu Beginn dieses Abschnitts hin.

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Einstieg in ABAP Einstieg in ABAP
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: SAP – Der technische Einstieg
SAP – Der technische Einstieg


Zum Rheinwerk-Shop: ABAP Objects – Das umfassende Handbuch
ABAP Objects – Das umfassende Handbuch


Zum Rheinwerk-Shop: ABAP-Entwicklung für SAP S/4HANA
ABAP-Entwicklung für SAP S/4HANA


Zum Rheinwerk-Shop: Kundeneigene Erweiterungen mit ABAP
Kundeneigene Erweiterungen mit ABAP


Zum Rheinwerk-Shop: Schrödinger programmiert ABAP
Schrödinger programmiert ABAP


Zum Rheinwerk-Shop: Migration nach SAP S/4HANA
Migration nach SAP S/4HANA


Zum Rheinwerk-Shop: Design Thinking mit SAP
Design Thinking mit SAP


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2020
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
[Rheinwerk]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern