36
Leseprobe Protokolle und Meldungen des SAP-Systems strukturiert aufzubewahren ist eine Herausforderung. In dieser Leseprobe erfahren Sie, wie Sie diese mit dem Applikationslog bewältigen können. Sie lernen einfache, aber wirkungsvolle Konzepte für Entwicklung und Wartung kennen – kurz: die besten Rezepte für die Arbeit mit Meldungen und Protokollen! Enno Wulff, Maic Haubitz, Dennis Goerke, Sascha Seegebarth, Udo Tönges Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler 718 Seiten, gebunden, 2. Auflage 2016 69,90 Euro, ISBN 978-3-8362-4107-6 www.sap-press.de/4103 »Mit dem Applikationslog arbeiten« »Einleitung« Inhaltsverzeichnis Index Die Autoren Leseprobe weiterempfehlen SAP-Wissen aus erster Hand.

Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

LeseprobeProtokolle und Meldungen des SAP-Systems strukturiert aufzubewahren ist eine Herausforderung. In dieser Leseprobe erfahren Sie, wie Sie diese mit dem Applikationslog bewältigen können. Sie lernen einfache, aber wirkungsvolle Konzepte für Entwicklung und Wartung kennen – kurz: die besten Rezepte für die Arbeit mit Meldungen und Protokollen!

Enno Wulff, Maic Haubitz, Dennis Goerke, Sascha Seegebarth, Udo Tönges

Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler718 Seiten, gebunden, 2. Auflage 2016 69,90 Euro, ISBN 978-3-8362-4107-6

www.sap-press.de/4103

»Mit dem Applikationslog arbeiten«»Einleitung«

Inhaltsverzeichnis

Index

Die Autoren

Leseprobe weiterempfehlen

SAP-Wissen aus erster Hand.

Page 2: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

249

Kapitel 7

Protokolle und Meldungen strukturiert aufzubewahren ist eine Herausforderung. Wie Sie diese mit dem Applikationslog bewältigen können, zeigen wir Ihnen in diesem Kapitel.

7 Mit dem Applikationslog arbeiten

Vielleicht kommen Ihnen eine oder mehrere der folgenden Situatio-nen bekannt vor:

� Job-Protokolle werden nie kontrolliert. Wenn man ein Job-Proto-koll doch einmal benötigt, ist es bereits gelöscht.

� Sollten die Job-Protokolle doch vorhanden sein, sind es so vieleund so umfangreiche Protokolle, dass die Suche nach einer Infor-mation der Suche nach der viel zitierten Nadel im Heuhaufengleichkommt.

� Ein Anwender bekommt im Zuge einer von ihm durchgeführtenAktion routinemäßig mehrere Meldungen und drückt dieseebenso routiniert mit einem beherzten Klick auf OK weg. Späterstellt er fest, dass etwas Unvorhergesehenes passiert ist.

Diesen und diversen weiteren Situationen können Sie durch die Nut-zung des Applikationslogs entgegentreten. Das Applikationslog ist einFramework, bestehend aus mehreren Tabellen, einem ApplicationProgramming Interface (API) in Form diverser Funktionsbausteine undeinigen Transaktionen. Dieses Framework kann genutzt werden, umsowohl transiente (also nur im Hauptspeicher gehaltene) als auch per-sistente (in der Datenbank speicherbare) Protokolle anzulegen. Diesekönnen einfach gehalten (reine Ablage von Meldungen), aber auchsehr komplex gestaltet sein (interaktives Protokoll).

7.1 Schnittstelle

Schnittstellen-bausteine

Die API-Bausteine, mit denen wir in den folgenden Abschnittenarbeiten werden, finden Sie in folgenden Funktionsgruppen:

4107-6.book Seite 249 Donnerstag, 7. Juli 2016 1:30 13

Page 3: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

250

� SBAL: Zugriffsbausteine für Meldungen und Protokollkopfdaten

� SBAL_DB: Datenbankzugriffe (Protokolle speichern, lesen, löschen etc.)

� SBAL_DISPLAY: Protokolle anzeigen

Darüber hinaus gibt es weitere Funktionsgruppen, deren Bausteineeinen erweiterten Zugriff auf Applikationslogs ermöglichen. Für denalltäglichen Bedarf sollten die hier genannten Funktionsgruppenjedoch vorerst ausreichen. Für die Bedienung der API werden Daten-elemente, Strukturen und Tabellentypen ausgeliefert. Diese sind andem Präfix BAL bzw. BAL_S (Strukturen) und BAL_T (Tabellentypen)zu erkennen.

7.2 Begriffsklärung

Da die Begriffe rund um das Applikationslog teilweise sehr verwir-rend sein können, wollen wir an dieser Stelle etwas Klarheit schaffen.

Objekt/Unterobjekt

Anhand von Objekten und Unterobjekten werden Protokolle kategori-siert. Protokolle, die auf der Datenbank gespeichert werden sollen,müssen einem Objekt sowie einem Unterobjekt zugeordnet werden.Ein Protokoll ist genau einem Objekt und Unterobjekt zugeordnet;über diese Informationen ist das Protokoll in der Auswertungstrans-aktion SLG1 leicht aufzufinden. Objekte und Unterobjekte werdenim Customizing (Transaktion SLG0; siehe unten) gepflegt.

ExterneIdentifikation

Die externe Identifikation ist ein 100-stelliges Textfeld, das mit belie-bigen Werten gefüllt werden darf. In der Praxis hat es sich bewährt,dieses mit sprechenden Wertbezeichnungen zu belegen, um abge-legte Protokolle leichter finden zu können. Wenn ein Protokoll nichtauf der Datenbank abgelegt werden soll, ist die Angabe einer exter-nen Identifikation bei der Anlage des Protokolls ausreichend.

Protokoll-Handle Das Protokoll-Handle (Datenelement BALLLOGHNDL) wird benötigt, umein Protokoll innerhalb eines Programms zu manipulieren, also umNachrichten hinzuzufügen, zu löschen etc. Es wird von dem jeweilsverwendeten API-Baustein erstellt.

Protokollnummer Die Protokollnummer (Datenelement BALOGNR) identifiziert das Proto-koll auf der Datenbank. Sie wird dementsprechend auch benötigt,um ein bereits abgelegtes Protokoll erneut zu lesen.

4107-6.book Seite 250 Donnerstag, 7. Juli 2016 1:30 13

Transiente Protokolle 7.3

251

ProblemklasseDie Problemklasse (Datenelement BALPROBCL) dient der Klassifizie-rung der Wichtigkeit eines Protokolleintrags:

� 1 sehr wichtig

� 2 wichtig

� 3 mittel

� 4 Zusatzinformationen (Default)

Die Problemklasse erhält ihre besondere Bedeutung bei persistentenProtokollen, da im Einstiegsbild der Auswertungstransaktion bereitsnach der Wichtigkeit des Protokolls eingeschränkt werden kann;diese wiederum ergibt sich aus der höchsten Problemklasse der imProtokoll erfassten Nachrichten.

7.3 Transiente Protokolle

Protokoll im Hauptspeicher

Als erstes einfaches Beispiel werden wir ein Protokoll lediglich imHauptspeicher halten. Die gezeigte Variante können Sie wählen, umeinem Anwender das Ergebnis eines von ihm ausgelösten, komple-xen automatisierten Vorgangs in ansprechender Form zu präsen-tieren.

1. Legen Sie ein Testprogramm mit Transaktion SE38 bzw. SE80 an.

2. Fügen Sie die folgenden Datendeklarationen ein:

DATA gs_log TYPE bal_s_log.DATA gv_log_handle TYPE balloghndl.DATA gs_msg TYPE bal_s_msg.

3. Legen Sie mit dem Coding aus Listing 7.1 ein neues Applikations-log an.

gs_log-extnumber = 'AppLog-Test'.CALL FUNCTION 'BAL_LOG_CREATE'

EXPORTINGi_s_log = gs_log

IMPORTINGe_log_handle = gv_log_handle.

Listing 7.1 Applikationslog anlegen

In den Kopfdaten wird lediglich die externe ID versorgt. Das vomFunktionsbaustein BAL_LOG_CREATE an das Programm zurückgelie-

4107-6.book Seite 251 Donnerstag, 7. Juli 2016 1:30 13

Page 4: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

252

ferte Protokoll-Handle wird für die weitere Verarbeitung vonApplikationsprotokollen im Hauptspeicher benötigt.

4. Fügen Sie dem Protokoll eine T100-Nachricht hinzu, wie in Listing7.2 zu sehen.

gs_msg-msgty = 'S'.gs_msg-msgid = '00'.gs_msg-msgno = '002'.gs_msg-probclass = '3'.CALL FUNCTION 'BAL_LOG_MSG_ADD'

EXPORTINGi_log_handle = gv_log_handlei_s_msg = gs_msg.

Listing 7.2 T100-Nachricht dem Applikationslog hinzufügen

Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen denNamen der Struktur SYST, sodass eine zuvor via MESSAGE ausge-löste Nachricht durch eine einfache MOVE-CORRESPONDING-Anwei-sung in die Struktur übernommen werden kann. Dem Protokollkönnen jedoch nicht nur T100-Nachrichten hinzugefügt werden,sondern auch Freitextmeldungen. Dies zeigt Listing 7.3.

CALL FUNCTION 'BAL_LOG_MSG_ADD_FREE_TEXT'EXPORTING

i_log_handle = gv_log_handlei_msgty = 'S'i_text = 'Frei hinzugefügter Text'.

Listing 7.3 Freitextnachricht dem Applikationslog hinzufügen

5. Abschließend lassen Sie sich das Protokoll anzeigen:

CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'.

Ergebnis desTestprogramms

Der DISPLAY-Baustein wird hier in der einfachsten Form aufgerufen.Über die Parametrisierung und Filterkriterien können Sie dieAnzeige auf bestimmte Protokolle bzw. Meldungen einschränken(z. B. bei Verwendung mehrerer Protokolle gleichzeitig), worauf wirin Abschnitt 7.7, »Protokollausgabe anpassen«, noch genauer einge-hen. Lassen Sie das Testprogramm laufen. Die Anzeige sollte der inAbbildung 7.1 entsprechen. Im oberen Teil des Bildes sehen Sie dieProtokollkopfdaten sowie eine Zusammenfassung auf Basis der Pro-blemklassen. Der untere Teil zeigt die im Protokoll enthaltenenNachrichten. Die erste protokollierte Nachricht hat einen Langtext,

4107-6.book Seite 252 Donnerstag, 7. Juli 2016 1:30 13

Persistente Protokolle 7.4

253

dies ist am Icon in der Spalte Ltxt erkennbar. Der Langtext wirdangezeigt, sobald Sie auf das Icon klicken.

Abbildung 7.1 Protokollanzeige

7.4 Persistente Protokolle

Protokoll für Tickets

Wir werden für jedes Ticket, das in unserem Ticketsystem erfasstwird, ein Applikationsprotokoll anlegen. Ändert sich das Ticket (z. B.der Status), wird dies im zugehörigen Protokoll festgehalten. DaNachrichten, die in ein Protokoll geschrieben werden, automatischdas aktuelle Datum und die Uhrzeit sowie den ausführenden Benut-zer enthalten, erhalten wir ein aussagekräftiges Protokoll zum Ticket.

In diesem Abschnitt werden wir außerdem den Zugriff auf das Appli-kationslog in Klassen kapseln, die uns den Umgang mit dem Proto-koll erleichtern.

Wozu dient die Kapselung in Klassen?

In der Praxis gehen die zu protokollierenden Nachrichten in unterschied-lichsten Formaten ein, z. B.:

� mittels MESSAGE-Anweisung erzeugte T100-Nachrichten

� über Exception-Objekte (klassenbasierte Ausnahmen), die das Inter-face IF_T100_MESSAGE implementieren

� über herkömmliche Ausnahmen, die mit einer T100-Nachricht ausge-löst werden

� als Rückgaben von Business Application Programming Interfaces (BAPIs) in verschiedenen Formaten (BAPIRET1, BAPIRET2, BAPIRETURN etc.)

4107-6.book Seite 253 Donnerstag, 7. Juli 2016 1:30 13

Page 5: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

254

Um diese Meldungen in einem Applikationslog speichern zu können,müssen sie zunächst in das Format BAL_S_LOG konvertiert und dann demProtokoll hinzugefügt werden. Diese Konvertierungen machen dasCoding schnell unübersichtlich und damit schwer zu pflegen. Die Idee istdaher, die Konvertierung in Methoden zu kapseln und den entstehendenOverhead dadurch auf ein Minimum zu begrenzen. Mit den in der Folgevorgestellten Klassen ist es möglich, Konvertierung und Logging in nurzwei Codezeilen zu realisieren, ab SAP-NetWeaver-Release 7.02 sogar innur einer Zeile.

7.4.1 Objekt und Unterobjekt anlegen

Protokolle, die in der Datenbank abgelegt werden sollen, müsseneinem Objekt und Unterobjekt zugeordnet werden. Über diese Kom-bination können die abgelegten Protokolle später leicht gefundenund analysiert werden.

Transaktion SLG0:Objektpflege

Sie sind dabei nicht auf die im Standardsystem ausgeliefertenObjekte und Unterobjekte festgelegt, sondern können diese beliebigselbst anlegen:

1. Starten Sie Transaktion SLG0.

2. Sie werden darauf hingewiesen, dass die zu pflegende Tabellemandantenunabhängig ist. Bestätigen Sie den Hinweis. Sie befin-den sich nun im Startbild der Objektpflege (siehe Abbildung 7.2).

Abbildung 7.2 Transaktion SLG0 – Einstiegsbild

4107-6.book Seite 254 Donnerstag, 7. Juli 2016 1:30 13

Persistente Protokolle 7.4

255

3. Stellen Sie sicher, dass im Navigationsbaum auf der linken Seiteder Eintrag Objekte markiert ist.

4. Klicken Sie auf Neue Einträge, und Sie gelangen zur Anlage neuerApplikationslog-Objekte.

5. Legen Sie das Objekt ZBOOK mit dem Objekttext »Protokolle zumBuch« an (siehe Abbildung 7.3).

Abbildung 7.3 Objekt hinzufügen

6. Drücken Sie (¢), und gehen Sie mit (F3) zurück in die Übersicht.Positionieren Sie den Cursor auf dem neu hinzugefügten Objekt,und markieren Sie den Eintrag. Klicken Sie dann doppelt aufUnterobjekte auf der linken Seite.

7. Klicken Sie hier wieder auf Neue Einträge, und legen Sie dasUnterobjekt ZTICKET mit dem Unterobjekttext »Protokolle desTicketsystems« an.

8. Bestätigen Sie mit (¢), und gehen Sie mit (F3) zurück zur Über-sicht.

9. Speichern Sie Ihre Eingaben (Sie benötigen einen transportierba-ren Workbench-Auftrag), und verlassen Sie die Transaktion.

Verbindung zum Ticket herstellen

Die Ticketnummer wird immer als externe Identifikation zum Proto-koll genutzt. Damit ist das Protokoll zum Ticket eindeutig identifi-zierbar, und es besteht keine Notwendigkeit, die Datenbanktabelleum ein weiteres Feld (nämlich die Protokollnummer) zu erweitern,um eine Verbindung zum Ticket herzustellen.

4107-6.book Seite 255 Donnerstag, 7. Juli 2016 1:30 13

Page 6: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

256

7.4.2 Zugriffsklassen anlegen

Der Zugriff auf das Anwendungsprotokoll wird über zwei Klassenhergestellt – Nachrichten- und Protokollklasse –, die zum einen denZugriff auf das Protokoll steuern und es andererseits erlauben, Mel-dungen einfach hinzuzufügen.

Nachrichtenklasse

Nachrichten-instanzen

Jede Instanz der Nachrichtenklasse entspricht einer Nachricht. Siedient dazu, die auflaufenden Nachrichten zu »normalisieren«, sodasssie in einem Programm wie dem Ticketsystem einfacher gesammeltwerden können. Diese Klasse implementieren Sie wie folgt:

1. Starten Sie Transaktion SE24.

