Der perfekte Einstieg in ABAP – ABAP-Cheatsheet

Du möchtest ABAP lernen und einen perfekten Einstieg in ABAP haben? Hier habe ich Dir die wichtigsten ABAP-Elemente kurz und knapp zusammengefasst. Gerade, wenn Du bereits Erfahrungen mit SAP ERP und einer anderen Programmiersprache hast, ist dieser Artikel perfekt für Dich.

Dieser Artikel kann auch als Cheatsheet benutzt werden. Das heißt, wenn Du einmal eine paar Elemente nachlesen möchtest.

Zudem hinaus sollte man einen guten Programmierstil besitzen. Es ist wichtig, ABAP effizient und performant einzusetzen. Die besten ABAP-Tricks beim Entwickeln erfährst Du in diesem Artikel.

Wichtige Transaktionen für ABAP-Entwicklung

TransaktionscodeBezeichnung
SE11ABAP Dictionary
SE38ABAP Editor
SE37Function Builder
SE24Class Builder
SE41Menu Painter
SE51Screen Painter
SE80Object Navigator
/NEXAbmeldung ohne Sicherheitsabfrage

ABAP Dictionary – SE11

In der Transaktion SE11 rufst Du das ABAP Dictionary auf. Hier kannst Du die wichtigsten ABAP-Objekte für die Programmierung erstellen. Unter anderem sind das folgende: Tabellen, Datentypen, Domänen, Suchhilfen, Strukturen, etc.

In der Transaktion SE11 rufst Du das ABAP Dictionary auf. Hier kannst Du die wichtigsten ABAP-Objekte für die Programmierung erstellen. Unter anderem sind das folgende: Tabellen, Datentypen, Domänen, Suchhilfen, Strukturen, etc.

Vor allem sollte man sich immer den Unterschied zwischen einem Datentyp und einer Domäne vor Augen halten.

Domäne = technische Eigenschaften (z.B. Wertebereiche von Datenelementen) (technisches Attribut)

Datentyp = semantische Eigenschaften von Attribut, verweist immer auf eine Domäne (betriebswirtschaftliches Attribut)

Im ABAP-Code greift man auf ein Attribut oder ein Feld einer Tabelle über folgende Syntax zu: TabellennameFeldname

Du kannst eine F4-Hilfe definieren über eine Suchhilfe oder Domäne > Einzelwerte, Intervall oder Wertetabelle (bevorzugt).

In einer Tabelle kannst Du Einträge erfassen über die Transaktion SE16 oder im ABAP Dictionary in der Tabelle über “Hilfsmittel > Tabelleninhalt > Einträge erfassen“.

Beachte, dass NULL nicht der initiale Wert einer Variable sein muss.

Programmieren im ABAP Editor – SE38

Jede Anweisung endet mit einem Punkt (.).

DATA lv_string type STRING.

Durch das Schlüsselwort REPORT leitet man ein ausführbares Programm ein. Dieses Schlüsselwort steht vor der ID des Reports. Beachte, dass die ID des Reports im Namensraum des Unternehmens oder mit Y oder Z starten muss. Die Buchstaben A bis X sind für SAP reserviert. Wenn man mit diesen Anfangsbuchstaben einen Report erstellt, so benötigt man einen SAP-Entwicklerschlüssel.

REPORT Z_MUSTER.

Kommentare sind wichtig für die Lesbarkeit und das Verständnis Deines Programms. Mit einem Sternchen (*) am Anfang der Zeile kommentierst Du die komplette Zeile aus und mit Anführungszeichen (“) den Teil der Zeile, der danach folgt.

Tipp: Mit “Strg + <” kannst Du die komplette Zeile oder mehrere markierte Zeilen auskommentieren. Die zeilenweisen Kommentare kannst Du mit “Strg + Umschalt + <” wieder einkommentieren bzw. entfernen.

* Das ist ein Kommentar über die gesamte Zeile
DATA lv_string TYPE string. "Das ist ein Kommentar

Mit dem Wort WRITE kann man eine Zeichenkette ausgeben und dem Benutzer auf der SAP GUI anzeigen.

WRITE / 'Hello World'.
WRITE: / 'Hello ' , 'World'. "Kettensatz
WRITE: / 'Zahl 1:', 30 zahl01. " Zahl01 wird in Spalte 30 ausgegeben

Um Variablen lokal zu definieren, benutzt man das Schlüsselwort DATA. Mit einem Doppelpunkt nach diesem Wort kann man mehrere Variablen getrennt durch ein Komma (,) deklarieren.

DATA: lv_name  TYPE string,
      lv_alter TYPE int.

Wie oben schon zu sehen typisiert man eine Variable mit dem Wort TYPE. Dadurch gibt man den Datentyp oder die Struktur an.

DATA ls_teilnehmer TYPE zteilnehmer. "Workarea

SAP ERP setzt auf eine Datenbank auf. Eine der häufigsten Tätigkeiten als ABAP-Entwickler ist es, Daten von einer Datenbanktabelle zu lesen und korrekt anzuzeigen. Der ABAP-Befehl für das Auslesen einer Datenbanktabelle ist SELECT.

SELECT * FROM zteilnehmer INTO wa_zteilnehmer.
    WRITE / wa_zteilnehmer.
ENDSELECT.

Beim SELECT-Befehl kann man auch gleichzeitig nach dem Primärschlüssel sortieren, in dem man den Zusatz “ORDER BY PRIMARY KEY” benutzt.

SELECT *
       FROM sflight
       WHERE carrid = 'LH' AND
             connid = '0400'
       ORDER BY PRIMARY KEY
       INTO @wa_sflight.
  ...
ENDSELECT.

Möchte man die Ausgabe mit dem WRITE-Befehl übersichtlicher gestalten, eigen sich hierfür die beiden Befehle ULINE und SKIP. ULINE sorgt dafür, dass ein waagrechter Strich erzeugt wird. SKIP erzeugt eine Leerzeile. Man kann nach SKIP auch die Anzahl an Leerzeilen angeben. Im Standard wird eine Leerzeile erzeugt.

ULINE. "Waagrechter Strich
SKIP. "1 Leerzeile
SKIP 3. "3 Leerzeilen

Eines der nützlichsten und für ABAP-Neulinge sehr gewöhnungsbedürftiges Feature von SAP ERP und dem ABAP-Editor ist die Vorwärtsnavigation. Durch Doppelklick auf ein Schlüsselwort wird direkt in die Detailansicht des Schlüsselwortes navigiert. Das erleichter sehr die tägliche Arbeit, da man dadurch schneller die Definition findet oder in eine Detailansicht springen kann.

Im ABAP Editor (Transaktion SE38) oder der ABAP Workbench (Transaktion SE80) kommt man leicht in die Programmausführung über “System > Dienste > Reporting (Programmausführung)“. Man kann diese Transaktion auch direkt über den Transaktionscode SA38 aufrufen. Im ABAP Editor kann man direkt den Report über “Ausführen” oder die F8-Taste testen bzw. ausführen.

Wichtige Schlüsselwörter für Berechnungen

In der Deklaration von Variablen sind weitere wichtige Schlüsselwörter notwendig: TYPE, LIKE, VALUE.