2. Geben Sie im Feld Objekttyp »ZCL_BOOK_TICKET_LOG_MSG«ein, und drücken Sie (F5).

3. Füllen Sie den Dialog Anlegen Klasse mit den Werten aus Abbil-dung 7.4, und drücken Sie (¢). Achten Sie darauf, dass die Instanz-erzeugung auf 0 Private gestellt ist. Dadurch ist es nur der Klasseselbst möglich, Instanzen von sich zu erzeugen.

Abbildung 7.4 Eigenschaften der Nachrichtenklasse

4. Legen Sie das Attribut GS_MSG mit den Feldwerten aus Abbil-dung 7.5 an. In diesem Attribut werden die Nachrichtendatengespeichert.

4107-6.book Seite 256 Donnerstag, 7. Juli 2016 1:30 13

Persistente Protokolle 7.4

257

Abbildung 7.5 Attribute der Nachrichtenklasse

5. Legen Sie die Konstruktormethode CONSTRUCTOR an. Übergeben Siedieser einen Import-Parameter IV_TIKNR, wie in Abbildung 7.6dargestellt.

Abbildung 7.6 Parameter des Konstruktors

6. Implementieren Sie den Konstruktor mit dem Coding aus Lis-ting 7.4.

METHOD constructor.me->gs_msg = is_msg.get_probclass( ).

ENDMETHOD.

Listing 7.4 Coding des Konstruktors der Nachrichtenklasse

Die übergebene Meldung wird damit in das dafür vorgeseheneInstanzattribut übernommen, anschließend wird die Problem-klasse per Aufruf einer Methode ermittelt, die wir im nächstenSchritt anlegen.

7. Legen Sie die private Instanzmethode GET_PROBCLASS an, die keineParameter benötigt. Implementieren Sie die Methode wie in Lis-ting 7.5.

METHOD get_probclass.CASE me->gs_msg-msgty.

WHEN 'S'.me->gs_msg-probclass = '4'. " Zusatzinfo

WHEN 'I'.me->gs_msg-probclass = '3'. " Mittel

WHEN 'W'.me->gs_msg-probclass = '2'. " Wichtig

WHEN 'E' OR 'A' OR 'X'.me->gs_msg-probclass = '1'. " Sehr wichtig

4107-6.book Seite 257 Donnerstag, 7. Juli 2016 1:30 13

Page 7: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

258

ENDCASE.ENDMETHOD.

Listing 7.5 Methode GET_PROBCLASS implementieren

Die Problemklasse der Nachricht wird abhängig vom Nachrichtentypgesetzt, wobei Fehler- und Abbruchnachrichten als sehr wichtigeNachrichten behandelt werden; andere Nachrichten haben hingegengeringere Priorität.

Zugriffsmethodendefinieren

Um Instanzen der Klasse außerhalb der Klasse nutzen zu können, benö-tigen wir Zugriffsmethoden. Wir werden nun zwei statische Methodenerzeugen, die zu unterschiedlichen Arten von zu sammelnden Nach-richten jeweils eine Instanz erzeugen und an den Aufrufer zurücklie-fern. Die erste Methode wird dazu eine zuvor über einen MESSAGE-Befehl erzeugte Nachricht aus den Feldern von SYST bzw. SY lesen:

1. Legen Sie die öffentliche statische Methode CREATE_SYMSG an. DieParametrisierung entnehmen Sie Abbildung 7.7.

Abbildung 7.7 Parameter CREATE_SYMSG

2. Implementieren Sie die Methode, wie in Listing 7.6 gezeigt.

METHOD create_symsg.DATA ls_msg TYPE bal_s_msg.MOVE-CORRESPONDING sy TO ls_msg.CREATE OBJECT rr_msg

EXPORTING is_msg = ls_msg.ENDMETHOD.

Listing 7.6 Coding der Methode CREATE_SYMSG

Die zuvor über den MESSAGE-Befehl erzeugte Nachricht wird ausden Feldern der Struktur SY in die Nachrichtenstruktur übertra-gen. Mit der Nachrichtenstruktur erzeugen Sie dann die Instanzund geben diese an den Aufrufer zurück.

MethodeCREATE_BAPIRET2

Die zweite Zugriffsmethode nimmt das Ergebnis eines BAPI-Aufrufsentgegen und erzeugt dazu eine Instanz. BAPIs geben ihr Ergebnis

4107-6.book Seite 258 Donnerstag, 7. Juli 2016 1:30 13

Persistente Protokolle 7.4

259

häufig als Struktur des Typs BAPIRET2 zurück, den wir für unser Bei-spiel verwenden.

1. Legen Sie die öffentliche statische Methode CREATE_BAPIRET2 an.Die Parametrisierung entnehmen Sie Abbildung 7.8.

Abbildung 7.8 Parameter CREATE_BAPIRET2

2. Implementieren Sie die Methode mit dem Coding aus Listing 7.7.

METHOD create_bapiret2.DATA ls_msg TYPE bal_s_msg.ls_msg-msgty = is_msg-type.ls_msg-msgid = is_msg-id.ls_msg-msgno = is_msg-number.ls_msg-msgv1 = is_msg-message_v1.ls_msg-msgv2 = is_msg-message_v2.ls_msg-msgv3 = is_msg-message_v3.ls_msg-msgv4 = is_msg-message_v4.CREATE OBJECT rr_msg

EXPORTINGis_msg = ls_msg.

ENDMETHOD.

Listing 7.7 Methode CREATE_BAPIRET2 implementieren

Die Nachrichtendaten werden aus der BAPIRET2-Struktur in dieApplikationslog-Struktur übernommen, die Instanz wird erzeugtund an den Aufrufer zurückgegeben.

Nachricht auslesenAbschließend benötigen wir eine Methode zum Auslesen der Nach-richt. Legen Sie die öffentliche Instanzmethode GET_MSG an. Die Para-meter entnehmen Sie Abbildung 7.9, die Implementierung Listing 7.8.

Abbildung 7.9 Parameter GET_MSG

4107-6.book Seite 259 Donnerstag, 7. Juli 2016 1:30 13

Page 8: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

260

METHOD get_msg.rs_msg = me->gs_msg.

ENDMETHOD.

Listing 7.8 Methode GET_MSG implementieren

Sie haben nun eine Klasse angelegt, deren Instanzen jeweils eineNachricht speichern. Die Instanzerzeugung erfolgt über zwei Zugriffs-methoden, die die Nachricht aus unterschiedlichen Quellen lesen.

Protokollklasse

Klasse anlegen Die Protokollklasse bildet das Applikationsprotokoll ab. Sie müssendazu eine Instanz zu jedem Ticket erzeugen, was wiederum nur ausder Klasse selbst möglich ist.

1. Starten Sie Transaktion SE24. Geben Sie im Feld Objekttyp »ZCL_BOOK_TICKET_LOG« ein, und drücken Sie (F5).

2. Sie gelangen in den Dialog Anlegen Klasse, in dem Sie die Einstel-lungen aus Abbildung 7.10 vornehmen und mit (¢) bestätigen.Achten Sie auch hier darauf, dass die Instanzerzeugung auf 0 Pri-

vate gestellt ist. Auf diese Weise ist es nur der Klasse selbst mög-lich, Instanzen von sich zu erzeugen.

Abbildung 7.10 Eigenschaften der Protokollklasse

3. Klicken Sie auf Lokale Typen, bzw. drücken Sie (Strg)+(F5), umdie Tabellentypen der Protokollklasse lokal zu definieren. FügenSie das Coding aus Listing 7.9 ein:

4107-6.book Seite 260 Donnerstag, 7. Juli 2016 1:30 13

Persistente Protokolle 7.4

261

TYPES: BEGIN OF gys_inst,

tiknr TYPE zbook_ticket_nr,o_inst TYPE REF TO zcl_book_ticket_log,

END OF gys_inst,gyt_inst TYPE HASHED TABLE OF gys_inst

WITH UNIQUE KEY tiknr.

Listing 7.9 Lokale Typdefinitionen der Protokollklasse

Sie legen damit einen Tabellentyp an, auf den im nächsten Schrittein statisches Attribut als Instanzenpuffer typisiert wird.

4. Legen Sie die Attribute der Klasse gemäß Abbildung 7.11 an:

– TIKNR: Dieses Attribut enthält die Nummer des Tickets, zu demdas Protokoll angelegt wurde.

– LOGNR: Dies ist die Nummer, unter der das Protokoll auf derDatenbank abgespeichert wurde.

– LOG_HANDLE: Mit diesem Handle können die API-Bausteine aufdas Protokoll zugreifen.

– T_INST: Tabelle der bereits erzeugten Protokollinstanzen. DieFactory-Methode wird diese Tabelle nutzen, um festzustellen,ob bereits eine Instanz zu einem gegebenen Ticket vorhandenist, und diese zurückgeben bzw. eine neue Instanz anlegen undin dieser Tabelle eintragen.

– CONTROL_HANDLE: Die Ausgabe der Nachrichten wird in diesemBeispiel über einen neuen Funktionsbaustein gesteuert, dereine Ausgabe in einem beliebigen GUI-Container gestattet. Umdiese Ausgabe zu steuern, benötigen wir dieses weitere Handle.

– R_CONTAINER: Dieses Attribut ist die Referenz auf den GUI-Con-tainer, in dem die Ausgabe erfolgen soll.

– STATUS: Dieses Attribut speichert den Status der zum Protokollgehörenden Tickets. Es wird erst später benötigt, kann aber hierbereits angelegt werden.

Abbildung 7.11 Attribute der Protokollklasse

4107-6.book Seite 261 Donnerstag, 7. Juli 2016 1:30 13

Page 9: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

262

5. Legen Sie einen Konstruktor an, und parametrisieren Sie diesenwie in Abbildung 7.12.

Abbildung 7.12 Parameter des Konstruktors

6. Implementieren Sie den Konstruktor, wie in Listing 7.10 gezeigt.

METHOD constructor.DATA lt_lognumber TYPE bal_t_logn.DATA lt_log_handle TYPE bal_t_logh.DATA ls_lfil TYPE bal_s_lfil.DATA ls_extn TYPE bal_s_extn.DATA ls_obj TYPE bal_s_obj.DATA ls_sub TYPE bal_s_sub.DATA lt_logheader TYPE balhdr_t.DATA ls_logheader TYPE balhdr.DATA ls_log TYPE bal_s_log.me->tiknr = iv_tiknr.

ls_log-object = 'ZBOOK'.ls_log-subobject = 'ZTICKET'.ls_log-extnumber = me->tiknr.ls_extn-sign = ls_obj-sign

= ls_sub-sign = 'I'.ls_extn-option = ls_obj-option

= ls_sub-option = 'EQ'.ls_extn-low = ls_log-extnumber.ls_obj-low = ls_log-object.ls_sub-low = ls_log-subobject.APPEND

: ls_extn TO ls_lfil-extnumber, ls_obj TO ls_lfil-object, ls_sub TO ls_lfil-subobject.

CALL FUNCTION 'BAL_DB_SEARCH'EXPORTINGi_s_log_filter = ls_lfil

IMPORTINGe_t_log_header = lt_logheader.

IF NOT lt_logheader IS INITIAL.

4107-6.book Seite 262 Donnerstag, 7. Juli 2016 1:30 13

Persistente Protokolle 7.4

263

READ TABLE lt_logheader INTO ls_logheaderINDEX 1.

APPEND ls_logheader-lognumber TO lt_lognumber.CALL FUNCTION 'BAL_DB_LOAD'

EXPORTINGi_t_lognumber = lt_lognumber

IMPORTINGe_t_log_handle = lt_log_handle.

READ TABLE lt_log_handle INTO me->log_handle INDEX 1.ELSE.

CALL FUNCTION 'BAL_LOG_CREATE'EXPORTINGi_s_log = ls_log

IMPORTINGe_log_handle = me->log_handle.

ENDIF.

SELECT SINGLE statusFROM zbook_ticketINTO me->statusWHERE tiknr = me->tiknr.

ENDMETHOD.

Listing 7.10 Konstruktor der Protokollklasse implementieren

Um das Protokoll zum Ticket zu finden, wird der FunktionsbausteinBAL_DB_SEARCH benutzt. (Nähere Informationen zur Verwendung die-ses Bausteins finden Sie in Abschnitt 7.8, »Erweiterte Möglichkeitendes Applikationslogs«.) Wurde bereits ein Protokoll zum Ticket er-zeugt (d. h., der Baustein liefert ein Protokoll zurück), kann diesesdirekt mit dem API-Baustein BAL_DB_LOAD geöffnet werden. Ansons-ten wird das Protokoll mit dem API-Baustein BAL_LOG_CREATE neuerzeugt. Diesen Baustein kennen Sie bereits aus dem ersten einfachenBeispiel. An dieser Stelle werden dem Baustein jedoch nicht nur eineexterne Identifikation, sondern zusätzlich auch das in Abschnitt7.4.1, »Objekt und Unterobjekt anlegen«, angelegte Objekt und Un-terobjekt übergeben. Dies bewirkt, dass das Protokoll in der Daten-bank abgelegt werden kann.

Das vom jeweiligen Baustein zurückgelieferte Protokoll-Handle wirdin beiden Fällen in das Instanzattribut LOG_HANDLE übernommen. AlsResultat befinden sich alle für den Zugriff auf das Protokoll benötig-ten Daten in den Attributen der Instanz.

4107-6.book Seite 263 Donnerstag, 7. Juli 2016 1:30 13

Page 10: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

264

MethodeGET_INSTANCE

Legen Sie anschließend die öffentliche statische Methode GET_INSTANCE an. Diese wird als Factory-Methode der Klasse dienen unddamit in der Lage sein, Instanzen der Klasse anzulegen und an denAufrufer zu liefern. Parametrisieren Sie die Methode wie in Abbil-dung 7.13.

Abbildung 7.13 Parameter der Methode GET_INSTANCE

Implementieren Sie die Methode GET_INSTANCE, wie in Listing 7.11gezeigt.

METHOD get_instance.DATA ls_inst TYPE gys_inst.READ TABLE t_inst INTO ls_inst

WITH TABLE KEYtiknr = iv_tiknr.

IF sy-subrc <> 0.CREATE OBJECT ls_inst-o_instEXPORTING

iv_tiknr = iv_tiknr.ls_inst-tiknr = iv_tiknr.INSERT ls_inst INTO TABLE t_inst.

ENDIF.ro_log = ls_inst-o_inst.

ENDMETHOD.

Listing 7.11 Methode GET_INSTANCE der Protokollklasse implementieren

Die Methode versucht, die benötigte Instanz zunächst in der Instan-zentabelle zu finden. War die Suche nicht erfolgreich, wird die In-stanz angelegt und in der Instanzentabelle eingetragen. Die Referenzauf die gewünschte Instanz wird dann an den Aufrufer zurückge-geben.

MethodeADD_MSG anlegen

Legen Sie außerdem die öffentliche Instanzmethode ADD_MSG an.Diese Methode wird eine Nachricht entgegennehmen und dem Pro-tokoll hinzufügen. Parametrisieren Sie die Methode wie in Abbil-dung 7.14.

4107-6.book Seite 264 Donnerstag, 7. Juli 2016 1:30 13

Persistente Protokolle 7.4

265

Abbildung 7.14 Parameter ADD_MSG

Implementieren Sie die Methode, wie in Listing 7.12 gezeigt.

METHOD add_msg.DATA ls_msg TYPE bal_s_msg.ls_msg = ir_msg->get_msg( ).CALL FUNCTION 'BAL_LOG_MSG_ADD'

EXPORTINGi_log_handle = me->log_handlei_s_msg = ls_msg.

ENDMETHOD.

Listing 7.12 Methode ADD_MSG implementieren

Die Methode liest die Nachricht aus der übergebenen Nachrich-teninstanz und fügt sie mit dem API-Baustein BAL_LOG_MSG_ADD demProtokoll hinzu.

Methode SAVE anlegen

Legen Sie die öffentliche Instanzmethode SAVE an, die es ermögli-chen wird, das Protokoll zu speichern. Die Methode benötigt keineParameter. Implementieren Sie die Methode wie in Listing 7.13.