Mit dem Schlüsselwort TYPE ist es möglich, Variablen zu typisieren. Dabei bezieht man sich auf eine Typdefinition. Dabei wird der Datentyp angegeben. Wie bereits erläutert verweist der Datentyp auf eine Domäne, die die technische Definition vorgibt. Zudem hinaus kann man auch elementare Datentyp wie z.B. i, p, c oder n verwenden.

DATA zahl01 TYPE i. "i - Integer (Ganzzahlen)
DATA zahl01 TYPE p DECIMALS 2. "Fließkommazahl mit zwei Nachkommastellen
DATA geschlecht TYPE c LENGHT 1. "Character (Zeichen) fixer Länge, z.B. '   Test   ' , Leerzeichen werden ignoriert --> 'Test'
DATA zeichenkette type string. "Zeichenkette beliebiger Länge

Mit dem Schlüsselwort LIKE ist es möglich, eine Variable basierend auf andere Variablen, Typen oder Konstanten zu typisieren. Anders als bei TYPE bezieht man sich nun auf Datenobjekte.

DATA zahl1 TYPE p DECIMALS 2.
DATA zahl2 LIKE zahl1. "Deklaration von zahl2 ist an Deklaration von zahl1 gebunden

Wenn man direkt bei der Datendefinition auch eine Variable initialisieren möchte, muss man das Schlüsselwort VALUE verwenden. Wenn dieser Wert nicht angegeben wird, erhält die Variable gemäß dem Datentyp den initialen Wert.

DATA zahl1 TYPE i VALUE 1.
DATA zahl2 TYPE p DECIMALS 2 VALUE '1.23'.

Gerade wenn im ABAP-Code einzelne Werte öfters verwendet werden und dabei nicht verändert werden dürfen, sollte man auf Konstanten mit dem Schlüsselwort CONSTANTS zurückgreifen.

CONSTANTS zahl03 TYPE i VALUE 5.

In ABAP werden vier Grundrechnearten sowie die Potenzrechnung unterstützt. Dabei kann man sowohl den Operator als auch das Schlüsselwort verwenden:

OperationOperatorSchlüsselwort
Addition+ADD x TO Y.
SubtraktionSUBTRACT x FROM Y.
Multiplikation*MULTIPLY x BY y.
Division/DIVIDE x BY y.
Ganzzahldivisionx DIV y.
Modulox MOD y.
Potenzieren**

Es gibt in ABAP kompatible und konvertible Attribute. Kompatible Attribute besitzen die gleichen technischen Eigenschaften und konvertible Attribute sind verträgliche Attribute, die umgewandelt werden müssen. Mit dem Schlüsselwort COMPUTE kann man konvertible Attribute umwandeln. Meistens wird das vom System intern bereits hinzugefügt und muss vom ABAP-Entwickler nicht mehr durchgeführt werden.

COMPUTE ergebnis = zahl1 + zahl2 "COMPUTE ist optional und wird vom System automatisch generiert

Bei der Ausgabe wird die Ausgabeposition entweder durch den Listen-Cursor oder mit dem Schlüsselwort UNDER definiert.

WRITE: / 'Zahl1' , zahl1, / 'Zahl2', zahl2 UNDER zahl1.

Systemstruktur sy bzw. syst

Die Systemstruktur sy bzw. syst wird sehr häufig in ABAP-Programmen verwendet. Denn hier werden zur Laufzeit wichtige Informationen gespeichert. Das Feld sy-subrc speichert zur Laufzeit den Erfolg einer Ausführung. So kann man einfach und leicht prüfen, ob z.B. eine Selektion erfolgreich verlaufen ist.

Im ABAP Dictionary (Transaktion SE11) kannst Du über “Datentyp > SYST” die Attribute von SYST einfach und bequem anzeigen lassen. Eine Übersicht der wichtigsten Felder liefere ich Dir hier:

AttributBeschreibung
sy-subrcStatuscode des letzten Befehls. 0 für erfolgreiche Ausführung
sy-datloLokales Datum des SAP-Benutzers
sy-datumSystemdatum des SAP-Applikationsservers
sy-hostName des SAP-Applikationsservers
sy-indexIndex des Schleifendurchlaufs
sy-languSprache des SAP-Benutzers
sy-mandtMandant
sy-tcodeTransaktionscode
sy-uzeitUhrzeit des SAP-Anwendungsservers
sy-unameSAP-Benutzername
sy-lsindIndex der Listenebene
sy-tabixIndex der letzten (gelesenen) Zeile einer internen Tabelle
sy-timloLokale Uhrzeit des SAP-Benutzers

Zeichenketten verändern – Die wichtigsten Operationen

Eine Zeichenkette mit dem Datentyp STRING ist eine der am meisten verwendete Datentyp im gesamten ABAP. Der große Vorteil besteht darin, dass man nicht zur Designtime, also während dem Entwickeln festlegen muss wie groß die Zeichenkette sein muss. Das ist gerade für den Entwickler angenehm. Zudem liefert ABAP mit einer großen Anzahl an Operationen mit denen man die Zeichenkette verändern kann.

Durch das Schlüsselwort SHIFT kann man eine Zeichenkette verschieben. Vor allem ist dieses Schlüsselwort nützlich, wenn man führende 0en entfernen möchte.

SHIFT telefon LEFT DELETING LEADING '0'. " Führende Nullen löschen und Zeichenkette nach links verschieben
SHIFT feld LEFT DELETING LEADING SPACE. " Führende Leerzeichen löschen
SHIFT telefon BY 2 PLACES RIGHT. "Zeichenkette um 2 Stellen nach rechts verschieben

Möchte man in einer Zeichenkette Zeichen oder ganze Wörter ersetzen, so verwendet man das Schlüsselwort REPLACE.

REPLACE ` ` IN telefon_international WITH national_vorwahl. "Datentyp string muss wegen Leerzeichen verwendet werden

Um überflüssige Leerzeichen zu entfernen, eignet sich CONDENSE.

CONDENSE telefon.
CONDENSE telefon NO-GAPS. "Entfernt alle vorkommenden Leerzeichen

Eine der am meisten verwendete Operationen ist die Zusammenschließung von Textfeldern mit CONCATENATE.

CONCATENATE vorwahl_int vorwahl_nat telefon INTO telefon_int.
CONCATENATE vorwahl_int vorwahl_nat telefon INTO telefon_int SEPERATED BY '-'. " Textfelder werden zusammengefügt und mit '-' getrennt

Wenn in einer Zeichenkette ein Muster zu erkennen ist, kann man mit SPLIT einen bestimmten Textabschnitt aus einer Zeichenkette herausschneiden.

SPLIT telefon_int AT '-' INTO  vorwahl_int vorwahl_nat telefon.

Enorm nützlich und ebenfalls oft angewendet ist das direkte Positionieren in einer Zeichenkette. Wenn man die genaue Position eines Wortes oder Zeichens in einer Zeichenkette kennt, kann man dadurch das Wort leicht ermitteln. So möchte man z.B. den Buchungskreis oder die Belegnummer aus dem Objektschlüssel ermitteln und weiß, dass der Aufbau des Objektschlüssels definiert und immer gleich ist. Direkt nach der Zeichenkette gibt man mit der Zahl hinter dem Plus-Zeichen (+) den Index an, ab dem der Substring ermittelt werden soll. Hier beginnt man bei 0 zu zählen. Anschließend gibt man in Klammern () die Länge des Substrings an

vorwahl_int = telefon_int+0(3) "schneidet ein Textabschnitt der Länge 3 ab der Position 0 heraus