METHOD save.DATA lt_log_handle TYPE bal_t_logh.DATA lt_log_nrs TYPE bal_t_lgnm.DATA ls_log_nrs TYPE bal_s_lgnm.

APPEND me->log_handle TO lt_log_handle.CALL FUNCTION 'BAL_DB_SAVE'

EXPORTINGi_t_log_handle = lt_log_handle

IMPORTINGe_new_lognumbers = lt_log_nrs.

IF me->lognr IS INITIAL.READ TABLE lt_log_nrs INTO ls_log_nrs

INDEX 1.me->lognr = ls_log_nrs-lognumber.

ENDIF.ENDMETHOD.

Listing 7.13 Methode SAVE implementieren

4107-6.book Seite 265 Donnerstag, 7. Juli 2016 1:30 13

Page 11: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

266

An dieser Stelle wird der API-Baustein BAL_DB_SAVE verwendet. Die-ser nimmt eine Tabelle mit Protokoll-Handles entgegen und spei-chert die zugehörigen Protokolle in der Datenbank. Wurde das Pro-tokoll neu erzeugt, wird die neu vergebene Protokollnummer in dementsprechenden Instanzattribut und in der Tickettabelle abgelegt.

Methode SET_CONTAINER

Legen Sie als Nächstes die öffentliche statische Methode SET_CONTAINER an. Über diese Methode wird der GUI-Container gesetzt,in dem die Ausgabe erfolgen soll. Parametrisieren Sie die Methodewie in Abbildung 7.15.

Abbildung 7.15 Parameter SET_CONTAINER

Implementieren Sie die Methode wie folgt:

METHOD set_container.r_container = ir_container.

ENDMETHOD.

Methode DISPLAY Legen Sie die öffentliche Instanzmethode DISPLAY an, die keine Para-meter benötigt. Bei Aufruf der Methode wird das Protokoll in demzuvor mittels SET_CONTAINER gesetzten GUI-Container angezeigt. Lis-ting 7.14 zeigt die Implementierung der Methode.

METHOD display.DATA lt_log_handle TYPE bal_t_logh.

APPEND me->log_handle TO lt_log_handle.IF control_handle IS INITIAL.

CALL FUNCTION 'BAL_CNTL_CREATE'EXPORTING

i_container = me->r_containeri_t_log_handle = lt_log_handle

IMPORTINGe_control_handle = control_handle.

ELSE.CALL FUNCTION 'BAL_CNTL_REFRESH'EXPORTING

i_control_handle = control_handlei_t_log_handle = lt_log_handle.

4107-6.book Seite 266 Donnerstag, 7. Juli 2016 1:30 13

Persistente Protokolle 7.4

267

ENDIF.ENDMETHOD.

Listing 7.14 Methode DISPLAY implementieren

Methode aufrufenFür die erste Ausgabe (CONTROL_HANDLE ist noch nicht gesetzt) wirdhier der Funktionsbaustein BAL_CNTL_CREATE verwendet, dem derzuvor mittels SET_CONTAINER übergebene GUI-Container sowie dasNachrichten-Handle übergeben werden. Der Baustein gibt das Con-trol-Handle zurück, das im entsprechenden statischen Attributgespeichert wird. Bei jedem weiteren Aufruf der Methode (CONTROL_HANDLE ist gesetzt) wird die Ausgabe mit dem Baustein BAL_CNTL_REFRESH mit den Nachrichten der jeweiligen Instanz aufgefrischt.

Zugriffsklassen ausführen

Der Quellcode-Ausschnitt in Listing 7.15 demonstriert die Ausfüh-rung der Nachrichten und der Kontrollklasse.

DATA gr_log TYPE REF TO zcl_book_ticket_log.DATA gr_msg TYPE REF TO zcl_book_ticket_log_msg.DATA gv_status TYPE zbook_ticket_status.DATA gv_msg TYPE string.DATA gr_cont TYPE REF TO cl_gui_custom_container.

PARAMETERS:p_tiknr TYPE zbook_ticket_nr OBLIGATORY,p_status TYPE zbook_ticket_status OBLIGATORY.

[...]gr_log = zcl_book_ticket_log=>get_instance(

iv_tiknr = p_tiknr).MESSAGE i000 WITH p_tiknr gv_status p_status

INTO gv_msg.gr_msg = zcl_book_ticket_log_msg=>create_symsg( ).gr_log->add_msg( ir_msg = gr_msg).gr_log->save( ).COMMIT WORK.gr_log->set_container( gr_cont ).gr_log->display().

Listing 7.15 Einsatz der Applikationslog-Klassen

Command Chaining ab SAP NetWeaver 7.02

In Listing 7.15 wird zunächst eine Instanz der Nachrichtenklasse erzeugtund die Referenz in einem zweiten Schritt an das Protokoll übergeben.Mit dem ab SAP-NetWeaver-Release 7.02 verfügbaren Command Chai-ning (Verkettung von Programmierbefehlen) kann auf die Referenzvaria-ble GR_MSG verzichtet werden.

4107-6.book Seite 267 Donnerstag, 7. Juli 2016 1:30 13

Page 12: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

268

Das ursprüngliche Coding lautet:

gr_msg = zcl_book_ticket_log_msg=>create_symsg( ).gr_log->add_msg( ir_msg = gr_msg).

Das Coding mit Nutzung des Command Chainings lautet:

gr_log->add_msg( ir_msg =zcl_book_ticket_log_msg=>create_symsg( ) ).

Intern wird hier zunächst die Methode CREATE_SY_MSG aufgerufen unddas Ergebnis (also eine Instanz der Klasse ZCL_BOOK_TICKET_LOG_MSG)dann direkt als Aktualparameter der Methode ADD_MSG verwendet.

Protokollklasse inweiteren Projekten

Die hier vorgestellten Klassen können Sie mit einigen Veränderun-gen leicht in Ihre eigenen Projekte übernehmen. Die Protokollklasseist auf das Beispiel »Ticketsystem« zugeschnitten, lässt sich jedochleicht verallgemeinern:

� Streichen Sie das Attribut TIKNR.

� Ändern Sie die Definition von GYT_INST insofern ab, dass Sieanstelle der Ticketnummer ein Protokoll-Handle als Schlüssel neh-men. Spendieren Sie der Tabelle ein weiteres Feld Protokoll-

nummer.

� Legen Sie eine statische öffentliche Methode CREATE an, die einObjekt und ein Unterobjekt (beide optional) sowie eine externeIdentifikation als Parameter erhält. Diese Methode dient zumAnlegen neuer Protokolle mithilfe des Funktionsbausteins BAL_LOG_CREATE und ist neben GET_INSTANCE eine zweite Factory-Methode. Neue Instanzen müssen in die Instanzentabelle ge-schrieben werden.

� Die Methode GET_INSTANCE erhält anstelle der Ticketnummer zweioptionale Parameter für das Protokoll-Handle und die Protokoll-nummer. Bei Angabe einer Protokollnummer wird das Protokollmit dem Funktionsbaustein BAL_DB_LOAD von der Datenbank ge-lesen.

� Der Konstruktor ist parameterlos und benötigt kein Coding.

� Ändern Sie die Ausgabemethode nach Ihren Vorlieben.

Sie erhalten so ein universell einsetzbares Tool, das Sie obendreindurch Vererbung bei Bedarf noch spezialisieren können (entfernenSie dazu das Kennzeichen Final in den Klasseneigenschaften).

4107-6.book Seite 268 Donnerstag, 7. Juli 2016 1:30 13

Protokolle mit Callbacks 7.5

269

7.5 Protokolle mit Callbacks

Rücksprungdaten ergänzen

Sowohl Protokolle als auch einzelne Nachrichten lassen sich mit Call-backs ausstatten. Dadurch wird es ermöglicht, aus der Protokollan-zeige eine weitere Verarbeitung anzustoßen, z. B. die Anzeige einesBelegs, zu dem Protokolldaten existieren. Dabei wird das jeweiligeObjekt (Protokoll oder Nachricht) mit Rücksprungdaten angereichert:

� Parameter, die das protokollierte Objekt identifizieren

� eine Routine, die als Callback angesprungen werden soll

Die Angabe der Parameter erfolgt in Form beliebig vieler Paare ausParametername und Parameterwert. Der Wert ist typisiert auf dasDatenelement TEXT75 (Datentyp: CHAR, Länge: 75 Zeichen, Klein-schreibung erlaubt). Das bedeutet, dass Sie bei der Ablage numeri-scher Parameterwerte gegebenenfalls auf korrekte Konvertierungachten müssen. Die Angabe von Objektreferenzen o. Ä. ist nichtmöglich.

Zusätzlich zu den durch das Programm definierten Parametern wirdein weiterer Parameter %LOGNUMBER an die Callback-Routine überge-ben. Dieser enthält in der Spalte VALUE die Protokollnummer.

Nachrichten bzw. Protokolle mit Callback bekommen bei der Aus-gabe einen Button, mit dem der Callback ausgelöst wird, d. h., dieRücksprungroutine wird mit den gespeicherten Parametern ausge-führt. Die Rücksprungdaten werden in der Nachrichten- bzw. Proto-kollstruktur abgelegt und mit dieser zusammen gespeichert. DieAngabe eines Callbacks ist daher sowohl bei transienten als auch beipersistenten Protokollen möglich.

Rücksprung-routinen

Mögliche Rücksprungroutinen sind Funktionsbausteine sowie Unter-programme (FORM-Routinen). Methoden objektorientierter Klassenwerden bislang nicht unterstützt.

Auswirkungen des Callbacks auf die hier beschriebenen Klassen

Vielleicht haben Sie sich bis zu diesem Zeitpunkt gefragt, warum Nach-richt und Protokoll in zwei separaten Klassen implementiert wurden,anstatt einfach die in der Nachrichtenklasse implementierten Methodenwie ADD_SYMSG und ADD_BAPIRET2 in der Protokollklasse zu implemen-tieren. Durch die Trennung ist es jedoch möglich, die Nachricht zu bear-beiten, bevor sie dem Protokoll hinzugefügt wird – z. B. durch das Hinzu-fügen eines Callbacks.

4107-6.book Seite 269 Donnerstag, 7. Juli 2016 1:30 13

Page 13: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

270

Im Folgenden zeigen wir nun, wie Sie eine Nachricht mit einem Call-back anreichern können und wie ein Funktionsbaustein aussehenmuss, der als Callback aufgerufen wird.

Nachrichtenklasseerweitern

Zunächst werden wir dazu die Nachrichtenklasse erweitern:

1. Editieren Sie die in Abschnitt 7.4.2, »Zugriffsklassen anlegen«,angelegte Klasse ZCL_BOOK_TICKET_LOG_MSG im Class Builder.

2. Legen Sie die öffentliche Instanzmethode ADD_CALLBACK mit denParametern aus Abbildung 7.16 an. Mit dieser Methode wird dieRücksprungroutine zur Nachricht festgelegt.

Abbildung 7.16 Parameter ADD_CALLBACK

3. Implementieren Sie die Methode ADD_CALLBACK, wie in Listing7.16 gezeigt.

METHOD add_callback.me->gs_msg-params-callback-userexitf = iv_baluef.IF iv_is_form IS INITIAL.

me->gs_msg-params-callback-userexitt = 'F'.ELSE.

me->gs_msg-params-callback-userexitp = iv_baluep.ENDIF.

ENDMETHOD.

Listing 7.16 Coding der Methode ADD_CALLBACK

Der Parameter IV_BALUEF enthält den Namen der aufzurufendenRoutine. Ist der Parameter IV_IS_FORM leer, handelt es sich bei derRoutine um einen Funktionsbaustein, in diesem Fall wird derRücksprungtyp auf F gesetzt. Andernfalls muss eine Angabe desRahmenprogramms zum Unterprogramm im Parameter IV_

BALUEP erfolgen, der Rücksprungtyp bleibt dann leer.

4. Legen Sie die öffentliche Instanzmethode ADD_PARAM mit den Para-metern aus Abbildung 7.17 an. Mit dieser Methode wird je Aufrufein Parameter zum Callback hinzugefügt.

4107-6.book Seite 270 Donnerstag, 7. Juli 2016 1:30 13

Protokolle mit Callbacks 7.5

271

Die generische Typisierung des Parameters IV_PARVALUE auf denBezugstyp C ermöglicht die Übergabe beliebiger zeichenartigerDatenobjekte. Dies ist in der Praxis für die meisten Anwendungs-fälle ausreichend variabel.

Abbildung 7.17 Parameter ADD_PARAM

5. Implementieren Sie die Methode wie in Listing 7.17.

METHOD add_param.DATA ls_par TYPE bal_s_par.ls_par-parname = iv_parname.ls_par-parvalue = iv_parvalue.APPEND ls_par TO me->gs_msg-params-t_par.

ENDMETHOD.

Listing 7.17 Methode ADD_PARAM implementieren

Callback-Funktionsbaustein

Nun benötigen wir noch einen Funktionsbaustein, der als Callbackaufgerufen wird.

1. Starten Sie Transaktion SE37. Geben Sie im Feld Funktionsbau-

stein »Z_BOOK_APPLOG_CB_TICKET_CHANGE« ein, und klickenSie auf Anlegen, bzw. drücken Sie (F5). Füllen Sie die weiterenFelder aus, wie in Abbildung 7.18 dargestellt. Klicken Sie aufSichern, bzw. drücken Sie die (¢)-Taste.

Abbildung 7.18 Callback-Funktionsbaustein anlegen

2. Wechseln Sie auf die Registerkarte Tabellen, und legen Sie dortden Parameter I_T_PARAMS gemäß Abbildung 7.19 an. Achten Sieauf die korrekte Schreibweise des Parameters. Bestätigen Sie den

4107-6.book Seite 271 Donnerstag, 7. Juli 2016 1:30 13

Page 14: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

272

angezeigten Hinweis, dass TABLES-Parameter von Funktionsbau-steinen obsolet sind. Bei der Auslösung des Callbacks aus derAnzeige des Applikationsprotokolls werden die in der Meldunghinterlegten Parameter an I_T_PARAMS übergeben.

Abbildung 7.19 Parameter Callback-Funktionsbaustein

3. Wechseln Sie auf die Registerkarte Quelltext, und geben Sie dasCoding aus Listing 7.18 ein.

DATA lv_tiknr TYPE zbook_ticket_nr.DATA ls_par TYPE spar.

READ TABLE i_t_paramsINTO ls_parWITH KEY param = 'TICKET_NR'.

IF sy-subrc = 0.lv_tiknr = ls_par-value.SET PARAMETER ID 'ZBOOK_TICKET_NR' FIELD lv_tiknr.CALL TRANSACTION 'ZTIK02'.

ENDIF.

Listing 7.18 Coding des Callback-Funktionsbausteins

Damit wird versucht, den Parameter TICKET_NR in der Parame-tertabelle zu finden. Ist diese Suche erfolgreich, enthält das FeldVALUE in der gleichen Zeile der Tabelle die Ticketnummer. Diesewird in den entsprechenden SPA/GPA-Parameter geschrieben unddie Transaktion zum Ändern eines Tickets aufgerufen.

4. Aktivieren Sie den Funktionsbaustein.

Der Quellcode-Ausschnitt in Listing 7.19 demonstriert die Verwen-dung des Callback-Funktionsbausteins.

DATA gr_log TYPE REF TO zcl_book_ticket_log.DATA gr_msg TYPE REF TO zcl_book_ticket_log_msg.DATA gv_msg TYPE string.

MESSAGE i000(zbook_mh) WITH gv_tiknr old new

4107-6.book Seite 272 Donnerstag, 7. Juli 2016 1:30 13

Nachrichten mit Kontext 7.6

273

INTO gv_msg.gr_msg = zcl_book_ticket_log_msg=>create_symsg( ).gr_msg->add_param(

iv_parname = 'TICKET_NR'iv_parvalue = p_tiknr ).

gr_msg->add_callback(iv_baluef = 'Z_BOOK_APPLOG_CB_TICKET_CHANGE' ).

gr_log = zcl_book_ticket_log=>get_instance(iv_tiknr = p_tiknr).

gr_log->add_msg( ir_msg = gr_msg ).gr_log->display( ).

Listing 7.19 Quellcode mit Verwendung von Callbacks

In Listing 7.19 wird zunächst eine Nachrichteninstanz erzeugt. Die-ser wird der Parameter TICKET_NR hinzugefügt, wobei der Wert aufdie Nummer des gerade bearbeiteten Tickets gesetzt wird. Als Call-back-Routine dient der hier angelegte Funktionsbaustein. Die Nach-richt wird dem Ticketprotokoll hinzugefügt, dieses wird anschlie-ßend angezeigt.

Eine beispielhafte Ausgabe des Protokolls sehen Sie in Abbildung7.20. Wenn Sie diese mit Abbildung 7.1 vergleichen, bemerken Sie,dass eine zusätzliche Spalte Detail angezeigt wird, in der ein Icondargestellt wird. Die Callback-Routine (in diesem Fall der Funktions-baustein Z_BOOK_APPLOG_CB_TICKET_CHANGE) wird beim Anklickendieses Icons aufgerufen.

Abbildung 7.20 Eine Nachricht mit Callback-Möglichkeit ausgeben

7.6 Nachrichten mit Kontext

Im Kontext einer Nachricht können zusätzliche Informationen zurNachricht abgelegt werden. Mit einem Kontext ist es möglich, Beleg-nummern oder sonstige das Umfeld der Nachricht betreffendeZusatzdaten zusammen mit der Nachricht zu speichern und späterzur Anzeige zu bringen.

In diesem Abschnitt werden wir jeder Nachricht den aktuellenTicketstatus und den aktuellen Benutzernamen hinzufügen.

4107-6.book Seite 273 Donnerstag, 7. Juli 2016 1:30 13

Page 15: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

274

Verwendung des Kontextes

In Abschnitt 7.7, »Protokollausgabe anpassen«, werden wir den hiererzeugten Kontext verwenden, um die Darstellung des Applikationslogszu verändern.

Dictionary-Struktur

Zunächst müssen Sie eine Dictionary-Struktur anlegen. Diese sorgtdafür, dass die Daten des Kontextes korrekt aufbereitet werden.

1. Legen Sie die Struktur ZBOOK_S_BAL an. Fügen Sie die beiden Fel-der STATUS und USER wie in Abbildung 7.21 ein.

Abbildung 7.21 Felder der Struktur ZBOOK_S_BAL

2. Sichern Sie die Struktur, und aktivieren Sie sie.

Kontext befüllen Die Befüllung des Kontextes nehmen wir direkt in der Methode ADD_MSG der Protokollklasse ZCL_BOOK_TICKET_LOG vor, da wir jede proto-kollierte Nachricht um den Kontext ergänzen wollen. Ersetzen Siedazu das Coding der Methode durch den Inhalt von Listing 7.20.

METHOD add_msg.DATA ls_msg TYPE bal_s_msg,ls_context TYPE zbook_s_bal.ls_msg = ir_msg->get_msg( ).

ls_context-status = status.ls_context-user = sy-uname.ls_msg-context-tabname = 'ZBOOK_S_BAL'.ls_msg-context-value = ls_context.

CALL FUNCTION 'BAL_LOG_MSG_ADD'EXPORTINGi_log_handle = me->log_handlei_s_msg = ls_msg.

ENDMETHOD.

Listing 7.20 Neues Coding der Methode ADD_MSG

4107-6.book Seite 274 Donnerstag, 7. Juli 2016 1:30 13

Protokollausgabe anpassen 7.7

275

Die Nachrichtenstruktur BAL_S_MSG besitzt ein Feld CONTEXT, das aufdie Struktur BAL_S_CONT typisiert ist. Diese Struktur besteht aus denFeldern TABNAME und VALUE. TABNAME wird dabei intern verwendet,um den Inhalt von VALUE zu interpretieren.

In unserem Fall wird der Kontext LS_CONTEXT auf die Struktur ZBOOK_S_BAL typisiert, die wir in Schritt 1 angelegt haben. Die Struktur wirdbefüllt und dann in das Feld VALUE des Kontextes übertragen. In dasFeld TABNAME des Kontextes wird der Name der Dictionary-Struktureingetragen, also ZBOOK_S_BAL.

7.7 Protokollausgabe anpassen

Die Standardausgabe von Applikationslogs haben Sie bereits in Abbil-dung 7.1 kennengelernt. Wir wollen diese Ausgabe nun so anpassen,dass wir die Darstellungsweise in Abbildung 7.22 erhalten:

� Der Baum (oberer Teil der Ausgabe) soll auf der obersten Ebenenach Datum sortiert sein, darunter nach Uhrzeit. Außerdem soll aufder zweiten Ebene der jeweilige Ticketstatus ausgegeben werden.

� In der Tabelle der Nachrichten (unterer Teil der Ausgabe) sollendas Datum und die Uhrzeit der Meldung sowie der Benutzernameund der Meldungstext ausgegeben werden.

Abbildung 7.22 Angepasste Ausgabe des Protokolls

Verbindung zum Kontext

Beachten Sie, dass der Ticketstatus und der Benutzername aus dem in Ab-schnitt 7.6, »Nachrichten mit Kontext«, erzeugten Kontext in die Anzeigeübernommen werden.

4107-6.book Seite 275 Donnerstag, 7. Juli 2016 1:30 13

Page 16: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

276

Anpassungen inMethode DISPLAY

Die notwendigen Anpassungen nehmen wir in der Methode DISPLAYder Nachrichtenklasse ZCL_BOOK_TICKET_LOG vor. Ersetzen Sie dasCoding der Methode durch das aus Listing 7.21.

METHOD display.DATA lt_log_handle TYPE bal_t_logh,ls_profile TYPE bal_s_prof,ls_fcat TYPE bal_s_fcat.APPEND me->log_handle TO lt_log_handle.

CALL FUNCTION 'BAL_DSP_PROFILE_POPUP_GET'IMPORTINGe_s_display_profile = ls_profile.

ls_profile-no_toolbar = 'X'.ls_profile-tree_ontop = 'X'.ls_profile-tree_size = '10'.

* Erste Baumebenels_fcat-ref_table = 'BAL_S_SHOW'.ls_fcat-ref_field = 'MSG_DATE'.APPEND ls_fcat TO ls_profile-lev1_fcat.

* Zweite Baumebenels_fcat-ref_table = 'ZBOOK_S_BAL'.ls_fcat-ref_field = 'STATUS'.APPEND ls_fcat TO ls_profile-lev2_fcat.ls_fcat-ref_table = 'BAL_S_SHOW'.ls_fcat-ref_field = 'MSG_TIME'.APPEND ls_fcat TO ls_profile-lev2_fcat.

* Nachrichtenls_fcat-ref_table = 'BAL_S_SHOW'.ls_fcat-ref_field = 'MSG_DATE'.APPEND ls_fcat TO ls_profile-mess_fcat.ls_fcat-ref_field = 'MSG_TIME'.APPEND ls_fcat TO ls_profile-mess_fcat.

ls_fcat-ref_table = 'ZBOOK_S_BAL'.ls_fcat-ref_field = 'USER'.APPEND ls_fcat TO ls_profile-mess_fcat.

IF control_handle IS INITIAL.CALL FUNCTION 'BAL_CNTL_CREATE'EXPORTING

i_container = me->r_container

4107-6.book Seite 276 Donnerstag, 7. Juli 2016 1:30 13

Protokollausgabe anpassen 7.7

277

i_s_display_profile = ls_profilei_t_log_handle = lt_log_handle

IMPORTINGe_control_handle = control_handle.

ELSE.CALL FUNCTION 'BAL_CNTL_REFRESH'

EXPORTINGi_control_handle = control_handlei_t_log_handle = lt_log_handle.

ENDIF.ENDMETHOD.

Listing 7.21 Neues Coding der Methode DISPLAY

AnzeigensteuerungDie Steuerung der Anzeige erfolgt über ein Anzeigeprofil vom TypBAL_S_PROF, das wir dem Ausgabebaustein übergeben. Als Basis ver-wenden wir ein Standardprofil, das wir zunächst per API-BausteinBAL_DSP_PROFILE_POPUP_GET auslesen und anschließend an unsereAnforderungen anpassen.

Vordefinierte Anzeigeprofile

Im Beispiel verwenden wir das vordefinierte Profil für die Anzeige in Pop-up-Fenstern als Vorlage. Es werden diverse weitere vordefinierte Anzeige-profile ausgeliefert. Diese können Sie über Funktionsbausteine (BAL_DSP_PROFILE_<profil>_GET) abrufen und in Ihren Programmen nutzen.

Parameter-einstellungen

Stellen Sie in Listing 7.21 zunächst die generellen Parameter ein.

� Deaktivieren Sie die Toolbar (NO_TOOLBAR).

� Stellen Sie den Baum oberhalb der Nachrichten dar (TREE_ONTOP).

� Stellen Sie die Größe des Baums auf zehn Zeilen (inklusive Über-schrift) ein (TREE_SIZE).

Anpassungen in Feldkatalogen

Die Anpassungen an Baum und Nachrichtentabelle erfolgen überFeldkataloge vom Typ BAL_T_FCAT. Die Struktur BAL_S_PROF verfügtüber neun Felder zum Anpassen der Baumebenen (LEV1_FCAT bisLEV9_FCAT) sowie das Feld MESS_FCAT zur Anpassung der Feldliste inder Nachrichtenanzeige:

� Erste BaumebeneIn der ersten Baumebene wird das Nachrichtendatum MSG_DATEangezeigt. Dieses wird aus der Anzeigestruktur BAL_S_SHOW über-nommen.

4107-6.book Seite 277 Donnerstag, 7. Juli 2016 1:30 13

Page 17: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

278

� Zweite BaumebeneFür die zweite Ebene wird das Feld STATUS der Struktur ZBOOK_S_BAL übernommen. Das zweite Feld MSG_TIME kommt aus der allge-meinen Anzeigestruktur BAL_S_SHOW.

� NachrichtenanzeigeDatum und Uhrzeit der Nachricht werden aus den Feldern MSG_DATE und MSG_TIME der Ausgabestruktur übernommen. Der Benut-zername USER hingegen wird aus der Struktur ZBOOK_S_BAL, alsodem Nachrichtenkontext, übernommen. Der Nachrichtentextwird automatisch hinzugefügt.

Ausgabeprofilübergeben

Das fertige Ausgabeprofil wird dem Baustein BAL_CNTL_CREATE über-geben. Beim Auffrischen der Anzeige mittels BAL_CNTL_REFRESH ist dieAngabe des Profils nicht mehr möglich und auch nicht notwendig.

Weitere Möglichkeiten des Anzeigeprofils

An dieser Stelle möchten wir Sie auf weitere Felder der Struktur BAL_S_PROF hinweisen, mit denen Sie die Anzeige Ihren Anforderungen entspre-chend anpassen können:

� TITLE: Austausch der Standardüberschrift

� START_COL/START_ROW/END_COL/END_ROW: Die Anzeige erfolgt in ei-nem Pop-up anstelle eines Fullscreens.

� EXT_PUSH1 bis EXT_PUSH4: Fügt Buttons hinzu, über die zusätzlicheFunktionen ausgeführt werden können.

� CLBK*: Diese Felder dienen zur Definition eigener Rücksprungroutinen(z. B. für die Buttons).

7.8 Erweiterte Möglichkeiten des Applikationslogs

An dieser Stelle möchten wir Sie auf weitere Features des Applikati-onslogs bzw. der Schnittstelle aufmerksam machen, die Protokoll-suche und -archivierung. Diese Informationen sollen Ihnen helfen,Ansatzpunkte für Ihre eigenen Projekte zu finden.

Protokolle suchen

FunktionsbausteinBAL_DB_SEARCH

Hin und wieder kann es innerhalb eines Programms notwendig wer-den, gespeicherte Protokolle zu suchen. Dazu steht der Funktions-baustein BAL_DB_SEARCH zur Verfügung.

4107-6.book Seite 278 Donnerstag, 7. Juli 2016 1:30 13

Erweiterte Möglichkeiten des Applikationslogs 7.8

279

Der Baustein nimmt eine Struktur vom Typ BAL_S_LFIL entgegen, inder die Suchparameter in Form von Ranges-Tabellen übergeben wer-den. Ist mehr als eine der Ranges-Tabellen gefüllt, werden die Krite-rien einer logischen Und-Verknüpfung unterzogen.

Die Rückgabe des Bausteins besteht aus einer Tabelle von Protokoll-kopfdaten, der die Protokollnummern entnommen werden können.In dem Beispiel aus Listing 7.22 werden alle Protokolle des ObjektsZBOOK gesucht, die zwischen dem 1.1.2016 und dem 20.1.2016durch Transaktion ZTIK02 erzeugt wurden:

DATA ls_lfil TYPE bal_s_lfil.DATA ls_object LIKE LINE OF ls_lfil-object.DATA ls_altcode LIKE LINE OF ls_lfil-altcode.DATA ls_aldate LIKE LINE OF ls_lfil-aldate.DATA lt_balhdr TYPE balhdr_t.

START-OF-SELECTION.ls_object-sign = 'I'.ls_object-option = 'EQ'.ls_object-low = 'ZBOOK'.APPEND ls_object TO ls_lfil-object.ls_altcode-sign = 'I'.ls_altcode-option = 'EQ'.ls_altcode-low = 'ZTIK02'.APPEND ls_altcode TO ls_lfil-altcode.ls_aldate-sign = 'I'.ls_aldate-option = 'BT'.ls_aldate-low = '20160101'.ls_aldate-high = '20160120'.APPEND ls_aldate TO ls_lfil-aldate.

CALL FUNCTION 'BAL_DB_SEARCH'EXPORTING

i_s_log_filter = ls_lfilIMPORTING

e_t_log_header = lt_balhdr.

Listing 7.22 Protokolle suchen

Archivierung von Protokollen

Archivierungs-objekt BC_SBAL

Veraltete Protokolle werden mit dem Archivierungsobjekt BC_SBALarchiviert. Archivierte Protokolle können immer noch in TransaktionSLG1 gesucht und angezeigt werden. Dazu müssen Sie die Optionaus dem Archiv komplett aufbereiten aktivieren.

4107-6.book Seite 279 Donnerstag, 7. Juli 2016 1:30 13

Page 18: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7 Mit dem Applikationslog arbeiten

280

Für Ihre eigenen Programme stehen die Funktionsbausteine BAL_ARCHIVE_SEARCH und BAL_ARCHIVE_LOAD zum Suchen und Ladenarchivierter Protokolle zur Verfügung.

Beispielprogramme

SAP liefert im Standard diverse Beispielprogramme zu den Applikations-protokollen aus. Sie finden diese über Transaktion SE38, wenn Sie im FeldProgramm »SBAL_DEMO*« eingeben und die Wertehilfe über die Taste(F4) aktivieren.

4107-6.book Seite 280 Donnerstag, 7. Juli 2016 1:30 13

Page 19: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

21

1

Einleitung

Programmierbücher gibt es wie Sand am Meer. Auch Bücher überProgrammierkonzepte, Programmiermethoden sowie die Wartungund Weiterentwicklung von Applikationen findet man zuhauf. Fürden SAP-Bereich gibt es eine ganze Reihe Bücher, die den Lesern dieGrundlagen und Konzepte der ABAP-Programmierung vermittelnmöchten. Warum schreiben wir nun noch ein Buch über SAP-Pro-grammierung? Die Antwort ist einfach: Es gibt aus unserer Sichtnoch kein Buch, das die wichtigsten und am einfachsten nutzbarenProgrammierwerkzeuge in einem SAP-System aus Programmierer-sicht beleuchtet. Die meisten Programmierhandbücher zeigen sehrumfangreich und in großer Detailtiefe, wie Befehle angewandt wer-den und welche Befehlszusätze es gibt. Wir konzentrieren uns in die-sem Buch auf die in der Praxis am häufigsten eingesetzten Befehleund Tools. Darüber hinaus möchten wir Ihnen zeigen, warum dieseWerkzeuge verwendet werden sollten und für welche alltäglichenAufgaben welche Hilfsmittel am einfachsten nutzbar sind.