************************************************************************************************

DATA: lv_string   TYPE STRING.

lv_string = 'Hallo Welt.'.
lv_string = lv_string+6(4).   " Beginn 7. Zeichen (1. Zeichen wird mit Null gerechnet) und Länge 4.
" --> "Welt"

Debugging von ABAP-Programmen

Debugging gehört zur der täglichen Arbeit eines ABAP-Entwicklers. Oft kann man nur beim Debugging die Fehler vollständig und komplett analysieren. Im Vergleich mit anderen Entwicklerwerkzeugen ist im SAP ERP-System das Debugging-Werkzeug sehr mächtig. Es erlaubt Dir, übersichtlich und einfach, die Werte und Logiken Deiner Programme zu analysieren und schnell die Fehler zu finden.

Breakpoints sind die Haltepunkte beim Debugging. Durch ein Breakpoint wird bei der Ausführung des Reports genau an dieser Stelle angehalten. Voraussetzung dafür ist natürlich, dass die Stelle auch ausgeführt wird. Alternativ kannst Du direkt über das OK-Feld durch “/h” den Debugging-Modus starten und Du landest direkt nach der Ausführung des Reports im Debugging.

Man kann auch statische Breakpoints mit dem Schlüsselwort BREAK-POINT setzen. Dabei wird automatisch an dieser Stelle das Debugging gestartet. Man sollte dabei tunlichst darauf achten, dass diese Anweisung nicht in das Produktivsystem übernommen wird, da dadurch ansonsten jederzeit das Debugging startet.

BREAK-POINT.

Außerdem ist ein Watchpoint sehr interessant, da dadurch nur bei der definierten Bedingung das Debugging gestartet und das Programm angehalten wird.

Im Debugging klickt man mit dem Cursor auf eine Variable auf der der Watchpoint angewendet werden soll und drückt auf den Button “Watchpoint”. Anschließend kann man die gewünschte Bedingung angeben, bei der angehalten werden soll, wenn die Bedingung erfüllt wird. Gebe in der “Freie Bedingungseingabe” die Bedingung mit “= ‘Wert‘” ein (Ohne die Anführungszeichen). Auf Berater-Wiki ist das Anlegen von Watchpoints sehr gut erläutert.

Hier sind sehr nützliche Shortcuts, mit denen man im Debugger leichter navigieren kann:

ShortcutBeschreibung
Shift + F5Debugger von Anfang des Programms
F5Einzelschritt (auch in eine Methode/Funktionsbaustein hinein)
F6Ausführen, Nächstes ausführbare Kommando (Methoden/Funktionsbausteine überspringen)
F7Zurück aus der Methode/Funktionsbaustein
F8Weiter, Sprung zum nächsten Breakpoint

Möchte man beim Debugging unerwünschte Komponenten/Frameworks ausblenden, kann man das Layer-aware Debugging aktivieren. Dafür geht man folgendermaßen vor:

Debugger starten > Debugger-Layer Konfigurieren > Layer-Aware Debugging aktiv > Feld ‘Programme’ ausfüllen > ‘Halte beim Eintritt’ ankreuzen

Modifikation von transparenten Datenbanktabellen

Tabellen bildet das Fundament eines SAP ERP-Systems. In ihnen werden die wichtigen Stamm- und Bewegungsdaten gespeichert. Eine der wichtigsten Tätigkeiten eines ABAP-Entwicklers ist das Lesen, Ändern oder Löschen von Daten in einer Datenbank. Doch bevor es so weit kommt, müssen zuerst einmal die Tabellen definiert werden. Es gibt im Standard viele Tabellen, aber man kann im ABAP Dictionary auch eigene Tabellen definieren und pflegen.

Über die Transaktion SE11 (ABAP Dictionary) kannst Du Deine eigenen Tabellen definieren. Diese müssen im Namensraum liegen oder mit dem Buchstaben Y oder Z beginnen, da die anderen Buchstaben für SAP-Entwicklungen vorgesehen sind.

Mit dem Data Browser (SE16 oder SE16N) kannst Du die Einträge in Deiner Tabelle anzeigen lassen.

Eine Tabelle besteht aus Feldern, die einen Datentypen besitzen. Jeder Datentyp wiederum zeigt auf eine Domäne. Bei der Aktivierungsreihenfolge geht man also folgendermaßen vor: Domäne, Datentyp und Tabelle.

Bei manchen Feldern sind Referenzfelder notwendig. Möchte man Währungen (CURR) oder Mengen (QUAN) pflegen so muss man auch das Referenzfeld für Währungseinheiten (CUKY) oder Mengenfelder (UNIT) pflegen.

  • CURR – CUKY
  • QUAN – UNIT

Durch den Button “Fremdschlüssel” kann man auch einen Fremdschlüssel definieren. Fremdschlüssel ist ein Feld in der Tabelle, das in einer anderen Tabelle ein Primärschlüssel ist. Somit haben die beiden Tabellen eine Beziehung und können durch einen Join verknüpft werden. Die Fremdschlüssel müssen dabei die gleiche Domäne haben.

Man hat auch die Möglichkeit, Append-Strukturen oder Include-Strukturen zu definieren. Beide erweitern durch weitere Felder die Tabelle.

Append-Strukturen sind genau einer Tabelle zugeordnet. Man kann dabei eine Append-Struktur anlegen, indem man im ABAP Dictionary (Transaktion SE11) in der Tabelle “Springen > Append-Struktur” auswählt. Danach gibt man den Namen der Append-Struktur an und definiert die Felder.

Include-Strukturen hingegen sind ein mehrfach verwendeter Baustein. Sie gehören zu den Dictionary-Objekten. Über “Bearbeiten > Include > Einfügen” kann man Include-Strukturen in die Tabelle einfügen.

Generell kann man eine Tabelle nur dann löschen, wenn sie nicht mehr verwendet wird. Ansonsten muss man vorher die Verwendung und Daten löschen bevor man die Tabelle an sich löschen kann.

Wenn hingegen eine Tabelle verändert wird, obwohl schon Daten in der Tabelle vorhanden sind, muss die Tabelle umgesetzt werden. Eine Umsetzung ist aber sehr einfach. Hierbei wird die neue Tabelle erstellt, die Daten in die neue Tabelle transferiert und die alte Tabelle gelöscht.

Für die Umsetzung verwendet man die Datenbank-Utility in der Transaktion SE14. Nach dem Aufruf gibt man die Tabelle ein, wählt den Radio-Button “Tabellen” aus und klick auf “Bearbeiten”. Anschließend wählt man die Option “Daten erhalten” aus und klickt auf “Aktivieren und Datenbank anpassen”.

Für die Umsetzung verwendet man die Datenbank-Utility in der Transaktion SE14. Nach dem Aufruf gibt man die Tabelle ein, wählt den Radio-Button "Tabellen" aus und klick auf "Bearbeiten". Anschließend wählt man die Option "Daten erhalten" aus und klickt auf "Aktivieren und Datenbank anpassen".

Datum, Zeit, Mengen und Währungen

Um das aktuelle Datum zu ermitteln, kann man das Feld “sy-datum” verwenden. Beim Datum und bei der Zeit gibt es verschiedene Formate, die man beliebig festlegen kann. Bei Operationen mit diesen Werten muss man darauf achten, welches Format gewählt wird.

DATA rechnungsdatum TYPE sy-datum. "Datumsformat: 'yyyymmdd' (z.B. '20150205')
DATA rechnungsdatum2 TYPE d.
monatsanfang+6(2) = '01'. "Monat ändern
DATA zeitfeld TYPE t. "Format: HHMMSS
DATA zeitfeld TYPE sy-uzeit.

Bei Mengen (QUAN) und Währungen (CURR) muss man stets darauf achten, dass das Referenzefeld mit angeben wird.

Bei manchen Feldern sind Referenzfelder notwendig. Möchte man Währungen (CURR) oder Mengen (QUAN) pflegen so muss man auch das Referenzfeld für Währungseinheiten (CUKY) oder Mengenfelder (UNIT) pflegen.

  • Währungen (CURR) – Währungseinheiten (CUKY)
  • Mengen (QUAN) – Mengenfelder (UNIT)

Auf Datenbanktabelle zugreifen

Im ABAP-Code verwendet das SAP-System selbst Open SQL. Es ähnelt von der Syntax und den Befehlen sehr stark dem nativen SQL. Deshalb können meist SQL-Experten ABAP-Code lesen.

Das SAP-System verwendet ein eigens entworfenen Berechtigungskonzept. Mit definierten Rollen in der Transaktion PFCG und der Benutzerverwaltung SU01 kann man die Berechtigungen verwalten. Im ABAP-Code selber kann man mit AUTHORITY-CHECK die Berechtigungen prüfen lassen.

PARAMETERS carrid TYPE spfli-carrid.

AT SELECTION-SCREEN.
  AUTHORITY-CHECK OBJECT 'S_CARRID'
    ID 'CARRID' FIELD carrid
    ID 'ACTVT'  FIELD '03'.

  IF sy-subrc <> 0.
    MESSAGE 'Keine Berechtigung' TYPE 'E'.
  ENDIF.

Beim Zugriff auf eine Tabelle werden Lese- und Schreibsperren gesetzt. Eine Lesesperre verhindert das Verändern von Daten. Eine Schreibsperre hingegen ist eine exklusive Sperre. Dadurch kann niemand anders lesend oder schreibend auf Datensätze zugreifen.

Bei der Interaktion mit der Datenbank gibt es folgende Operationen:

  • INSERT – Einfügen von Datensätze
  • UPDATE – Bestehende Datensätze verändern
  • MODIFY – Datensatz anpassen oder einfügen
  • DELETE – Datensatz löschen
INSERT (zieltabelle) FROM wa_zteilnehmer.
UPDATE zteilnehmer FROM wa_zteilnehmer.
MODIFY zteilnehmer FROM wa_zteilnehmer. "Gibt es den Datensatz, wird er angepasst, sonst eingefügt
DELETE FROM zteilnehmer WHERE zzkurstitel = 'Netzwerktechnik'.

Achte vor allem beim DELETE-Befehl auf eine WHERE-Klausel, da ansonsten alle Daten gelöscht werden.

Logische Ausdrücke

Wenn Dein ABAP-Code ausschließlich durch Anweisungen besteht, ist wenig Logik enthalten. Man kann durch logische Ausdrücke bzw. Bedingungen festlegen, dass abhängig von einer Bedingung ABAP-Code ausgeführt wird. Möchte man z.B. abhängig vom Alter ausgeben, ob die Person volljährig ist, kann man das leicht mit If-Else-Anweisungen ausführen.

IF <Bedingung>.
…
ELSEIF <Bedingung>.
…
ELSEIF <Bedingung>.
…
ELSE.
…
ENDIF.

Dabei werden die Bedingungen von oben nach unten geprüft. Die erste Bedingung die positiv ist, wird durchlaufen. Anschließend verläuft der ABAP-Code nach dem ENDIF weiter. Sollte keine Bedingung von IF bzw. ELSEIF positiv sein, wird der Anweisungsblock nach ELSE ausgeführt. ELSEIF ist dabei optional und muss nicht angegeben werden.

Das Gleiche kann man mit einer CASE-Anweisung umsetzen. Hierbei wird anhand einer Variable ein Anweisungsblock ausgeführt. Wenn der Wert in WHEN nicht abgedeckt ist, wird OTHERS ausgeführt.

CASE <Abfrageobjekt>.
WHEN '1'.
…
WHEN '2'.
…
WHEN OTHERS.
…
ENDCASE.
CASE sy-subrc.
WHEN 0.
WRITE: / 'In Ordnung'.
WHEN 4.
WRITE: / 'Fehler'.
WHEN OTHERS.
WRITE: / 'Unbekannter Fehler'.
ENDCASE.

Schleifen

Schleifen ermöglichen es, wiederkehrende Aufgaben auszuführen und Listen oder Tabellen zu durchlaufen. Eine der bekanntesten Schleifen führt man mit dem SELECT-Befehl aus.

SELECT * FROM zteilnehmer2 INTO wa_zteilnehmer2
WHERE zzkurstitel = 'Netzwerktechnik'.

ENDSELECT.

Eien DO-Schleife kann x-mal ausgeführt werden. Wenn man hinter dem Schlüsselwort DO keine Zahl angibt, erzeugt man dadurch eine Endlosschleifen. Man kann dabei auch eine DO-Schleife in einer DO-Schleife einfügen.

DO. "Endlosschleife
…
ENDDO.

DO 50 TIMES.
    DO 100 TIMES.
    …
    ENDDO.
ENDDO.

Eine WHILE-Schleife enthält eine Bedingung. Sie wird solange ausgeführt wie die Bedingung wahr / true ist. Direkt nach dem Schlüsselwort WHILE gibt man die Bedingung an.

WHILE sek > 0.
    WRITE: / sek.
    Sek = sek – 1.
ENDWHILE.

Bei Schleifen kann man auf die Systemvariable SY-INDEX zurückgreifen. Hier wird der Index als Zählervariable bei Schleifendurchläufen gespeichert.

Möchte man vorzeitig eine Schleife verlassen, gibt es drei Abbruchanweisungen für Schleifen

  • CONTINUE: Beendet den aktuellen Schleifendurchgang und startet einen neuen Schleifendurchlauf
  • CHECK: Bei Nichterfüllen der Bedingung wird der aktuelle Schleifendurchgang beendet und ein neuer Schleifendurchlauf gestartet (CHECK <Bedingung>). Kann als Kombination von IF NOT und CONTINUE gesehen werden
  • EXIT: Beendet die komplette Schleifenbearbeitung

Selektionsbildschirme

Selektionsbildschirme sind für einen SAP-Benutzer die Möglichkeit, Einfluss auf die Ausführung und das Ergebnis des ABAP-Reports zu nehmen. Denn nicht alle SAP-Benutzer müssen die Möglichkeit haben, die Ergebnismenge zu filtern und genau das anzeigen zu lassen was der SAP-Benutzer auch wirklich benötigt. Bei den Selektionsbildschirmen gibt es folgende Möglichkeiten:

  • Klassische Dynpros: typische Anwendungstransaktionen
  • Selektionsbilder: Darstellung der Parametereingabe
  • Listausgabe: Ausgabe bei dem Ende der Verarbeitung eines Reports