Einfache Konzepte

Dabei geht es uns nicht um besonders anspruchsvolle Konzepte odersensationelle Ergebnisse. Es geht uns darum, zu zeigen, wie einfacheinige Dinge zu realisieren sind. Und es geht uns darum, wirkungs-volle Konzepte vorzustellen, die einerseits die Entwicklung undandererseits auch die Wartung vereinfachen. Wir werden immerwieder auf die Schlagworte Modularisierung und Wiederverwendbar-keit zurückkommen. Beides sind Konzepte, die in der Programmie-rung heute eigentlich selbstverständlich sein sollten. Dadurch, dassin SAP-Systemen jedoch fast ausschließlich Sonderlösungen entwi-ckelt werden, gerät der Leitgedanke der leichten Wiederverwend-barkeit leicht aus dem Fokus. Die Komplexität des SAP-Systemsmacht es nicht einfacher, zu erkennen, wo gleiche oder ähnlicheFunktionen wie die bereits existierenden oder programmierten ein-setzbar wären.

Vorausgesetzte Kenntnisse

Dieses Buch richtet sich sowohl an erfahrene Programmierer, diegerne an der einen oder anderen Stelle dazulernen möchten, als auchan Programmieranfänger, die sich dafür interessieren, wie bestimmteDinge richtig und einfach programmiert werden können.

4107-6.book Seite 21 Donnerstag, 7. Juli 2016 1:30 13

Page 20: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

Einleitung

22

Kochbuch Das Buch soll Ihnen als Arbeitsbuch, Nachschlagewerk und Ideenge-ber dienen. Wir werden in den folgenden Kapiteln Lösungen zeigenund Konzepte vermitteln, die Ihnen – und Ihren Kollegen – das Lebenleichter machen können. Notwendige Arbeitsschritte wie das Anlegenbestimmter Objekte, die immer wieder durchgeführt werden müssen,werden in Anhang A, »Wiederkehrende Arbeitsschritte«, beschrie-ben. Wenn Sie sich schon etwas in der Entwicklungsumgebung desSAP-Systems auskennen, werden Sie die Anweisungen in diesemBuch auch ohne Hilfe des Anhangs leicht nachvollziehen können. Soll-ten Sie bei einer Anweisung nicht genau wissen, wie diese zu verste-hen ist, können Sie auf die detaillierte Anleitung anhand eines Bei-spielobjekts im Anhang zurückgreifen. Mit diesem Konzept hoffenwir, Ihnen die Lektüre des Buches möglichst einfach zu gestalten.

Rezepte Dieses Buch heißt Kochbuch. Es enthält Rezepte zum Nachkochen. Wirlegen bei den Rezepten besonderen Wert darauf, dass Sie verstehen,warum die vorgestellten Zutaten sinnvoll sind, und darauf, dass Sieihr Zusammenwirken erkennen. Der Titel soll deutlich machen, wasSie erwartet: eine Sammlung von Rezepten für den täglichen Bedarf.Sie können jedes Kapitel separat bearbeiten. In einigen Kapitelnbeziehen wir uns explizit auf andere Kapitel oder Abschnitte. Damitaber genug der Kochmetaphern und zurück zum Programmieren.

Ticketsystem Die Lösungen und Konzepte, die wir in diesem Buch für Sie beschrei-ben, sind nach unserer Erfahrung in vielen Applikationen enthaltenbzw. könnten viele bereits bestehende Programme bereichern, undSie können sie unter Materialien zum Buch auf www.sap-press.de/4103 herunterladen. Wir wollten diese Elemente in diesem Buchnicht einfach nur aneinanderreihen, sondern haben uns eine Bei-spielanwendung ausgedacht, in der alle Elemente ihren Platz haben.Diese Beispielanwendung ist ein Ticketsystem: Es können Service-tickets erfasst werden, und innerhalb eines Tickets können verschie-dene Aktionen durchgeführt werden.

Auf den folgenden Seiten werden Sie zusammen mit uns diese inunseren Augen typische Anwendung erstellen. Ein Ticketsystem isteine praxisnahe Anwendung, die keinerlei Fachwissen über einzelneModule voraussetzt. Es sollte daher für jedermann verständlich undnachvollziehbar sein.

Diese Beispielanwendung wird an vielen Stellen stark vereinfachtsein und ist nicht dazu gedacht, vollständig in einem System einge-

4107-6.book Seite 22 Donnerstag, 7. Juli 2016 1:30 13

Einleitung

23

setzt zu werden. Zugunsten der Verständlichkeit verzichten wir aufFehlerbehandlungen. Einige Funktionen müssten für eine sinnvolleVerwendung besser ausprogrammiert werden. Wir gehen nichtexplizit darauf ein, welches Feld ein Muss-Feld ist oder welche Fel-der in bestimmten Situationen nicht geändert werden dürften. Dassoll Sie jedoch nicht stören, denn Sie werden den Sinn und Zweckder einzelnen Anwendungsbestandteile verstehen. Zu einer ausge-reiften Anwendung gehören mehr Bestandteile, als wir hier im Rah-men eines Arbeitsbuches präsentieren können.

Aufbau des BuchesIn Kapitel 1, »Grundlagen der Anwendungsprogrammierung«,erfahren Sie, was Sie vor und während der Entwicklung einerAnwendung im Allgemeinen und einer SAP-Anwendung im Speziel-len bedenken sollten.

In Kapitel 2, »Mit Tabellenpflegedialogen arbeiten«, erstellen Sieeine Tabelle mit dem entsprechenden Tabellenpflegedialog. Wahr-scheinlich haben Sie bereits mit dieser Form der Datenpflege zu tungehabt? Wir zeigen Ihnen, wie einfach das Erstellen eines Tabellen-pflegedialogs ist, und zusätzlich verraten wir Ihnen, wie Sie den Dia-log »pimpen« können. Zu den Tabellenpflegedialogen gehören fastunweigerlich die Viewcluster.

Mit Tabellenpflegedialogen kann jeweils eine Tabelle bearbeitet wer-den, oftmals hängen jedoch mehrere Tabellen zusammen. Mit View-clustern können Sie diese Beziehungen definieren und die Datenkomfortabel bearbeiten. Wie das geht, erfahren Sie in Kapitel 3 ,»Viewcluster verwenden«. Die Pflegedialoge dienen uns dazu, Grund-einstellungen für die Beispielanwendung vornehmen zu können.

Der eigentlichen Anwendung widmen wir uns in Kapitel 4, »Dialogerstellen«. Hier legen wir den Grundstein für alle weiteren Program-mierschritte in diesem Buch. Der Ticketdialog wird ein einfachesProgramm mit dem Zweck, Ticketdaten zu erfassen und zu ändern.Es wird einige Ein- und Ausgabefelder geben und eine Funktion zumSpeichern des Tickets.

Die zentralen Grundideen in diesem Buch sind Modularisierung undWiederverwendbarkeit. In Kapitel 5 , »Komponenten wiederver-wenden«, erklären wir, was wir uns darunter vorstellen und was unswichtig erscheint. Sie werden zwei eigenständige Module erstellen.Das erste Modul wird eine besondere Schaltfläche auf HTML-Basissein, die Sie in den Dialog einbinden werden. Als Nächstes erstellen

4107-6.book Seite 23 Donnerstag, 7. Juli 2016 1:30 13

Page 21: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

Einleitung

24

Sie ein Modul mithilfe eines Subscreens, in dem verschiedene aus-wählbare Standorte angezeigt werden.

Auch die darauffolgenden Kapitel sind den Themen Modularisierungund Wiederverwendbarkeit gewidmet. In Kapitel 6, »Mit dem Text-Edit Control arbeiten«, werden Sie ein Modul entwickeln, das jeweilsden aktuellen Meldungstext an den bereits vorhandenen anhängtund speichert. In Kapitel 7 , »Mit dem Applikationslog arbeiten«,wird es ebenfalls um Meldungen gehen, allerdings in Form eines Pro-tokolls: des Anwendungslogs, eines Standardhilfsmittels in vielenSAP-Transaktionen. Mit dem Log können Sie Meldungen sammeln,speichern und in vielfältiger Weise aufbereitet darstellen. Ein Tool,das Sie unbedingt kennen sollten!

Änderungsbelege sind kein wirklich spannendes Thema. Schon garkein Thema, dem man viele Geheimnisse entlocken könnte. Wir habenuns jedoch entschlossen, die Änderungsbelege mit in das Buch aufzu-nehmen, da sie zur Anwendungsentwicklung gehören. Und wer weiß,vielleicht erfahren Sie in Kapitel 8, »Änderungsbelege verwenden«, janoch etwas Neues!

Wir fahren mit einem weiteren Modul fort, das wir in unsere Anwen-dung einbauen möchten. Sie werden in Kapitel 9, »Mit Tree Controlsarbeiten«, das Tree Control kennenlernen und mit diesem Controldie Darstellung einer Teamstruktur programmieren. Wir werden Sieumfassend über die Vor- und Nachteile sowie über die Unterschiededer verschiedenen zur Verfügung stehenden Tree-Variationen infor-mieren. Das Tree Control werden wir in Kapitel 14 , »Drag & Dropimplementieren«, noch einmal erweitern.

Beim nächsten eingesetzten Modul geht es um ein Control, das Siebereits in Kapitel 5, »Komponenten wiederverwenden«, kennenler-nen: das HTML Control. In Kapitel 10 , »Dynamische Dokumenteverwenden«, beschäftigen wir uns mit der Anzeige und den Interak-tionsmöglichkeiten dynamischer Dokumente.

In Kapitel 11 , »Controls in Dialog einbauen«, werden Sie die bishererstellten Module in das Hauptprogramm – den Ticketdialog – ein-bauen. Sie werden dabei sehen, wie einfach die Integration dererstellten Module ist.

Ein wenig bekanntes Control ist das als »Schubladen-Control« be-zeichnete vertikale Tabstrip. Diesen Exoten werden Sie in Kapitel 12 ,»Frameworks verwenden«, kennenlernen. Hier werden Sie ebenfalls

4107-6.book Seite 24 Donnerstag, 7. Juli 2016 1:30 13

Einleitung

25

bereits erstellte Module einbauen, und zwar mithilfe eines eigenstän-digen Frameworks, das ähnlich wie das Schubladen-Control funk-tioniert.

Kapitel 13 , »Mit ALV Grid Controls arbeiten«, möchten wir nutzen,um Ihnen einige Funktionen des ALV Grid Controls zu präsentieren.Sie werden einen Report anlegen, der die erstellten Tickets auflistet.Sie lernen verschiedene Layout- und Interaktionsmöglichkeiten ken-nen. In Kapitel 14 , »Drag & Drop implementieren«, lernen Sie, dieDrag-&-Drop-Funktionalität in das bereits erstellte Tree Control zuimplementieren.

Bei einem Rundumschlag um die Grundfunktionen eines SAP-Sys-tems dürfen SAP Smart Forms nicht fehlen. Dabei handelt es sich umden Nachfolger der ungeliebten SAPScript-Formulare. Kapitel 15 ,»Formulare erstellen«, führt Sie in die Erstellung eines Formulars ein.Sie werden sehen, dass es nicht so schwierig ist, wie Sie vielleichtdenken.

Ein weiteres spannendes Standard-SAP-Hilfsmittel beschreiben wirin Kapitel 16 , »Generische Objektdienste verwenden«. Dahinter ver-birgt sich eine Sammlung nützlicher Funktionen, um externe Doku-mente in einer Transaktion verwalten und ablegen zu können. Wirzeigen Ihnen, wie Sie Excel-Dateien, PDF-Dokumente und einfacheTexte oder Links mithilfe der generischen Objektdienste in IhreTicketanwendung einbinden.

Kommunikation ist wichtig. Wie eine Kommunikationsmöglichkeitzwischen den Anwendern des Dialogs technisch elegant in das Ticket-system eingebunden werden kann, demonstrieren wir Ihnen in Kapi-tel 17 , »E-Mails versenden«. Sie werden die Klassen zum E-Mail-Ver-sand nutzen und ein mittels SAP Smart Forms erstelltes Formularversenden. Zudem zeigen wir Ihnen, wie Sie Zugriff auf die über gene-rische Objektdienste importierten Dokumente erhalten, um dieseebenfalls zu versenden.

Dynamische Programmierung ist eines unserer Lieblingsthemen.Hier kann man als Programmierer zeigen, was man kann! Kapitel 18 ,»Dynamisch programmieren«, zeigt Ihnen, wie hilfreich dynami-sches Programmieren in der Praxis ist. Zudem zeigen wir Ihnen eineelegante Art der Datenerfassung und Datenspeicherung für dyna-misch erzeugte Daten.

4107-6.book Seite 25 Donnerstag, 7. Juli 2016 1:30 13

Page 22: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

Einleitung

26

In Kapitel 19, »Mit klassenbasierten Ausnahmen arbeiten«, das neuin dieser Auflage ist, holen wir das nach, was wir bisher vernachläs-sigt haben: die Fehlerbehandlung – und zwar mit klassenbasiertenAusnahmen.

Ein wenig bekanntes Hilfsmittel ist das Personalisierungs-Frame-work, mit dessen Hilfe Sie dem Anwender eine einfache Möglichkeitbieten, die Anwendung zu personalisieren. Wir werden Ihnen inKapitel 20, »Personalisierung ermöglichen«, zeigen, welche Vorteiledie Personalisierung für Sie und für den Anwender hat.

Kapitel 21, »Mit Webservices auf das SAP-System zugreifen«, sollaufzeigen, wie schnell ein Webservice erstellt ist. Ein Webservice istdie Voraussetzung für die Kommunikation zwischen Intranet undInternet. Mit einem Webservice können Sie z. B. die Anzahl der offe-nen Tickets, die ein Kollege noch zu bearbeiten hat, in Ihrem Firmen-portal darstellen.

In Kapitel 22 , »Prozesse parallel verarbeiten« – ebenfalls neu in die-ser Auflage –, zeigen wir Ihnen schließlich, wie Sie das Letzte ausIhren Programmierungen herausholen. Es beschäftigt sich mit derProgrammierung paralleler Prozesse, mit der Sie viele Programmeschneller machen können.

Hinweise zurLektüre

Wir hoffen, dass Sie durch dieses Buch viele Handgriffe lernen, dieIhnen im Alltag helfen, und Ideen für Ihre eigenen Entwicklungenbekommen. Sie finden in diesem Buch mehrere Orientierungshilfen,die Ihnen die Arbeit mit dem Buch erleichtern sollen.

In hervorgehobenen Informationskästen sind Inhalte zu finden, diewissenswert und hilfreich sind, aber etwas außerhalb der eigentli-chen Erläuterung stehen. Damit Sie die Informationen in den Kästensofort einordnen können, haben wir die Kästen mit Symbolengekennzeichnet:

Die mit diesem Symbol gekennzeichneten Tipps geben Ihnen spezi-elle Empfehlungen, die Ihnen die Arbeit erleichtern können.

In Kästen, die mit diesem Symbol gekennzeichnet sind, finden SieInformationen zu weiterführenden Themen oder wichtigen Inhalten,die Sie sich merken sollten.

Dieses Symbol weist Sie auf Besonderheiten hin, die Sie beachten soll-ten. Es warnt Sie außerdem vor häufig gemachten Fehlern oder Pro-blemen, die auftreten können.

4107-6.book Seite 26 Donnerstag, 7. Juli 2016 1:30 13

Einleitung

27

Beispiele, durch dieses Symbol kenntlich gemacht, weisen auf Szena-rien aus der Praxis hin und veranschaulichen die dargestellten Funk-tionen.

Danksagung

Endlich ist es fertig, das ABAP-Kochbuch. Für uns alle war es daserste Buch, das wir geschrieben haben. Es war mehr Arbeit und hatmehr Zeit gekostet, als wir zu Beginn ahnten. Es gibt jedoch nochviele andere Menschen, die ebenfalls viel Zeit mit dem Buch zuge-bracht haben und ohne die eine Veröffentlichung kaum möglichgewesen wäre:

Wir danken dem Rheinwerk Verlag für die Gelegenheit, das ABAP-Kochbuch veröffentlichen zu können, und speziell unserer LektorinJanina Karrasch, die uns bei der Entstehung des Buches mit Rat und Tatzur Seite stand. Bedanken möchten wir uns auch bei Stefan Proksch,der die Initialzündung für das Buch gab und es verstand, seine undunsere Ideen konstruktiv voranzubringen.

Danken möchten wir auch unserem Chef Frank Bachmann, der unsstets beratend und tatkräftig zur Seite steht und uns erlaubt hat, dieEntwicklungen für dieses Buch auf dem SAP-System der InwerkenAG vorzunehmen. Ein spezieller Dank geht an unseren ProbeleserRené Eberstein, der unsere Kapitel Stück für Stück durcharbeitete.Mit René haben wir den idealen Testleser gefunden, da er mit sei-nem Berater-Wiki (www.berater-wiki.de) weiß, worauf es bei derDokumentation und Beschreibung von Quellcode und Programmier-techniken ankommt. Ebenfalls bedanken möchten wir uns bei StefanSchmöcker, der uns mit seiner Programmierkunst und seinen Ideenbei der dynamischen Programmierung unterstützte.

Ganz herzlich möchten wir uns auch bei Dr. Rüdiger Plantiko bedan-ken, der uns seine Anwendung zur Onlinebereitstellung der ABAP-Quelltexte zur Verfügung stellte. Diese Technik nutzte Rüdigerbereits für sein eigenes BSP-Praxisbuch (erschienen im dpunkt.ver-lag), um den Lesern den Quellcode des Buches online zur Verfügungzu stellen.

Ebenso möchten wir uns bei unserer Fotografin Svenja Wichers undihrer Assistentin Galina Lisowski bedanken, die unsere Schokoladen-seiten gefunden und fotografiert haben. Nico Schmarje möchten wir

4107-6.book Seite 27 Donnerstag, 7. Juli 2016 1:30 13

Page 23: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

Einleitung

28

dafür danken, dass er uns mit seiner jahrelangen Erfahrung bei derErstellung des Smart-Forms-Kapitels zur Seite stand.

Unser allergrößter Dank gebührt jedoch unseren Familien, unserenFrauen, Lebenspartnerinnen und Kindern, die sich während der häu-figen und intensiven Schreibphasen sicherlich oftmals eine andereAbend- und Wochenendgestaltung gewünscht haben. Wir möchtenuns ganz herzlich für die Geduld und Unterstützung unserer Fami-lien bedanken!

4107-6.book Seite 28 Donnerstag, 7. Juli 2016 1:30 13

Page 24: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

Auf einen Blick

1 Grundlagen der Anwendungsprogrammierung ........ 29

2 Mit Tabellenpflegedialogen arbeiten ....................... 41

3 Viewcluster verwenden ............................................. 89

4 Dialog erstellen ......................................................... 113

5 Komponenten wiederverwenden .............................. 195

6 Mit dem TextEdit Control arbeiten .......................... 225

7 Mit dem Applikationslog arbeiten ........................... 249

8 Änderungsbelege verwenden .................................... 281

9 Mit Tree Controls arbeiten ....................................... 295

10 Dynamische Dokumente verwenden ........................ 337

11 Controls in Dialog einbauen ..................................... 349

12 Frameworks verwenden ............................................ 357

13 Mit ALV Grid Controls arbeiten ................................ 379

14 Drag & Drop implementieren ................................... 433

15 Formulare erstellen ................................................... 465

16 Generische Objektdienste verwenden ...................... 483

17 E-Mails versenden .................................................... 501

18 Dynamisch programmieren ....................................... 529

19 Mit klassenbasierten Ausnahmen arbeiten .............. 585

20 Personalisierung ermöglichen ................................... 611

21 Mit Webservices auf das SAP-System zugreifen ...... 631

22 Prozesse parallel verarbeiten .................................... 647

4107-6.book Seite 5 Donnerstag, 7. Juli 2016 1:30 13

Page 25: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

7

Inhalt

Vorwort .................................................................................... 17Einleitung .................................................................................. 21

1 Grundlagen der Anwendungsprogrammierung ...... 29

1.1 Entwurfsmuster ....................................................... 291.2 Entwicklungsumgebung .......................................... 301.3 Anforderungen an SAP-Programme ......................... 331.4 Vorhandenes clever nutzen ..................................... 361.5 Kosten-Nutzen-Verhältnis ....................................... 371.6 Planung einer Anwendung ...................................... 381.7 Dokumentation ...................................................... 381.8 Teamarbeit ............................................................. 39

2 Mit Tabellenpflegedialogen arbeiten ...................... 41

2.1 Datenmodell erarbeiten .......................................... 422.2 Tabellenpflegegenerator ......................................... 48

2.2.1 Berechtigungsgruppen ............................... 482.2.2 Funktionsgruppe ....................................... 482.2.3 Pflegebilder ............................................... 492.2.4 Generierung des Pflegedialogs ................... 502.2.5 Texttabellen anlegen ................................. 502.2.6 Pflegetransaktion anlegen .......................... 542.2.7 Kategorientabelle erstellen ........................ 56

2.3 Adressdatenpflege integrieren ................................. 572.4 Zeitpunkte .............................................................. 60

2.4.1 Anlegen eines Pflege-Views ....................... 602.4.2 Zeitpunkt 05: Hinzufügen eines neuen

Eintrags ..................................................... 642.4.3 Zeitpunkt 21: Versorgen von verborgenen

Feldern ...................................................... 662.4.4 Zeitpunkt 23: vor dem Aufruf des

Adresspflegebildes ..................................... 672.4.5 Zeitpunkt 19: nach Initialisierung globaler

Variablen ................................................... 682.5 Stolperfallen und Hilfestellungen ............................ 72

4107-6.book Seite 7 Donnerstag, 7. Juli 2016 1:30 13

Page 26: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

Inhalt

8

2.6 Einzelne Datensätze gezielt pflegen ......................... 752.6.1 Funktionsbaustein

VIEW_MAINTENANCE_CALL ..................... 752.6.2 Funktionsbaustein

VIEW_MAINTENANCE_SINGLE_ENTRY ..... 762.7 Zeitabhängige Pflege-Views ..................................... 762.8 Berechtigungen ....................................................... 802.9 Änderungen am Pflegedialog vornehmen ................ 81

2.9.1 Felder hinzufügen oder entfernen .............. 822.9.2 Änderung der Speicherart .......................... 832.9.3 Dynpros nachbearbeiten ............................ 842.9.4 Table Control vergrößern ........................... 85

3 Viewcluster verwenden ........................................... 89

3.1 Viewcluster definieren ............................................. 903.2 Abhängige Einträge definieren ................................. 973.3 Viewcluster per Programm aufrufen ......................... 1033.4 Zeitpunkte ............................................................... 104

4 Dialog erstellen ....................................................... 113

4.1 Datenbanktabelle erstellen ...................................... 1144.2 Suchhilfe anlegen .................................................... 117

4.2.1 Eingabehilfe einrichten ............................... 1204.2.2 Elementare Suchhilfe einrichten ................. 1244.2.3 Suchhilfe erweitern .................................... 1274.2.4 Eigenen Suchhilfe-Exit anlegen ................... 1324.2.5 Datensätze aus der Ergebnismenge

löschen ...................................................... 1384.2.6 Sammelsuchhilfe verwenden ...................... 139

4.3 Modulpool anlegen ................................................. 1434.4 Dictionary-Struktur für die Dynpros erstellen ........... 1454.5 Optionen zur Einbindung von Datenstrukturen ........ 147

4.5.1 TYPE-Referenzierung .................................. 1494.5.2 INCLUDE-Befehl ........................................ 1524.5.3 Inkludierung unter Verwendung eines

Gruppennamens ......................................... 1524.5.4 Umbenannte Includes ................................ 1544.5.5 Umbenannte Includes unter Verwendung

eines Gruppennamens ................................ 157

4107-6.book Seite 8 Donnerstag, 7. Juli 2016 1:30 13

Inhalt

9

4.6 Dynpros anlegen ..................................................... 1594.7 Abhängige Listboxen .............................................. 1664.8 Transaktion anlegen ................................................ 1684.9 Felder ein- und ausblenden .................................... 169

4.9.1 Feldeigenschaften ändern .......................... 1694.9.2 Laufzeitkomprimierung .............................. 175

4.10 Änderungen erkennen ............................................ 1784.11 Daten sichern ......................................................... 1814.12 TextEdit Control für die Texteingabe

implementieren ...................................................... 189

5 Komponenten wiederverwenden ............................ 195

5.1 Wiederverwendbares Wissen sammeln ................... 1975.2 Ableiten oder parametrisieren? ............................... 1995.3 GUI Control kapseln ............................................... 200

5.3.1 Eigenen Button erstellen ............................ 2015.3.2 Basisklasse erstellen ................................... 2035.3.3 Komponente einbinden ............................. 2085.3.4 Dynpro-Komponenten spezialisieren ......... 210

5.4 Subscreen kapseln .................................................. 2125.4.1 Standortanzeige kapseln ............................ 2135.4.2 Subscreen anlegen ..................................... 2185.4.3 Funktionsbaustein testen ........................... 2195.4.4 Subscreen in Programm einbauen .............. 220

5.5 GUI Control »andocken« ......................................... 2215.6 Verwaltung von Reuse-Funktionen ......................... 222

6 Mit dem TextEdit Control arbeiten ........................ 225

6.1 Datenhaltung und Model ........................................ 2266.1.1 Dictionary-Objekte anlegen ....................... 2266.1.2 Model-Klasse anlegen ............................... 227

6.2 Controller anlegen .................................................. 2356.2.1 Anlegen der Controller-Klasse ................... 2366.2.2 Weitere Attribute anlegen ......................... 237

6.3 Testprogramm entwickeln ....................................... 244

4107-6.book Seite 9 Donnerstag, 7. Juli 2016 1:30 13

Page 27: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

Inhalt

10

7 Mit dem Applikationslog arbeiten .......................... 249

7.1 Schnittstelle ............................................................ 2497.2 Begriffsklärung ......................................................... 2507.3 Transiente Protokolle .............................................. 2517.4 Persistente Protokolle .............................................. 253

7.4.1 Objekt und Unterobjekt anlegen ................ 2547.4.2 Zugriffsklassen anlegen ............................... 256

7.5 Protokolle mit Callbacks .......................................... 2697.6 Nachrichten mit Kontext ......................................... 2737.7 Protokollausgabe anpassen ...................................... 2757.8 Erweiterte Möglichkeiten des Applikationslogs ........ 278

8 Änderungsbelege verwenden .................................. 281

8.1 Datenelemente als änderungsrelevant markieren ..... 2828.2 Änderungsbelegobjekt anlegen ................................ 2828.3 Generierung des Verbuchers .................................... 2858.4 Analyse der generierten Objekte ............................. 2868.5 Testprogramm ......................................................... 2908.6 Tipps zur Arbeit mit Änderungsbelegen ................... 293

8.6.1 Komplexe Änderungsbelegobjekte ............. 2938.6.2 Aufbereitung, Anzeige und Archivierung .... 294

9 Mit Tree Controls arbeiten ...................................... 295

9.1 Tree-Typen .............................................................. 2959.1.1 Historische Entwicklung der

Baumdarstellung ........................................ 2959.1.2 Hilfestellung bei der Wahl und der

Implementierung der Tree-Typen ............... 3029.2 Einheitliches Interface anlegen ................................ 3039.3 Baumdarstellung erzeugen ....................................... 312

9.3.1 Anforderungen ........................................... 3129.3.2 Passendes Tree Control für die

Ticketanwendung wählen ........................... 3139.3.3 Klasse für den Teambaum erstellen ............ 316

9.4 Tree Control testen .................................................. 332

4107-6.book Seite 10 Donnerstag, 7. Juli 2016 1:30 13

Inhalt

11

10 Dynamische Dokumente verwenden ...................... 337

10.1 Statusanzeige aufbauen .......................................... 34010.2 Klasse für die Ereignisbehandlung erstellen ............. 34510.3 Programmlokale Klassen importieren ...................... 346

11 Controls in Dialog einbauen .................................... 349

11.1 HTML-Buttons einbauen ......................................... 34911.2 Standorte-Subscreen einbauen ................................ 354

12 Frameworks verwenden .......................................... 357

12.1 Klasse zur Ereignisbehandlung ................................ 35812.2 Schubladen verwenden ........................................... 36012.3 Eigenes Framework entwickeln ............................... 36612.4 Framework einbinden ............................................. 375

13 Mit ALV Grid Controls arbeiten .............................. 379

13.1 Funktionen des SAP List Viewers ............................ 37913.2 Darstellungsarten .................................................... 380

13.2.1 Einfache und zweidimensionale Tabellen .................................................... 380

13.2.2 Hierarchisch-sequenzielle Listen ................ 38113.2.3 Baumstruktur ............................................. 382

13.3 Grundlagen und Vorarbeiten zur Erstellung eines ALV Grid Controls .......................................... 38213.3.1 Layoutstruktur ........................................... 38313.3.2 Layoutvarianten ......................................... 38413.3.3 Feldkatalog ................................................ 38513.3.4 Styles ........................................................ 38713.3.5 Pufferkonzept ............................................ 38813.3.6 Änderbarkeit des ALV Grid Controls .......... 38913.3.7 Globale Tabellen ....................................... 39013.3.8 Verwendung von Ereignissen ..................... 390

13.4 Tabellarische Übersicht erstellen ............................. 39213.4.1 Selektionsparameter an Klasse

übergeben ................................................. 393

4107-6.book Seite 11 Donnerstag, 7. Juli 2016 1:30 13

Page 28: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

Inhalt

12

13.4.2 Report für die Ticketübersicht erstellen ..................................................... 398

13.4.3 Interface für die Ereignisbehandlung erstellen ..................................................... 408

13.4.4 Eigene Klasse als Verschalung des Controls erstellen ....................................... 408

13.4.5 ABAP-Dictionary-Struktur für die ALV-Anzeige anlegen ................................. 411

13.4.6 Methoden anlegen und implementieren .... 41213.4.7 Ereignisbehandler implementieren ............. 422

13.5 Ergebnis der implementierten Funktionen ............... 428

14 Drag & Drop implementieren .................................. 433

14.1 Grundlagen ............................................................. 43314.1.1 Begriffe ...................................................... 43414.1.2 Drag-&-Drop-fähige Objekte ...................... 43614.1.3 Ereignisse für Drag & Drop ......................... 439

14.2 Funktionsweise und Ablauf ...................................... 44014.2.1 Ablauf des Drag & Drop ............................. 44014.2.2 Datenübertragung ...................................... 441

14.3 Beispielanwendung: Drag & Drop in Teambaum und Ticketübersicht ................................................. 44214.3.1 Teambaum in die Ticketübersicht

integrieren ................................................. 44314.3.2 Datenübertragung vorbereiten ................... 44514.3.3 Anpassung des Teambaums ........................ 45214.3.4 Anpassung der Ticketübersicht ................... 457

15 Formulare erstellen ................................................. 465

15.1 Möglichkeiten der Formularerstellung ..................... 46515.2 Formularerstellung mit SAP Smart Forms ................. 46715.3 Formularentwurf ..................................................... 468

15.3.1 Übergabestruktur vorbereiten .................... 46815.3.2 Elemente des Form Builders ....................... 46915.3.3 Formular anlegen ....................................... 47115.3.4 Logo dynamisch einbinden ......................... 47215.3.5 Druck des Dokuments ................................ 481

IVZ.fm Seite 12 Donnerstag, 7. Juli 2016 1:34 13

Inhalt

13

16 Generische Objektdienste verwenden .................... 483

16.1 Umgang mit generischen Objektdiensten ................ 48316.2 Generische Objektdienste in eigene Programme

einbinden ............................................................... 48616.2.1 Business-Object-Repository-Objekt