Ein ABAP-Programm kann dabei in mehrere Ereignisblöcke untergliedert werden. Ein Ereignisblock endet mit der Definition des nächsten Ereignisblocks. Folgende Ereignisblöcke können verwendet werden:

  • LOAD-OF-PROGRAM: Ausführung unmittelbar nach dem Laden des Programms
  • INITIALIZATION: Prüfung, ob Report deklariert, danach Selektionsbildprozessor
  • AT SELECTION-SCREEN: Nachdem der Anwender den Bildschirm gesehen und ausgefüllt hat
  • START-OF-SELECTION: Übergabe an ABAP-Prozessor

Typischerweise wird vor AT SELECTION-SCREEN der Selektionsbildschirm mit PARAMETERS und SELECT-OPTIONS definiert. Denn direkt nach der Ausführung des Selektionsbildschirms wird der Ereignisblock nach AT SELECTION-SCREEN ausgeführt.

Mit dem Schlüsselwort PARAMETERS wird ein Eingabefeld erzeugt, mit dem der Benutzer eine Eingabe tätigen kann. Hierbei kann man wie bei der Datendefinition die Variable typisieren. Die Variable bzw. Eingabe des Benutzers ist dann zur Laufzeit im Zugriff.

PARAMETERS sek TYPE i DEFAULT 10 OBLIGATORY. "Pflichtfeld
PARAMETERS geschlec TYPE char255 OBLIGATORY VALUE CHECK. "Nur hinterlegte/gültige Werte werden akzeptiert
PARAMETERS kursti TYPE  char255 DEFAULT 'SAP-Grundlagen' LOWER CASE. "Unterscheidung zwischen Groß- und Kleinschreibung
PARAMETERS vollstli as checkbox. "Parameter als Checkbox
PARAMETERS: initialw RADIOBUTTON GROUP rad1,
            non_sap  RADIOBUTTON GROUP rad1,
            schaltja RADIOBUTTON GROUP rad1. "Radiobutton werden der Gruppe rad1 hinzugefügt

Mit TYPE nimmt man erneut Bezug auf einen Datentyp und mit LIKE Bezug auf ein Datenobjekt.

Um mehr als einen Parameter bzw. einen Bereich in einem Wert zu speichern, verwendet man einen SELECT-OPTIONS. SELECT-OPTIONS dient als Selektionstabelle und bildet dabei eine interne Tabelle. Bei diesem Schlüsselwort hat man dabei mehrere Möglichkeiten bzw. Zusätze:

  • SIGN: logische Operand (<, =, >, …)
  • OPTION: Behandlung der Grenzwerte
  • LOW: Untergrenze des Intervalls, bei Einzelwert nur Einzelwert
  • HIGH: Obergrenze, bei Einzelwerten leer
  • NO-EXTENSION: nur eine Zeile kann ausgewählt werden, verhindert Mehrfachselektion
SELECT-OPTIONS gebdat FOR wa_zteilnehmer-geburtstdatum. “Erlaubt Mehrfachselektion

IF wa_zteilnehmer-geburtsdatum IN gebdat.
* Anweisungsblock
ENDIF.

Die Zusätze DEFAULT, OBLIGATORY, LOWER CASE gelten ebenfalls bei SELECT-OPTIONS.

Bei SELECT-OPTIONS hat man sehr viele Gestaltungsmöglichkeiten. Man kann durch BEGIN OF LINE einen Zeilenblock gestalten. Einzelne Zeilen werden mit LINE definiert.

SELECTION-SCREEN BEGIN OF LINE.

Möchte man in einem Block auch eine Beschreibung hinzufügen, eignet sich das Schlüsselwort COMMENT.

SELECTION-SCREEN COMMENT (16) text-005.
SELECTION-SCREEN COMMENT 24(60) text-005. “Text ab Position 24 mit der Länge 60

Bei Verwendung des Zusatzes FOR FIELD wird das Ausgabefeld mit einem über PARAMETERS oder SELECT-OPTIONS definierten Parameter oder Selektionskriterium desselben Programms verknüpft. Dadurch kann man die F1- und F4-Hilfen benutzen.

SELECTION-SCREEN COMMENT (20) text-002 FOR FIELD geschlec. “Text mit Parameter geschlec verknüpfen, erhält unter Umständen F1 und F4 Hilfe

Man kann außerdem den Zeilenblock mit weiteren Schlüsselwörtern gestalten. Mit TITLE fügt man einen Rahmentext und mit “WITH FRAME” einen Rahmen hinzu. Zudem hinaus kann man POSITION für die Positionierung und “BEGIN OF BLOCK” für die Blockdefinition verwenden.

SELECTION-SCREEN POSITION 24. “Position der nächsten Zeile ab 24 starten lassen

SELECTION-SCREEN BEGIN OF BLOCK. 
SELECTION-SCREEN END OF BLOCK.

SELECTION-SCREEN BEGIN OF BLOCK rad1
                          WITH FRAME TITLE title.

Im ABAP-Editor (Transaktion SE38 bzw. SE80) gibt es die Möglichkeit, die Textelemente im Report zu pflegen. Diese Pflege ruft man über “Springen > Textelemente”, die F5-Taste oder den Button “Textelemente” auf.

Im ABAP-Editor (Transaktion SE38 bzw. SE80) gibt es die Möglichkeit, die Textelemente im Report zu pflegen. Diese Pflege ruft man über "Springen > Textelemente", die F5-Taste oder den Button "Textelemente" auf.

Beim ersten Aufruf werden die technischen Namen als Texte angezeigt. Wenn man hingegen die Selektionstexte pflegt (?…) mit einem Wort austauscht, dann werden die gepflegten Texte beim Selektionsbildschirm angezeigt.

Es gibt dabei folgende Textelemente:

  • Textsymbole: anstatt von hart codierten Literalen
    • Konvention bzw. Empfehlung: Beschreibung als Kommentar daneben das Literal in Kommentaren im ABAP-Code!
  • Selektionstexte: anstatt des technischen Namens von Parametern und Selektionstabellen
    • Anlegen:
      • SE38, Report eingeben > Textelement auswählen > Ändern-Button
      • im Quellcode > Springen > Textelemente > Selektionstexte
  • Listüberschriften: Gestaltung von Listköpfen

Für jedes Selektionsbild kann man eine Variante anlegen.

  • SE38 > Programmname > Varianten > Ändern > Anlegen/Anzeigen > Attribute (Variantenattribute anzeigen)
  • Selektionsbild > Springen > Variante > Als Variante sichern/Button “Als Variante sichern”

Man kann dabei den Report mit der angelegten Variante starten:

  • SE38 > Button “Mit Variante”
  • System > Dienste > Reporting > Programmname eingeben > Button “Mit Variante”
  • Selektionsbild aufrufen > Springen > Varianten > Holen

Ein Textsymbol besteht aus “TEXT-” und einer dreistelligen Zahl. Beispiel: TEXT-001. Man kann ein Textelement entweder per Vorwärtsnavigation oder über den Button “Textelemente” anlegen. Dabei klickt man einfach doppelt per Vorwärtsnavigation auf die dreistellige Zahl. Anschließend fragt einen das System, ob man das Textsymbol anlegen möchte, da es noch nicht existiert. Nach dem Speichern sollte man das Aktivieren nicht vergessen.

Nachrichten

Nachrichten dienen der Interaktion mit dem Benutzer. So weiß der Benutzer was im Programm vorgeht und erhält eine Rückmeldung über den Erfolg des Programms. Vor allem bei Falscheingaben sind Nachrichten sehr nützlich und sollten verwendet werden.

Eine Nachrichtenklasse kann man entweder im ABAP Editor (SE38 bzw. SE80) über “Springen > Nachrichten” auswählen oder in der Transaktion SE91 pflegen.

Eine Nachrichtenklasse kann man entweder im ABAP Editor (SE38 bzw. SE80) über "Springen > Nachrichten" auswählen oder in der Transaktion SE91 pflegen.

Die Nachrichten werden in der Tabelle T100 gespeichert. Nachrichten sind kontextsensitiv. Mit dem Schlüsselwort MESSAGE kann man in der Nachrichtenzeile dem SAP-Benutzer Nachrichten ausgeben.

MESSAGE e002( zabap ). "e - Fehler; 002 - Nachricht in der zweiten Zeile; zabap - Nachrichtenklasse

Bei der Definition von Texten kann man einen Platzhalter definieren. Hierfür verwendet man das kaufmännische Und (&) in der Nachricht. Beim Aufruf der Nachricht wird automatisch die angegebene Variable mit dem Platzhalter ersetzt.

MESSAGE e002( zabap ) WITH lv_nr. "lv_nr ersetzt & in Zeile 2 in Nachrichtenklasse zabap

Generell gibt es folgende Nachrichtentypen:

  • E – Fehlermeldungen
  • I – Information (werden in einem Dialogfenster angezeigt)
  • S – Statusmeldung (werden in der Statusleiste angezeigt)
  • W – Warnungen
  • A – Abbruchmeldung (werden in einem Dialogfenster angezeigt. Das laufende Programm bricht ab)
  • X – Exit-Meldungen (brechen das laufende Programm ab und erzeugen einen Kurzdump)

Interne Tabelle

Eine interne Tabelle ist eine temporär gespeicherte Datenbanktabelle im ABAP-Programm. Man kann es als flüchtiger/volatiler Speicher bezeichnen, der im Arbeitsspeicher gespeichert wird. Ähnlich wie in ABAP deklarierte Strukturen. Strukturen besitzen jedoch nur eine Zeile, interne Tabellen besitzen beliebig viele Zeilen. Den Inhalt einer internen Tabelle bezeichnet man als Tabellenrumpf.

Der große Vorteil von internen Tabellen im Vergleich zu Datenbanktabellen ist der schnellere Zugriff. Anstatt öfters auf eine entfernte Datenbanktabelle zuzugreifen, bei der der Zugriff der Flaschenhals ist und für eine langsame Verarbeitung sorgt, muss eine interne Tabelle einmal befüllt werden, ist im Arbeitsspeicher zur Verfügung und sorgt für eine schnelle Verarbeitung.

Generell gibt es folgende Tabellentypen:

  • Standardtabelle: Zugriff über Schlüssel oder Index
    • Schlüssel: Zugriffszeit und Anzahl Zeiten direkt proportional, je mehr Zeilen, desto länger dauert es
    • Index: Zugriffszeit wächst nur logarithmisch
    • eindeutiger Schlüssel kann nicht definiert werden (mehrfach vorkommende Schlüssel), schnelles Füllen möglich
  • Sortierte Tabelle
    • Inhalt nach einem Schlüssel sortiert abgelegt
    • Schlüssel kann eindeutig sein
    • Standardtabelle und sortierte Tabellen sind Indextabellen
  • Hash-Tabelle: Zugriff ausschließlich über eindeutigen Schlüssel
    • eignet sich für sehr große Datenmengen  

Es gibt dabei Standard- und benutzerdefinierte Schlüssel einer Tabelle:

  • eindeutiger Schlüssel: Zeile kann nur einmal vorkommen (nicht mehrfach)
  • nicht eindeutigen Schlüssel: Zeile darf mehrfach vorkommen
  • Standardschlüssel: ist vom Zeilentyp der Tabelle abhängig
  • benutzerdefinierter Schlüssel: zusammengesetzt aus beliebigen, frei definierbaren Teilmenge

Interne Standardtabelle anlegen

Bei der Anlage einer internen Tabelle geht man folgendermaßen vor:

  1. Deklaration eines Zeilentyps
  2. Deklaration eines Tabellentyps
  3. Deklaration der Tabelle
  4. Deklaration des Arbeitsbereiches

Dabei können die ersten beiden Schritte entfallen, wenn man auf bestehende Zeilen- oder Tabellentypen zurückgreift.

TYPES: BEGIN OF zeile_typ,
    zzkurstitel TYPE zteilnehmer-zzkurstitel,
    tkurspreis TYPE zteilnehmer-tkurspreis,
END OF zeile_typ. ” Zeilentyp deklarieren (Schritt 1)

TYPES itab_typ TYPE STANDARD TABLE OF zeile_typ. "Tabellentyp deklarieren, Tabelle besteht aus bestimmter Zeilentyp zeile1_typ (Schritt 2)

*Zum Vergleich: Deklaration einer sortierten Tabelle mit eindeutigem Schlüssel:
TYPES itab_typ TYPE SORTED TABLE OF zeile_typ WITH UNIQUE KEY zzkurstitel.

DATA itab TYPE itab_typ. "Deklaration der Tabelle (Schritt 3)
DATA wa_itab TYPE zeile_typ. "Arbeitsbereich deklarieren (Schritt 4)

Interne Standardtabelle mit Workarea füllen

Um eine interne Tabelle zu befüllen, sind folgende Schritte notwendig:

  1. Workarea füllen
  2. Interne Tabelle füllen
“Zeilenweise Füllung einer internen Tabelle
SELECT * FROM zteilnehmer INTO wa_zteilnehmer.
    wa_itab-bezeichnung = wa_zteilnehmer-zzkurstitel.
    wa_itab-preis = wa_zteilnehmer-tkurspreis. "Workarea füllen
    APPEND wa_itab TO itab. "interne Tabelle füllen
ENDSELECT.

"Inhalte namensgleicher Felder einfügen

SELECT * FROM zteilnehmer INTO wa_zteilnehmer.
    MOVE-CORRESPONDING wa_zteilnehmer TO wa_itab. "Workarea mit namensgleichen Feldern füllen
    APPEND wa_itab TO itab1. "Interne Tabelle füllen
ENDSELECT.

"Blockweises Einfügen der Zeilen (schnellste Variante)
TYPES BEGIN OF zeile_typ. “Kein Kettensatz
    INCLUDE TYPE zeile_typ.
    TYPES minteiln TYPE i.
TYPES END OF zeile_typ.

TYPES ita_typ TYPE STANDARD TABLE OF zeile_typ. “Standardtabelle
DATA itab TYPE itab_typ.

SELECT * FROM zteilnehmer INTO CORRESPONDING FIELDS OF TABLE itab. "Array-Fetch, alle Inhalte von namensgleichen Felder werden blockweise in die interne Tabelle übertragen

Interne Tabelle mit Workarea verarbeiten

LOOP AT itab INTO wa_itab. “Zeilen satzweise in workarea übertragen

" Andere Technik
LOOP ASSIGNING …
LOOP REFERENCE INTO …
"Änderungen
wa_itab-preis = 567. “Workarea Eintrag verändern

MODIFY itab FROM wa_itab. “interne Tabelle von workarea aktualisieren

INSERT wa_itab INTO itab INDEX zeilen_itab. "Eintrag der workarea in interne Tabelle an index zeilen_itab1 einfügen

READ TABLE ITAB INDEX 3 INTO wa_itab. "über den Index 3 den Eintrag in die workarea laden