anlegen ..................................................... 48616.2.2 Generische Objektdienste für ein Objekt

aufrufen ..................................................... 48916.3 GOS-Anlagen per Programm manipulieren .............. 493

16.3.1 GOS-Anlagen auslesen .............................. 49416.3.2 GOS-Anlage hinzufügen ............................ 497

16.4 Ablage der GOS-Anlagen ........................................ 500

17 E-Mails versenden ................................................... 501

17.1 Einfacher E-Mail-Versand ....................................... 50217.2 Versand einer E-Mail innerhalb der

Ticketbearbeitung ................................................... 50617.2.1 E-Mail als Text auslesen ............................. 50717.2.2 Implementierung der Methode

CREATE_MAIL_DIALOG ............................ 51117.3 E-Mail-Versand als Hintergrundverarbeitung ........... 513

17.3.1 SAP-Link erzeugen .................................... 51317.3.2 E-Mail mit Anhang im Hintergrund

erzeugen ................................................... 51517.3.3 Anschreiben einbinden/Nutzung von

Templates .................................................. 51917.4 E-Mails als Smart-Forms-Dokument versenden ....... 52217.5 E-Mail mit Anhängen versenden ............................. 527

18 Dynamisch programmieren ..................................... 529

18.1 Ansätze und Stufen der dynamischen Programmierung ..................................................... 530

18.2 Einzelnes Feld definieren ........................................ 53418.2.1 Daten übergeben ...................................... 53718.2.2 Werte prüfen ............................................. 53818.2.3 Schaltflächen ausblenden .......................... 53818.2.4 Programmlogik »austricksen« ..................... 539

4107-6.book Seite 13 Donnerstag, 7. Juli 2016 1:30 13

Page 29: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

Inhalt

14

18.2.5 Programm zur Eingabe eines einzelnen Wertes ....................................................... 539

18.2.6 Programm zur Eingabe mehrerer Felder ...... 54218.3 Variable Felder definieren ........................................ 547

18.3.1 Variable Felder verwenden ......................... 54918.3.2 Variable Feldwerte speichern ..................... 550

18.4 Mehrere Felder definieren ....................................... 55118.4.1 Dynamische Variablen definieren ............... 55218.4.2 Daten in das ABAP Memory exportieren .... 55418.4.3 Funktionen kapseln .................................... 55518.4.4 Erfassung der variablen Werte einbauen ..... 562

18.5 Interne Tabelle dynamisch erstellen ......................... 56518.6 Mehrere Werte erfassen .......................................... 572

18.6.1 Dynamische Datenerfassung kapseln .......... 57318.6.2 Einbau der dynamischen Datenerfassung .... 580

19 Mit klassenbasierten Ausnahmen arbeiten ............ 585

19.1 Nachteile des alten Ausnahmekonzepts ................... 58619.2 Klassenbasierte Ausnahmen ..................................... 588

19.2.1 Klassenbasierte Ausnahmen definieren ....... 58819.2.2 Verwendungsstellen klassenbasierter

Ausnahmen ................................................ 59019.2.3 Ausnahmen auslösen und abfangen ............ 592

19.3 Die Klassenhierarchie .............................................. 59419.3.1 Attribute der Ausnahmeklassen .................. 59519.3.2 Previous ..................................................... 596

19.4 Ausnahmetexte ....................................................... 59719.5 Ausnahmen abfangen .............................................. 602

19.5.1 CATCH-Blöcke ........................................... 60219.5.2 Verschachtelung von TRY-Blöcken ............. 604

19.6 Wiederaufsetzbare Ausnahmen ............................... 606

20 Personalisierung ermöglichen ................................. 611

20.1 Personalisierungsobjekt anlegen .............................. 61220.2 Struktur definieren .................................................. 61520.3 Dialogbaustein erstellen .......................................... 61620.4 Anwendung personalisieren ..................................... 623

4107-6.book Seite 14 Donnerstag, 7. Juli 2016 1:30 13

Inhalt

15

21 Mit Webservices auf das SAP-System zugreifen .... 631

21.1 SOAP-Webservice erstellen ..................................... 63321.1.1 Funktionsgruppe ZBOOK_HTTP anlegen .... 63321.1.2 Funktionsbausteine erstellen ..................... 63321.1.3 Webservice für die Funktionsgruppe

generieren ................................................. 63621.1.4 Webservice im SOA-Management

konfigurieren ............................................. 641

22 Prozesse parallel verarbeiten .................................. 647

22.1 Was ist Parallelverarbeitung? .................................. 64722.1.1 Anwendungsgebiete der

Parallelverarbeitung ................................... 64822.1.2 Technische Ausführung der Parallelität ...... 64922.1.3 Voraussetzungen für die

Parallelverarbeitung ................................... 65022.1.4 Vor- und Nachteile der

Parallelverarbeitung ................................... 65122.2 Planung der Verarbeitungsblöcke ............................ 65122.3 Was sind Prozesse? ................................................. 65322.4 RFC-Server-Gruppen definieren .............................. 65522.5 Einen parallelen Prozess entwickeln ........................ 656

22.5.1 Prozessinformationen ermitteln ................. 65722.5.2 Ausführung des Kind-Prozesses prüfen ...... 65722.5.3 Kind-Prozess starten .................................. 65822.5.4 Daten vom Kind-Prozess empfangen ......... 660

22.6 Wiederverwendbare Klasse erstellen ....................... 66122.6.1 Interface für die Methode

ON_TASK_COMPLETE .............................. 66122.6.2 Hilfsklasse für die Parallelverarbeitung

anlegen ..................................................... 66322.7 Funktionsbaustein erstellen .................................... 66822.8 Hauptprogramm implementieren ............................ 671

A Wiederkehrende Arbeitsschritte ........................................ 675

B Die Autoren ...................................................................... 707

Index ........................................................................................ 709

4107-6.book Seite 15 Donnerstag, 7. Juli 2016 1:30 13

Page 30: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

709

Index

A

ABAP Dictionary 31, 44, 61, 98ABAP Editor 31, 682ABAP List Viewer 379ABAP Memory 539, 554ABAP Objects 33ABAP Repository 31ABAP Workbench 30, 214, 350,

623, 680ABAP-Dictionary-Struktur 387, 411ABAP-Laufzeitumgebung 324ABAP-Webservice 633Ableitung 199, 306Absatzformat 470Adobe LiveCycle Designer 466Adressgruppe 57Adressverwaltung 57Akzessormethode 234allgemeine Tabellenpflege 50ALV Grid Control 147, 153

aktualisieren 464Änderbarkeit 389Ereignisbehandlung 390Pufferung 388

ALV Tree Control 300ALV-Liste 380Änderung 281Änderungsbeleg 281, 289Änderungsbelegobjekt 281, 282, 293Änderungsnummer 287Änderungsprotokoll 281Änderungsrelevanz 282Änderungszeiger 288Anlagenliste 485Anmeldeticket 638API (Änderungsbelege)

CHANGEDOCUMENT_CLOSE 289CHANGEDOCUMENT_

DISPLAY 291CHANGEDOCUMENT_MULTIPLE_

CASE 290CHANGEDOCUMENT_OPEN 289CHANGEDOCUMENT_READ 291CHANGEDOCUMENT_SINGLE_

CASE 289

API (Applikationslog) 249BAL_ARCHIVE_LOAD 280BAL_ARCHIVE_SEARCH 280BAL_CNTL_CREATE 267, 278BAL_DB_LOAD 262, 263BAL_DB_SAVE 266BAL_DB_SEARCH 262, 263, 278BAL_DSP_LOG_DISPLAY 252BAL_DSP_PROFILE_POPUP_

GET 277BAL_LOG_CREATE 251, 262, 263BAL_LOG_MSG_ADD 252, 265BAL_LOG_MSG_ADD_FREE_

TEXT 252API (Tabellenpflege)

VIEW_MAINTENANCE_CALL 75VIEW_MAINTENANCE_SINGLE_

ENTRY 76API-Baustein 292Application Event 321Application Programming Interface

� APIApplikationslog 249, 280, 519Applikationslogik 467ASSIGN 531, 551, 567ASSIGN COMPONENT 532, 620Attribut

anlegen 596GR_GOS_MANAGER 489HTML_TABLE 340ITEM_INDEX 447T_CITEM_TABLE 447T_LITEM_TABLE 447

Aufrufer 317Aufzeichnungsroutine 83Ausgabestruktur 411Auslieferungsklasse 83Ausnahme 456, 464

abfangen 593, 602Aufrufer 593behandeln 593ID 601klassenbasierte 585klassische 586Text 597wiederaufsetzbare 606

4107-6.book Seite 709 Donnerstag, 7. Juli 2016 1:30 13

Page 31: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

710

Index

Ausnahmeklasse 588Attribute 595Hierarchie 594Instanz 593

Ausrichtung 328Authentifizierung 638Auto-Alignment 328Automation Queue 243

B

BAPI 253, 258Basisklasse 203Befehl, interner 534BEFORE UNWIND 608Behavior 441, 460Beleg 483Benutzer-/Passwort-Abfragen 638Benutzerpflege 612Benutzerverwaltung 625Berechtigungsobjekt

S_TABU_DIS 47, 80S_TABU_NAM 47, 80S_TCODE 80

Berechtigungsverwaltung 612Betriebsart 655Big Data 647Binding 644BOR-Objekt 490Browser 680Business Application Programming

Interface 253, 258Business Object Builder 486Business Object Repository 486Button erstellen 201

C

CALL TRANSFORMATION 577Callback 269, 273, 491, 621CALLING ON END OF TASK 659Cast 464CATCH-Block 602Catch-or-Throw-Prinzip 593Class Builder 228, 232, 306, 339,

346, 511, 693CLEANUP-Block 605CLEAR-Anweisung 181Cluster 579Code Inspector 33

Column Tree 300Command Chaining 267COMMIT WORK 505communication_failure 659CONCATENATE 553Container 240Content Repository 500Control 221, 240, 349

Custom 191, 333Drag-&-Drop-Fähigkeit 438einbinden 685Framework 243löschen 241objektorientiertes 437umhängen 240

Controller 225CREATE OBJECT 335Custom Container 191, 335, 349, 398Custom Control 201Customizing-Daten 42

D

Data Browser 47, 579DATA-Anweisung 145Daten normalisieren 43Datenart 700Datenbankanweisung 32Datenbanktabelle erstellen 114Datenbankzugriff, Protokoll 250Datendefinition 684Datendeklaration

allgemeine 287objektspezifische 288

Datenelementändern 142änderungsrelevantes 282anlegen 115, 695

Datenreferenz 566, 575Datensatz, Einzelbearbeitung 76Datenselektion 143Datenstruktur 43Datentyp, lokaler 171Debugger 32Design Pattern � EntwurfsmusterDesignzeit 483Dialog

Detailbild 49einstufiger 49Task 648

Dialogfenster, modales 216

4107-6.book Seite 710 Donnerstag, 7. Juli 2016 1:30 13

711

Index

Dictionary-Struktur � ABAP-Dictio-nary-Struktur

Dirty Assign 532Docking-Container 68, 361Dokument 465, 467

dynamisches 337Konzeption 468

Domäneanlegen 115, 697einrichten 505Festwert 549

DO-Schleife 509Downcasting 203Drag & Drop 433

Ablauf 440Applikationsserver-Service 440Behavior 435Datenübertragung 441Drag 434Dragsource 434, 440Drop 434Droptarget 434Handle 435Objekt 435

Drawer Control 358, 360Dropdown-Liste 417Druckprogramm 467Dublette, Vorabprüfung 298Dynamic Data Grid 573dynamisches Dokument 337Dynpro 41, 49, 118, 244, 436

Ablauflogik 118anlegen 159Arbeitsbereich 145Element 196kopieren 84Modulpool 143nachbearbeiten 84Programmierung 349Variable 161

E

EDIT-Ereignis 391Effekt 434, 461Eingabehilfe 119E-Mail 501

Ausgangsqueue 505Hintergrund 513Host 505Instanz 516

Port 505Versanddialog 511

Endlosschleife 326Endpunkt 641Entwicklungsklasse 677Entwurfsmuster 29, 200, 225Ereignis 143, 226, 231

anlegen 232Application Event 321AT SELECTION-SCREEN 401BEFORE_USER_COMMAND 425CLICKED 362Drag & Drop 436, 439EXPAND_NO_CHILDREN 327ITEM_DOUBLE_CLICK 321ONDRAG 437, 439, 441, 448ONDROP 437, 440, 441, 462ONDROPCOMPLETE 439, 441ONGETFLAVOR 439, 441Quellereignis 439STATUS_CHANGED 341, 345, 365TOOLBAR 422

Ereignisbehandler 238, 345, 422Ereignisbehandlung 304, 358, 437Ergebnismenge sortieren 137Erweiterungskategorie 46Event Handler � EreignisbehandlerEvent � EreignisException � AusnahmeExit-Kommando 162Exit-Steuerung 326EXPORT TO MEMORY 537EXPORTING 596externe Identifikation 250, 255

F

F4-Wertehilfe 118Factory-Methode 227, 264Factory-Pattern 30, 225Fallunterscheidung 597Fehlertext 597Feld

Abhängigkeit 95Attribut 145Bezeichner 46dynamisches 467, 472Eigenschaft ändern 169Redefinition 154Steuerung 118, 168, 170variables 529

4107-6.book Seite 711 Donnerstag, 7. Juli 2016 1:30 13

Page 32: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

712

Index

Feldkatalog 277, 385, 575, 620automatischer 386manueller 385

Feldsymbol 531, 552, 619Festwert 120, 130FIELD-SYMBOLS 531Flavor 434, 439, 440Flush 243, 299Font 328Form Builder 470, 471Form Painter 470FORM-Routine 65Formular 465, 467, 470

Ablauflogik 467anlegen 471dynamisches Feld 472Feld 467Grafik einbinden 472Schnittstelle 467, 468, 471

Framework 357einbinden 375erstellen 366

Fremdschlüssel 52, 121, 702Definition 122Prüfung 122, 166

Frontend Control � ControlFunction Builder 134, 217, 219, 693Funktionsbaustein 196

anlegen 633, 692BAL_DB_SEARCH 278Callback 271DD_DOMVALUES_GET 419DDUT_INPUT_CHECK 538DYNP_VALUES_READ 119F4UT_FIXED_VALUES_TEXT_

ADD 130F4UT_ICONS_DISPLAY 133, 136F4UT_PARAMETER_SORT 129F4UT_PARAMETER_VALUE_

GET 134ICON_CREATE 423Meldung 691NUMBER_CHECK 184NUMBER_GET_NEXT 184, 185POPUP_GET_VALUES_USER_

HELP 620READ_TEXT 521remotefähiger 187, 634RS_SET_SELSCREEN_STATUS 538RS_SUPPORT_SELECTIONS 401

SSF_FUNCTION_MODULE_NAME 481

Typen 186Verbuchungsbaustein 187VIEW_MAINTENANCE_CALL 75VIEW_MAINTENANCE_SINGLE_

ENTRY 76VIEWCLUSTER_MAINTENANCE_

CALL 103Funktionseigenschaft 162Funktionsgruppe 41, 249, 285, 633Funktionsgruppe anlegen 214, 690

G

Garbage Collector 227, 241GENERATE SUBROUTINE POOL 534Generic Object Services � GOSgenerische Objektdienste � GOSgepackte Zahl 111GOS 483, 647

Anhang 502Anlage 493, 527Manager 490, 491Menü 484Toolbar 502Verbuchungssteuerung 493

Gruppe 655Gruppenname 152, 157GUI Control � ControlGUI-Status 118, 144, 161, 336GUI-Titel 144

H

Highlander-Pattern � Singleton-Pattern

Hilfsbaustein 132HTML Control 339HTML-Button 349HTTP 632

I

Identifikation, externe 250Image Repository 472IMPORT FROM MEMORY 537Import-Parameter 140, 472

4107-6.book Seite 712 Donnerstag, 7. Juli 2016 1:30 13

713

Index

Include 286benanntes 146, 153Gruppenname 152umbenanntes 154, 157

INCLUDE-Befehl 152Instanz 227

Attribut 452erzeugen 316Variable 443

Instanzentabelle 227Instanziierung 227, 316Instanziierung, mehrfache 192Instanzmethode 234, 257, 506Instanzvariable 507Integer-Wert 111Interface 303, 661

IF_DRAGDROP 437IF_MESSAGE 602IF_T100_MESSAGE 601Methode 491

IS ASSIGNED 532Item-Tabelle 447

J

Job-Protokoll 249

K

Kapselung 303Kategorie 43Kind-Prozess 649, 651, 656Klasse 196, 303

Basisklasse 199, 203CL_BCS 502CL_DD_DOCUMENT 339CL_DRAGDROBOBJECT 435CL_DRAGDROP 460CL_DRAGDROPOBJECT 441CL_GOS_MANAGER 489CL_GUI_ALV_GRID 383CL_GUI_CONTAINER 242CL_GUI_CONTAINER_BAR 360CL_GUI_TEXTEDIT 189, 225,

240, 244CL_LIST_TREE_MODEL 320CL_PERS_ADMIN 612CX_DYNAMIC_CHECK 594CX_ROOT 594

CX_STATIC_CHECK 589, 594, 609Ereignisbehandlung 358globale 339, 367, 442, 445Instanz 227lokale 339, 441programmieren 69programmlokale importieren 346statische 358Vererbbarkeit 196

Knoten 297Identifikation 314Schlüssel 323

Knowledge Provider 500Komponente 222, 566, 575Konsistenzcheck 151Konstante 507

CV_CRLF 507EVENTID_ITEM_DOUBLE_

CLICK 321NODE_SEL_MODE_SINGLE 320

Konstruktor 229, 257, 262, 320, 322, 491

Kopfdaten 470Kopfeintrag 91

L

Laufzeitanalyse 32Laufzeitkomprimierung 175Layout 401Layoutstruktur 383, 384List Tree 299Listbox 72Logo 471Loop 180, 476lose Bindung 226

M

Makro 530Mandant 698MESSAGE … RAISING 586Methode 196

ADD 453, 461ADD_CALLBACK 270ADD_INFO 461ADD_NODE 322, 323, 324, 456ADD_PARAM 270ADD_TICKET_LINK 514

4107-6.book Seite 713 Donnerstag, 7. Juli 2016 1:30 13

Page 33: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

714

Index

anlegen 694Aufruf 243BUILD_DISPLAY_OPTIONS

414, 460BUILD_DROPDOWN_TABLE 419BUILD_ITEMS 324, 327CHECK_CHANGED_DATA 425CHECK_RESPONSIBLE 331CONSTRUCTOR 257, 340CREATE_MAIL_TEXT_DARK 515CREATE_PERSISTENT 516CREATE_TREE_CONTROL 321DISPLAY_DOCUMENT 339, 341DOCUMENT 506EXPAND_ROOT_NODES 322FLUSH 243, 464FREE 241funktionale 320, 330GET_CITEM_TABLE 451GET_DATA 320, 322GET_HANDLE 461GET_INSTANCE 231, 236, 264,

319, 335, 412, 444GET_LITEM_TABLE 450, 464GET_MAIL_AS_TEXT 506, 509GET_MAIL_BODY 507GET_MSG 259GET_NODE_KEY 451GET_OBJECT 491GET_SUBJECT 509GET_TEXT_TEMPLATE 520GET_TEXTSTREAM 192GET_VISIBLE 243HANDLE_BEFORE_USER_COM-

MAND 425HANDLE_BUTTON_CLICK 427HANDLE_DRAG 454, 455HANDLE_ITEM_DOUBLE_

CLICK 330HANDLE_USER_COMMAND 427implementieren 230, 320INIT 172MERGE_DOCUMENT 339ON_TASK_COMPLETE 661Parameter 694RECIPIENTS 506redefinieren 199REGISTER_EDIT_EVENT 417SAVE 234, 265SAVE_ALL 235

SET_CONTAINER 266SET_FIELD_INACTIVE 173SET_FIELD_NO_INPUT 174SET_FLAVOR 440, 441SET_NODE_KEY 449SET_STATUS 341SET_VISIBLE 243SETUP_ALV 417SETUP_DRAG_DROP 460SHORT_MESSAGE 503statische 258

Model 30, 225Model View Controller (MVC)

30, 225Model-Klasse 227Modifikationsgruppe 170, 175MODIFY 559Modul 222, 357

Änderungsabgleich 178Datensicherung 181

Modularisierung 21, 195Modulpool 143, 684Muss-Feld-Prüfung 64

N

Nachrichtenklasse 256, 597, 598Nachrichtenkontext 273Nachrichtenpflege 598Nachrichtenstruktur 275Namensraum 283Narrowing Cast 242Native SQL 32nebenläufige Programmierung

� ParallelverarbeitungNummernkreis 182

Intervall 182, 184Objekt 182Vergabe 184

Nummernvergabe 182

O

Object Browser 30Object Navigator 680Objekt 30, 250, 254

definieren 31dynamisches 491statisches 489

4107-6.book Seite 714 Donnerstag, 7. Juli 2016 1:30 13

715

Index

Objektbaum 680Objektdienste, generische � GOSObjektkatalogeintrag 676Objektliste 683Objektreferenz 358, 567Objektreferenzvariable 364On-Demand-Ansatz 326OPEN DATASET 670Open SQL 32Operation 642Operation Binding 642OTHERS 586

P

PAI � Process After Input (PAI)PAI-Modul 162, 189, 333Paket 677Parallelverarbeitung 647, 648Parameter 199Parameter-ID 426Parametrisierung 199PBO � Process Before Output (PBO)PBO-Modul 118, 161, 174, 202, 245,

333, 443PC-Editor 470PDF-Dokument 466Personalisierung 611Personalisierungsobjekt 611,

613, 622PF-Status � GUI-StatusPointer � ZeigerPOV 219Präsentationslogik 467Präsentationsschicht 30Pretty Printer 31Problemklasse 251Process After Input (PAI) 118, 161,

246, 321Process Before Output (PBO) 118,

161, 245, 321Process on Value-Request 219Programm

Arten 143Aufbau 114ausführbares 144, 332

Programmieransatzdynamischer 156, 529generischer 530

iterativer 325objektorientierter 30, 203, 296paralleler 647prozeduraler 296rekursiver 325serieller 647

Programmprüfung, erweiterte 33Protokoll 249, 646

Handle 250Hauptspeicher 251Kategorisierung 250Nummer 250persistentes 251, 253transientes 251

Prozess 653Prozessart 654Prüftabelle 120

R

Rahmenprogramm 104RAISE 586, 592Ranges-Tabelle 279, 393, 403Ranges-Tabellentyp 394READ DATASET 670READ TABLE 180, 324Referenzparameter 187Referenzvariable 376, 490Rekursivität 325Remote Function Call (RFC) 184Report 143, 244, 339

RSSCD100 294RSSCD500 294

Repository Browser 214, 562, 680, 683

Resizing 687Resumable Exception 606RESUME 608RETRY 608Returncode 539Returning-Parameter 319, 507Reuse-Datenbank 198RFC-Server-Gruppe 655Rolle 612Rollenpflege 624Rückgabeparameter 511Rückgabewert 506, 511Rücksprung � CallbackRuntime Type Creation (RTTC) 534

4107-6.book Seite 715 Donnerstag, 7. Juli 2016 1:30 13

Page 34: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

716

Index

Runtime Type Identification (RTTI) 534

Runtime Type Services (RTTS) 534, 566

S

SAP Business Workplace 502SAP Content Server 500SAP GUI for HTML 299SAP Interactive Forms by Adobe 466SAP List Viewer 379SAP Smart Forms 466, 467, 481SAP Tree 296, 297SAP Tree Model 296, 297, 301SAP-Link 513SAPscript 465, 483SAP-Shortcut 513SAP-System, externer Zugriff 631SAP-Tree-Klasse 297Schablone 475, 477Schleifenzähler 553Schlüsselfeld 698Schnittstelle 502Schubladen-Control 358, 360Screen Painter 31, 85, 164, 191, 685

Custom Control 209Rahmen 177

SELECT 533SELECT ... DISTINCT 569SELECT-OPTIONS 393Selektionsbild 143Selektionsparameter 75Service Provider 632SET HANDLER 358SET PF-STATUS 334Shortdump 553Signatur 694Simple Tree 299Single Sign-on 639Singleton-Pattern 30, 225, 235,

316, 318, 320Singleton-Referenz 236, 237Smart Forms � SAP Smart FormsSMTP-Server 505SOAP 632, 640SoapUI 645Sonderzeichen 158SOS-Funktion 151

Spezialisierung 210Splitter Container 367Splitter Control 368Splitter Framework 358Sprachkennzeichen 51SQL Trace 32SSO 639Stack 326Stammdaten 42STARTING NEW TASK 649, 659Statustyp

Dialogfenster 334Dialogstatus 334

Statusübersicht 338Steuermethode 241Stil 470String 506, 510, 578STRING-Feld 226String-Template 233Struktur

anlegen 412, 469dynamische 619einbinden 147flache 179globale 215S_LAYOUT 460tiefe 179

Struktur-zu-Struktur-Zuweisung 153Style 387Style-Konstante 388Subscreen 196, 212Suchhilfe 119

elementare 120, 124, 139Ereignisse 134erweitern 127Exit 129, 132inkludierte 141Sammelsuchhilfe 120, 139

Suffix 147, 157Support 501SY-INDEX 553Syntaxprüfung 33SYST-DATUM 522system_failure 659Systemausnahme 595System-Cluster 579System-ID 515Systemlandschaft 631Systemtabelle 91Systemvariable 522

4107-6.book Seite 716 Donnerstag, 7. Juli 2016 1:30 13

717

Index

T

Tabelleanlegen 698CDHDR 281, 294CDPOS 281, 294Datenselektion 180erstellen 44Erweiterungskategorie 701INDX 579inkludierte 147interne 172, 477, 701Pufferung 701SCREEN 169SGOSATTR 493SOC3 500technische Einstellungen 699

Tabellenarbeitsbereich 184Tabellenpflege, Änderungen doku-

mentieren 57Tabellenpflegedialog 41

ändern 53Berechtigung 80generieren 41gruppieren 89zeitabhängiger 76

Tabellenpflegegenerator 45, 48, 81Table Control 85Table Painter 477TABLES*-Anweisung 145TABLES-Anweisung 145Tablespace 700Tabstrip, vertikales � Schubladen-

ControlTask-ID 659Tastenkombination 675Teamarbeit 39Testprogramm, Protokoll 251Testumgebung 32Textbaustein 470TextEdit Control 189, 225Textfeld 328Textknoten 470Texttabelle 50, 52Ticket anlegen 527Tickethistorie 225Toolbar 367TOP-Include 144, 145, 361, 364,

376, 684Trace 646

Transaktionanlegen 168DWDM 302OAC0 500PERSREG 612RZ04 655RZ12 655SCDO 283, 285SCI 33SCOT 505SCU3 701SE03 677SE09 679SE10 679SE11 44, 53, 61, 282SE16 314SE16N 47SE24 69, 210, 228, 256, 297, 346,

437, 445, 693SE37 271, 617, 693SE38 31, 682SE51 31SE54 48, 90, 101, 104SE63 470SE78 472SE80 30, 214, 350, 680SE91 598SE93 55, 168SLG0 254SLG1 250SM30 50, 53SM34 96, 102SM50 653, 666SMARTFORMS 469SNRO 182SO01 505SO10 519SOAMANAGER 640, 641SOST 505SPERS_DIALOG 623ST05 32SWO1 486

Transaktionscode zuweisen 55Transport 31Transport Organizer 677Transportauftrag 676, 678Transportgarantie 638Tree Control 295

Aufbau 298Column Tree 300Ereignis 305

4107-6.book Seite 717 Donnerstag, 7. Juli 2016 1:30 13

Page 35: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

718

Index

Ereignisbehandlung 304Instanz 321Klasse 327List Tree 299Simple 299

Tree-Klasse 296Tree-Model-Instanz 320Tree-Typ 295TRY-Block 604TRY-CATCH-Block 593TYPE-Referenzierung 149

U

Übergabestruktur 468Unterobjekt 250, 254Unterroutine 164Update-Kennzeichen 291

globales 288tabellenspezifisches 288

Usability 611User-Exit 105, 621

V

Variable 160globale 164, 443lokale 164, 323LV_PARENT 323VCL_STOP 111

Variante 144, 401Variantensteuerung, benutzer-

abhängige 385Vater-Prozess 649Verarbeitungsblock 650, 652Verbucher generieren 285Verbuchung 182Verbuchungsbaustein 187, 288Vererbung 199, 306Verkaufsbeleg 293Versionierung 33Verweis, dynamischer 549Verwendungsnachweis 31, 33View 30, 60, 225Viewcluster 89

Kopfeintrag 91Objektstruktur 92Pflege 96

Vorgänger 94Vorwärtsnavigation 31

W

WAIT FOR ASYNCHRONOUS TASKS 650

WAIT UNTIL 661Wartbarkeit 479Webservice 631

ABAP-Webservice 633Endpunkt 641erstellen 633Konsument 633Provider 633Sicherheit 638SOAP-Webservice 632testen 645Wizard 632

Wertetabelle 50Wertübergabe 659WHERE-Bedingung 169Wiederauffindbarkeit 196wiederaufsetzbare Ausnahme 606Wiederverwendbarkeit 21, 195Workprozesse � ProzessWrapper-Instanz 490Wrapper-Klasse 489WSDL 640Wurzelknoten 321

X

X.509-Zertifikat 638XML-String 578

Z

Zeichenformat 470Zeiger 531Zeilenformat 470Zeilentyp 477Zeitpunkt 60, 64, 71Zugriffsklasse 256

4107-6.book Seite 718 Donnerstag, 7. Juli 2016 1:30 13

Page 36: Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler...i_s_msg = gs_msg. Listing 7.2 T100-Nachricht dem App likationslog hinzufügen Die Nachrichtenfelder der Struktur BAL_S_MSG entsprechen

Wir hoffen sehr, dass Ihnen diese Leseprobe gefallen hat. Sie dürfen sie gerne empfeh-len und weitergeben, allerdings nur vollständig mit allen Seiten. Bitte beachten Sie, dass der Funktionsumfang dieser Leseprobe sowie ihre Darstellung von der E-Book-Fassung des vorgestellten Buches abweichen können. Diese Leseprobe ist in all ihren Teilen urheberrechtlich geschützt. Alle Nutzungs- und Verwertungsrechte liegen beim Autor und beim Verlag.

Teilen Sie Ihre Leseerfahrung mit uns!

Enno Wulff Als langjähriger SAP-Berater sucht er immer nach der idealen Lösung – vornehmlich in den Bereichen SAP-Programmierung, Sales & Distribution, Material Management, Quality Management und Cross Applications. Maic Haubitz beschäftigt sich seit 1998 mit Themen in und um die SAP-Software, seit 2002 arbeitet er als ABAP-Entwickler und SAP-Berater bei der Inwerken AG. Dennis Goerke ist erfahrener SAP-Entwickler und Ausbilder und studiert berufsbe-gleitend Wirtschaftsinformatik in Hannover. Sascha Seegebarth sammelte während seines Studiums im Rahmen seiner Selbst-ständigkeit Erfahrungen in SAP-Projekten, bevor er 2008 als SAP-Technologieberater bei der Inwerken AG anfing. Udo Tönges wechselte im August 2006 nach Hannover zur Inwerken AG. Seine Schwerpunkte in der SAP-Programmierung sind Schnittstellenimplementierungen, Web Dynpro ABAP und SAP-Workflow-Funktionen.

Enno Wulff, Maic Haubitz, Dennis Goerke, Sascha Seegebarth, Udo Tönges

Das ABAP-Kochbuch – Erfolgsrezepte für Entwickler718 Seiten, gebunden, 2. Auflage 2016 69,90 Euro, ISBN 978-3-8362-4107-6

www.sap-press.de/4103

SAP-Wissen aus erster Hand.