READ TABLE itab INTO wa_itab WITH KEY zzkurstitel = 'SAP-Grundlagen'. "Nach einem Schlüssel suchen

LOOP AT itab INTO wa_itab1. "Zeilen satzweise in workarea stellen

DELETE TABLE itab FROM wa_itab.

Workareas und interne Tabelle mit Workarea löschen

CLEAR itab. "interne Tabelle löschen/leeren

CLEAR wa_itab. "workarea löschen/leeren

CLEAR: itab, wa_itab. "Die gleiche Anweisung als Kettensatz

FREE itab. "gleich wie CLEAR (Speicherplatz bleibt reserviert), wobei der Speicherplatz freigegeben wird

Wiederverwendung von Programmen

Die Modularisierung bzw. Wiederverwendung von Programmen ist heutzutage ein zentraler Aspekt in der Programmierung. Schließlich ist es extrem mühsam, bei Änderungen x-beliebige Stellen anzupassen. Wenn man hingegen modular programmiert, kann man Entwicklungen wiederverwenden. Dadurch spart man Zeit bei der Entwicklung und Wartung von Programmen.

Außerdem ist der ABAP-Code dadurch übersichtlicher, da Details in Unterprogrammen, Funktionsbausteinen oder Klassen gekapselt werden können.

Die Modularisierung beschäftigt sich also damit, ein Programm in Komponenten zu zerlegen.

Es gibt dabei folgende Modularisierungs- bzw. Kapselungstechniken:

  • globale ABAP-Klassen
  • lokale ABAP-Klassen
  • Funktionsgruppen
  • Unterprogramme
  • Verarbeitungsblöcke (z.B. START-OF-SELECTION)

Die Modularisierungstechniken im Detail lassen sich folgendermaßen untergliedern:

  • Modularisierung des Quellcodes (Include-Programme)
    • Programmteile “auslagern”: INCLUDE z_teilnehmer_deklaration.
  • Prozeduren (besitzen Schnittstellen)
    • Methoden
    • Unterprogramme
    • Funktionsbausteine
  • ABAP-Klassen

Includes sind die einfachste Form der Modularisierung. Hier wird ein bestehender ABAP-Code in einen Include ausgelagert und kann durch das Schlüsselwort INCLUDE verwendet werden. Man kann sich das so vorstellen wie wenn man die inkludierte Programmierung anstelle des Schlüsselwortes verwendet hätte. Includes kann man im ABAP Editor durch die Vorwärtsnavigation anlegen oder durch Rechtsklick im ABAP Workbench und “Anlegen > Weitere (1) > Include“.

REPORT z_muster.

INCLUDE labap_docutop.               " Globale Definition

Des Weiteren bieten Methoden von Klassen ebenfalls die Möglichkeit, Quellcode wiederzuverwenden und auszulagern.

CALL METHOD (class)=>(meth)
      PARAMETER-TABLE
        param_tab
      EXCEPTION-TABLE
        ex_tab.

Unterprogramme werden im ABAP-Programm selber definiert und somit auch aufgerufen. Man benutzt sie für programminterne Modularisierung von Aufgaben. Die Steuerung erfolgt dabei zentral auf der oberen Ebene und die verarbeitenden Operationen werden im Unterprogramm ausgeführt. Durch das Schlüsselwort PERFORM werden Unterprogramme aufgerufen und durch FORM und ENDFORM definiert.

FORM itab_fuellen. 
" … 
ENDFORM.

PERFORM itab_fuellen. “Unterprogramm itab_fuellen aufrufen

Bei Unterprogrammen sollte man den Gültigkeitsbereich stets beachten. Lokale Variablen haben nur in dem Unterprogramm ihren Gültigkeitsbereich. Man muss die Variablen explizit über die DATA-Anweisung deklarieren.

Einen fremden Report kann man mit SUBMIT aufrufen.

"Code, der zum Ausführen eines Berichts verwendet wird
 ZEXREPORT SCHREIBEN.

 SUBMIT ZEXREPORT with selection-table seltab
                                via selection-screen.


"Code zum Füllen der 'Parameter' und Ausführen des Berichts
 SUBMIT ZEXREPORT WITH param1 = 'Wert'
                WITH param2 = 'Wert'.

"Report ausführen und danach zum aktuellen Programm zurückkehren
 SUBMIT ZEXREPORT AND RETURN.

"Report über ein eigenes Selektionsbild ausführen
  SUBMIT ZEXREPORT VIA SELECTION-SCREEN.

"Report mit Selektionsbildvariante absetzen
 SUBMIT ZEXREPORT USING SELECTION-SET 'VARIANTE'.
" Aufruf des Unterprogramms itab_liste
PERFORM itab_liste USING par zzaehler_itab.

" Definition des Unterprogramms itab_liste
FORM itab_liste USING lok_par lok_zzaehler. 
" Anweisungsblock
CHECK lok_par IS NOT INITIAL.

ENDFORM. "Werte der lokalen Variablen werden an die globalen Variablen “übergeben”/haben die gleichen Werte, die Werte der lokalen Variablen gehen dabei “verloren”
"Aufruf von itab_fuellen - interne Tabelle übergeben
PERFORM itab_fuellen USING itab.

"Definition von itab_fuellen
FORM itab_fuellen USING itab_universal TYPE table. "übergebene interne Tabelle definieren
" Ruft Unterprogramm in Report z_teilnehmerliste_a auf
PERFORM itab_liste IN PROGRAM z_teilnehmerliste_a USING nvml zzaehler_itab.
 " eigener Report wird beendet, z_teilnehmerliste_a wird ausgeführt
SUBMIT z_teilnehmerliste_a VIA SELECTION-SCREEN. 

“Übergabe der beiden technischen Felder par1 und par2
SUBMIT z_teilnehmerliste_a 
    WITH par1 = ‘X’
    WITH par2 = ‘X’
    VIA SELECTION-SCREEN.

"Report ohne Selektionsbildschirm rufen
SUBMIT z_teilnehmerliste_a
    WITH par1 = 'X'. "Selektionsbild des Folgereports wird nicht angezeigt

" Eigener Report soll weiterlaufen
SUBMIT z_teilnehmerliste_a VIA SELECTION-SCREEN AND RETURN. "nach dem fremden Report wird wieder der eigene Report ausgeführt

Funktionsbausteine bilden einen zentralen Aspekt in ABAP. Sie sind nicht mehr aktuell und modern, da sie durch ABAP-Klasen und dem objektorientierten Ansatz abgelöst wurden, aber sie sind immer noch in zahlreichen ABAP-Programmen präsent und werden genutzt.

Über den Function Builder in der Transaktion SE37 kann man Funktionsbausteine definieren. Funktionsbausteine besitzen eine Schnittstelle, die über folgende wichtige Parameter abgedeckt wird:

  • Importing: Parameter, welche der Funktionsbaustein benötigt – Wertübergabe
  • Exporting: Parameter, welche der Funktionsbaustein zurückgibt
  • Changing: Sowohl Importing- als auch Exporting-Parameter
  • Exceptions: Ausnahmen, werden über den Rückgabewert sy-subrc geregelt

Über den Function Builder kann man über die Funktion “Testen” auch die Funktionsbausteine testen bzw. mit Werten ausführen.

Über “CALL FUNCTION” wird ein Funktionsbaustein aufgerufen.

Über die Funktion “Muster” kann man einfach und vordefiniert Funktionsbausteine im ABAP-Programm aufrufen. Die optionalen Parameter werden beim Einfügen auskommentiert eingeblendet.

CALL FUNCTION 'ALV_CONSISTENCY_CHECK'
  EXPORTING
    i_save           =
    is_layo          =
    is_variant       =
    it_fcat          =
*   IT_SORT          =
*   IT_FILT          =
*   IT_SGRP          =
*   IT_HLINKS        =
    it_outtab        =
          .
CALL FUNCTION ‘WS_EXECUTE’
EXPORTING
    commandline = 'C:\TEMP\TEST.PDF' “zu öffnende Datei
    program = 'C:\Program Files (x86)\Adobe\reader 9.0\Reader\AcroRd32.exe' "ausführbares Programm
. "Punkt nicht vergessen
CALL FUNCTION 'Z_FUBA_EXAMPLE'
  EXPORTING
    i_id     = '1'
  IMPORTING
    e_detail = lv_detail.

Dabei muss man immer stets aus Sicht des Funktionsbausteins denken. Was bei der Definition im Funktionsbaustein ein IMPORT-Parameter ist, ist beim Aufruf ein EXPORT-PARAMETER. Und andersherum. Im Beispiel oben ist “i_id” aus Sicht des Funktionsbausteins ein IMPORTING-Parameter und wird an den Funktionsbaustein übergeben. Der Funktionsbaustein gibt “e_detail” als EXPORTING-Parameter zurück. Beim Aufruf muss man aber mit EXPORTING übergeben und mit IMPORTING entgegennehmen.

Mit ABAP-Klassen ist ABAP eine objektorientierte Sprache. Man spricht hier oft von ABAP OO. Mit der Objektorientierung öffnen sich neue Wege: Modularisierung, Wiederverwendbarkeit, Vererbung, Polymorphie, usw.

Ein Objekt ist die Instanz einer Klasse.

Bei ABAP-Klassen verwendet man Instanzen, Attribute, Methoden und verschiedene Sichtbarkeiten. Bei den Sichtbarkeiten sind PUBLIC, PRIVATE, PROTECTED möglich. Bei den Methoden spricht man oft vom sogenannten Scope. Jede Methode ist entweder eine Instanzmethode (eine Instanz der Klasse ist notwendig) oder Klassenmethode (statische Methode, Instanz der Klasse ist nicht notwendig).

Man kann Klassen entweder im Class Builder (Transaktion SE24) oder lokal im ABAP Editor oder ABAP Workbench definieren und implementieren. Lokale Klassen sind nur in dem Programm verfügbar, wohingegen globale Klassen in jedem Programm verwendet werden können.

Im Class Builder kann man über die Funktion “Testen” die Methoden einer Klasse testen bzw. ausführen.

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.

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

Für die Datenübergabe gibt es zentrale Speicherbereiche auf die man zugreifen kann, um sich die Übergabe zu sparen und die Daten temporär zentral zu “lagern”. Dabei gibt es folgende Möglichkeiten:

  • Dateien
  • Datenbanktabellen
  • Arbeitsspeicherbereiche
    • Globales SAP Memory
    • Lokales SAP Memory
    • ABAP Memory
  • Shared Objects

Das globale SAP Memory steht während der Anmeldedauer des SAP-Anwenders zur Verfügung. Das globale SAP Memory kann dabei von anderen Transaktionen ebenfalls verändert werden. Man kann folgendermaßen darauf zugreifen:

SET PARAMETER ID 'Z_TEST' FIELD progname. "Inhalt des Feldes progname in SAP-Memory (Parameter Z_TEST) schreiben

GET PARAMETER ID 'Z_TEST' FIELD progname. "Inhalt des SAP-Memorys in Feld 'progname' schreiben

Das lokale SAP Memory speichert die Werte während der Dauer einer Transaktion. Man kann dabei ebenfalls mit SET PARAMETER und GET PARAMETER darauf zugreifen. Die Parameter-IDs bleiben pro Transaktion unverändert.

Das ABAP Memory speichert die Daten solange wie ein externer Modus mit seinem internen Modi erhalten bleibt. Wenn der Benutzer den Modus schließt, werden die Inhalte gelöscht.

EXPORT itab TO MEMORY ID progname "Daten (itab4) ins ABAP Memory (progname) schreiben
IMPORT itab FROM MEMORY ID progname "Daten (itab4) aus dem ABAP Memory (progname) holen
IMPORT itab TO itab5 FROM MEMORY ID progname. "Interne Tabelle itab4 aus Cluster progname in itab5 importieren

Außerdem gibt es noch sogenannte Shared Objects. Dabei handelt es sich um Objektinstanzen im Shared Memmory. Über die Transaktion SHMA kann man die Gebiete für die Shared Objects pflegen. In den Gebieten werden die Shared Objects geordnet. Folgende Voraussetzungen müssen bei Shared Objects erfüllt sein:

  • Klasse muss Shared-Memory-fähig sein
  • Gebiet muss in Transaktion SHMA verfügbar sein
  • Gebietswurzelkasse (darüber laufen die Zugriffe) anlegen und dem Gebiet zuordnet
  • Shared Objects
    • Objektinstanzen im Shared Memory
    • geordnet in Gebieten (Pflege über Transaktion SHMA)
      • Voraussetzungen
        • Klasse muss Shared-Memory-fähig sein
        • Gebiet muss in Transaktion SHMA verfügbar sein
        • Gebietswurzelkasse (darüber laufen die Zugriffe) anlegen und dem Gebiet zuordnet
DATA:
  r_handle    TYPE REF TO zcl_3016_area,
  r_root      TYPE REF TO zcl_3016_root,
  r_catalogue TYPE REF TO zcl_3016_catalogue.


r_handle = zcl_3016_area=>attach_for_write( ).

CREATE OBJECT r_root
  AREA HANDLE r_handle.

CREATE OBJECT r_catalogue
  AREA HANDLE r_handle.

r_root->catalogue = r_catalogue.

r_handle->set_root( r_root ).

SELECT * FROM spfli INTO TABLE
  r_catalogue->connections.

" Daten aus der Datenbank lesen
r_handle->detach_commit( ). 
DATA:
  r_handle TYPE REF TO zcl_3016_area,
  ls_spfli TYPE spfli.
TRY .
    r_handle = zcl_3016_area=>attach_for_read( ).

    LOOP AT r_handle->root->catalogue->connections INTO ls_spfli.
      WRITE: / ls_spfli-carrid, ls_spfli-connid, ls_spfli-cityfrom, ls_spfli-cityto.
    ENDLOOP.


    r_handle->detach( ).
  CATCH cx_shm_no_active_version.
    MESSAGE 'Fehler beim Ausführen des Programms' TYPE 'I'.
ENDTRY. 

Über den Autor

Schön, dass Du Dich für SAP ERP interessierst.

Mein Name ist Andreas Geiger und ich bin der Gründer von ERP-UP.de. Mein Ziel ist es, so viel nützliches Wissen wie möglich über das SAP ERP-System zu vermitteln. Ich möchte Dir damit einen Mehrwert bieten. Es freut mich, wenn ich Dir damit helfen kann.

Mehr zu ERP UP

3 Gedanken zu „Der perfekte Einstieg in ABAP – ABAP-Cheatsheet“

Schreibe einen Kommentar