Einstieg in Web Dynpro ABAP

31.03.2009 - Business Server Pages . ..... 350. 6.2.4. Object Value Selector . ..... spiel das Einstiegsbild des Object Navigators (Transaktion SE24) analysiert.
2MB Größe 50 Downloads 532 Ansichten
1315.book Seite 3 Dienstag, 31. März 2009 11:16 11

Dominik Ofenloch, Roland Schwaiger

Einstieg in Web Dynpro ABAP™

Bonn 폷 Boston

1315.book Seite 5 Dienstag, 31. März 2009 11:16 11

Auf einen Blick 1

Einführung ..............................................................

19

2

Web-Dynpro-Architektur .......................................

33

3

Entwicklung von Web-Dynpro-Anwendungen ....... 103

4

Dynamische Web-Dynpro-Anwendungen .............. 243

5

Web-Dynpro-Standard-Components ..................... 285

6

Eingabehilfen und semantische Hilfen ................... 329

7

Konfiguration, Customizing und Personalisierung ..................................................... 383

8

Tipps und Tricks aus der Praxis .............................. 401

9

Web Dynpro im Enhancement Framework ............. 449

A

Anhang .................................................................... 459

B

Die Autoren ............................................................. 463

1315.book Seite 7 Dienstag, 31. März 2009 11:16 11

Inhalt Vorwort ........................................................................................

1

Einführung ................................................................ 19 1.1

1.2

1.3

2

13

Model-View-Controller .............................................. 1.1.1 Model ............................................................ 1.1.2 View .............................................................. 1.1.3 Controller ...................................................... 1.1.4 Beispiel für eine MVC-Interaktion .................. Evolution der SAP-User-Interfaces .............................. 1.2.1 Konsole ......................................................... 1.2.2 Dynpros ......................................................... 1.2.3 Business Server Pages ..................................... 1.2.4 Web Dynpro .................................................. Zusammenfassung ......................................................

20 21 22 22 23 24 24 25 28 31 32

Web-Dynpro-Architektur ......................................... 33 2.1

2.2

2.3

2.4

2.5

Components und Anwendungen ................................ 34 2.1.1 Beispiel: Bibliothek ........................................ 35 2.1.2 Web Dynpro Explorer .................................... 36 View ........................................................................... 40 2.2.1 Views ............................................................. 40 2.2.2 Windows und Plugs ....................................... 49 Controller ................................................................... 63 2.3.1 Ablaufreihenfolge der Hook-Methoden .......... 69 2.3.2 Verwendung und Sichtbarkeit von Controllern .................................................... 72 2.3.3 Aktionen und Ereignisse ................................. 76 2.3.4 Assistance-Klasse ........................................... 79 Context ...................................................................... 80 2.4.1 Aufbau eines Contexts ................................... 81 2.4.2 Datenbindung ................................................ 84 2.4.3 Mapping ........................................................ 94 2.4.4 Supply-Funktionen ......................................... 98 2.4.5 Steuerung der Sichtbarkeit von UI-Elementen über den Context ..................... 100 Zusammenfassung ...................................................... 101

7

1315.book Seite 8 Dienstag, 31. März 2009 11:16 11

Inhalt

3

Entwicklung von Web-Dynpro-Anwendungen ........ 103 3.1

3.2

3.3

3.4

3.5

4

104 110 118 124 138 140 141 142 153 155 157 159 163 168 173 187 204 211 212 213 216 221 240

Dynamische Web-Dynpro-Anwendungen ............... 243 4.1 4.2 4.3

8

Context-Programmierung ........................................... 3.1.1 Änderung von Attributwerten eines Elementes ..................................................... 3.1.2 Lesen von Attributwerten eines oder mehrerer Elemente ........................................ 3.1.3 Erzeugen von Context-Elementen .................. 3.1.4 Löschen von Context-Elementen ................... Layouts und Container ............................................... 3.2.1 Container ...................................................... 3.2.2 Layouts ......................................................... 3.2.3 Beispiel ......................................................... Verwendung wichtiger View-Elemente ...................... 3.3.1 TextView ....................................................... 3.3.2 InputField und Label ..................................... 3.3.3 Button ........................................................... 3.3.4 TabStrip ........................................................ 3.3.5 Tree .............................................................. 3.3.6 Table ............................................................. 3.3.7 FileUp-/Download ......................................... Nachrichten und Internationalisierung ....................... 3.4.1 Texte aus dem ABAP Dictionary .................... 3.4.2 Texte aus dem Online Text Repository ........... 3.4.3 Texte aus der Assistenzklasse ......................... 3.4.4 Nachrichten .................................................. Zusammenfassung ......................................................

Vorteile und Nachteile der dynamischen Programmierung ........................................................ Arten von dynamischen Änderungen .......................... Anpassung des Contexts zur Laufzeit .......................... 4.3.1 Beschreibungsobjekt (Metainformation) eines Context-Knotens ermitteln ................... 4.3.2 Context-Knoten anlegen und hinzufügen ....... 4.3.3 Context-Attribut einzeln anlegen und hinzufügen .................................................... 4.3.4 Context-Attribute gebündelt anlegen und hinzufügen .................................................... 4.3.5 Weitere Methoden für die dynamische Context-Manipulation ...................................

245 246 247 250 252 256 258 261

1315.book Seite 9 Dienstag, 31. März 2009 11:16 11

Inhalt

4.4

4.5

5

264 265 266 280 283 283

Web-Dynpro-Standard-Components ...................... 285 5.1

5.2

5.3

5.4

6

4.3.6 Fazit ............................................................... Anpassung des User Interface zur Laufzeit .................. 4.4.1 Hinzufügen eines View-Elementes zu einem Container ....................................................... 4.4.2 Aktionen zu View-Element-Ereignissen zuweisen ........................................................ 4.4.3 Fazit ............................................................... Zusammenfassung ......................................................

Multi-Component-Architekturen ................................ 5.1.1 Component-Verwendungen ........................... 5.1.2 Componentübergreifendes Mapping .............. 5.1.3 Component-Interfaces ................................... SAP List Viewer .......................................................... 5.2.1 Integration von ALV ....................................... 5.2.2 ALV-Configuration-Model .............................. 5.2.3 Methoden und Ereignisse des Interface-Controllers ...................................... 5.2.4 Änderungen am Spaltenvorrat ........................ 5.2.5 Änderungen an der Toolbar ........................... POWER-List ............................................................... 5.3.1 Beispiel: Definition eigener Abfragen ............. 5.3.2 Weiterführende Informationen ....................... Zusammenfassung ......................................................

286 287 299 306 307 309 311 314 318 322 324 324 328 328

Eingabehilfen und semantische Hilfen ..................... 329 6.1

6.2

6.3

Implementierung von Auswahlmöglichkeiten .............. 6.1.1 DropDown ..................................................... 6.1.2 RadioButton .................................................. 6.1.3 CheckBox ....................................................... 6.1.4 CheckBoxGroup ............................................. 6.1.5 ItemListBox .................................................... 6.1.6 TriStateCheckBox ........................................... Wertehilfen ................................................................ 6.2.1 Wertehilfe-Modus deaktiviert ........................ 6.2.2 Wertehilfe-Modus automatisch ...................... 6.2.3 Dictionary-Suchhilfe ....................................... 6.2.4 Object Value Selector .................................... 6.2.5 Wertehilfe-Modus frei programmiert ............. SELECT-OPTIONS .......................................................

330 331 336 339 339 341 342 344 346 346 350 350 363 363 9

1315.book Seite 10 Dienstag, 31. März 2009 11:16 11

Inhalt

6.4

6.5

7

7.2 7.3

7.4

Konfiguration ............................................................. 7.1.1 Implizite Konfiguration .................................. 7.1.2 Explizite Konfiguration .................................. Personalisierung und Customizing .............................. URL-Parameter und Anwendungsparameter ............... 7.3.1 URL-Parameter .............................................. 7.3.2 Anwendungsparameter ................................. Zusammenfassung ......................................................

385 386 392 396 398 398 399 400

Tipps und Tricks aus der Praxis ............................... 401 8.1

8.2 8.3

8.4 8.5 8.6

8.7

10

369 370 371 372 373 376 381

Konfiguration, Customizing und Personalisierung ... 383 7.1

8

Semantische Hilfen .................................................... 6.4.1 Hilfetexte mit Quickinfos ............................... 6.4.2 Erläuterungstexte .......................................... 6.4.3 ABAP-Dictionary-Hilfe ................................... 6.4.4 Erläuterungen ................................................ 6.4.5 Knowledge-Warehouse-Dokumente .............. Zusammenfassung ......................................................

Performance- und Speicheroptimierung ..................... 8.1.1 Optimale Systemkonfiguration ...................... 8.1.2 Checklisten für die performante Web-Dynpro-Entwicklung ............................. 8.1.3 Performance-Tools ........................................ 8.1.4 On-Demand-Component- und View-Instanzierung ....................................... 8.1.5 Delta-Rendering ............................................ Debuggen von Web-Dynpro-Anwendungen .............. Popup-Fenster ........................................................... 8.3.1 Popup-Fenster erzeugen ................................ 8.3.2 Standard-Button-Aktionen ............................ Context-Change-Log .................................................. Hotkeys ..................................................................... Kontextmenüs ........................................................... 8.6.1 Standardkontextmenü ................................... 8.6.2 Entwicklung eigener Kontextmenüs ............... Zusammenfassung ......................................................

403 404 407 410 415 420 426 429 430 434 437 438 441 442 444 448

1315.book Seite 11 Dienstag, 31. März 2009 11:16 11

Inhalt

9

Web Dynpro im Enhancement Framework .............. 449 9.1

9.2

Enhancements in Web Dynpro ................................... 9.1.1 Web-Dynpro-Erweiterungen im Detail ........... 9.1.2 Übung: Weiteres Suchfeld .............................. Zusammenfassung ......................................................

450 452 455 458

A Anhang ..................................................................... 459 A.1 A.2

Literaturempfehlungen ............................................... 459 Verwendete Namenskonventionen ............................. 460

B Die Autoren .............................................................. 463 Index ............................................................................................ 465

11

1315.book Seite 103 Dienstag, 31. März 2009 11:16 11

Web-Dynpro-Anwendungen repräsentieren die Sicht für einen Benutzer auf eine oder mehrere Web-Dynpro-Components. Sie werden in diesem Kapitel lernen, wie Web-DynproAnwendungen entwickelt werden und welche verschiedenen Aspekte Sie dabei zur Verwendung bringen können.

3

Entwicklung von Web-DynproAnwendungen

In diesem Kapitel werden Sie eine Web-Dynpro-Anwendung entwickeln, in der Sie das bis dato erarbeitete Wissen einsetzen können. Zusätzlich erhalten Sie einen tieferen Einblick in die Programmierung des Contexts, von View-Layouts und der Container, in die Verwendung von wichtigen UI-Elementen, Tabellen, Wertehilfen und Nachrichten sowie die Internationalisierung.

Web-Dynpro – Wissensvertiefung und Erweiterung

Die unterschiedlichen Themen werden Schritt für Schritt in eine WebDynpro-Anwendung integriert, um Ihnen die praktische Anwendung der Theorie zu vermitteln. Dabei werden vier Ziele verfolgt:

BeispielWeb-DynproAnwendung



die Präsentation und Vermittlung von detailliertem Wissen über die Elemente der Web-Dynpro-Entwicklung



die Vorgehensweise bei der Entwicklung und die Verwendung der präsentierten Techniken bei der Erstellung einer Web-Dynpro-Anwendung



eine vollständige – aus Sicht einer funktionsfähigen Web-DynproAnwendung – und integrierte Sammlung von Beispielen, die Sie für Ihre Entwicklungsprojekte als Vorlagen wiederverwenden können



die Präsentation von Zusatzthemen, wie die Run Time Type Identification (RTTI) oder Service-Aufrufe, die Ihnen das Leben erleichtern

Die Anwendung, die im Laufe dieses Kapitels entstehen wird, wurde Klassen-Browser getauft: Benutzer können in dieser Anwendung Such-

103

1315.book Seite 104 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

kriterien für eine ABAP-Klasse eingeben. Falls die ABAP-Klasse gefunden wird, werden die Beschreibung und die Methoden zur ABAPKlasse angezeigt Die Darstellung der Methoden erfolgt einerseits über eine Baum- und andererseits über eine Tabellendarstellung. Web-DynproWerkzeugkasten

Wie Sie bereits erahnen können, erfordert die Realisierung dieser WebDynpro-Anwendung die Nutzung zahlreicher Techniken aus dem Web-Dynpro-Werkzeugkasten. Entsprechend sind die Abschnitte aufgebaut: Begonnen wird mit der Programmierung des Contexts. Sie werden eine Web-Dynpro-Component anlegen und eine Context-Struktur definieren, danach werden Sie sich den Werkzeugen für die View-Gestaltung und -Programmierung zuwenden. Dabei wird die Verwendung von Layouts und Containern betrachtet und eine Menge von View-Elementen zur Gestaltung des View-Layouts benutzt. Fragestellungen

In diesem Kapitel werden die folgenden Themen besprochen: 왘

Context-Programmierung



Layouts und Container



Verwendung wichtiger View-Elemente



Nachrichten und Internationalisierung

3.1

Context-Programmierung

Wie Sie bereits gelernt haben, verfügt jeder Controller über einen Context, in dem die verwendeten Daten hierarchisch abgelegt sind. Die grundlegenden Elemente, die zur Strukturierung des Contexts eingesetzt werden, sind Context-Knoten und Context-Attribute. In diesem Abschnitt wird das bisher aufgebaute Wissen zur Erzeugung, Veränderung und Löschung von Daten im Context vertieft. Zum Aufwärmen und Wiederholen des in den vorangegangenen Kapiteln bereits Gelernten, legen Sie die Web-Dynpro-Component ZWDC_ 03_KLASSEN_BROWSER an. Diese Web-Dynpro-Component, die Sie als Lokales Objekt anlegen, wird im Laufe des Kapitels Stück für Stück ausgebaut. Der Name des von Ihnen anzulegenden Views lautet V_ MAIN_LAYOUT und der Name des Windows W_MAIN. Zusätzlich zu der Web-Dynpro-Component legen Sie eine Web-Dynpro-Anwendung mit dem Namen ZWDC_03_KLASSEN_BROWSER_APP an. Sollten Sie mit

104

1315.book Seite 105 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

3.1

dieser Aufgabe noch Schwierigkeiten haben, finden Sie in Abschnitt 2.1, »Components und Anwendungen«, das benötigte Wissen. Für die Programmierung des Contexts werden noch Context-Strukturen benötigt, die Sie nun aufbauen werden. Dabei lernen Sie eine Alternative zum Aufbau der Context-Struktur kennen: die Definition von Context-Knoten über ABAP-Dictionary-Strukturtypen.

Context-Struktur aufbauen

ABAP-Dictionary-Strukturtypen

Um mehrere skalare Variablen – das heißt einfache Datentypen, wie zum Beispiel Datum, Zeit und ganzzahlige Werte – zu einer Einheit zusammenzufassen, werden in ABAP Strukturvariablen angeboten. Falls der Aufbau (der Typ) der Strukturvariable mehrfach benötigt wird, ist es möglich, im ABAP Dictionary (Transaktion SE11) einen sogenannten Strukturtyp anzulegen, der dann für die Typisierung von Strukturvariablen verwendet werden kann. Es gibt drei Arten von Strukturtypen im ABAP Dictionary; welche Art verwendet wird, hängt vom geplanten Einsatzgebiet des Strukturtyps ab: 왘

ABAP-Dictionary-Struktur ABAP-Dictionary-Strukturen werden hauptsächlich für die Typisierung von Variablen und Schnittstellenparametern angelegt.



Transparente Tabelle Eine transparente Tabelle ist eine Datenbanktabelle, die im ABAP Dictionary definiert und dann in der Datenbank angelegt wird. Sie kann wie eine ABAP-Dictionary-Struktur für Typisierungen verwendet werden.



ABAP-Dictionary-View Hierbei handelt es sich um eine virtuelle Tabelle, die keine Daten enthält, sondern eine anwendungsorientierte Sicht auf eine oder mehrere ABAP-Dictionary-Tabelle(n) ist.

Die Elemente des Strukturtyps werden als Felder oder Komponenten bezeichnet.

Erinnern Sie sich noch an die Einzelanlage von Context-Knoten und Context-Attributen in Abschnitt 2.4, »Context«? Dort wurde zuerst der Context-Knoten und dann jedes benötigte Context-Attribut zum Context-Knoten einzeln angelegt. Alternativ dazu können Sie folgendermaßen vorgehen: 1. Definieren Sie einen Strukturtyp im ABAP Dictionary mit den gewünschten Strukturkomponenten. 2. Legen Sie einen Context-Knoten im gewünschten Controller an, und verwenden Sie für die Typisierung den zuvor angelegten Strukturtyp.

105

Context-Struktur mit Strukturtyp aufbauen

1315.book Seite 106 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

Sehen Sie sich das beschriebene Vorgehen an einem Beispiel an. Dem Benutzer soll ein Selektionsbild zur Suche von ABAP-Klassen angeboten werden. Der Benutzer muss den Namen der ABAP-Klasse angeben, die zu suchen ist. Falls die ABAP-Klasse gefunden wird, wird im Selektionsbild auch die Beschreibung der ABAP-Klasse angezeigt. Um diese Anforderung realisieren zu können, müssen Sie, wenn Sie dem beschriebenen Vorgehen folgen, zuerst eine ABAP-Dictionary-Struktur für die Selektionskriterien im ABAP Dictionary anlegen: Strukturtyp anlegen

1. Wechseln Sie dazu mit der Transaktion SE11 in das Einstiegsbild des ABAP Dictionarys. 2. Wie beschrieben, stehen mehrere Arten von Strukturtypen zur Verfügung. Da Sie den Strukturtyp ausschließlich zur Typisierung des Knotens und von Variablen verwenden werden, wählen Sie als Strukturtypart die Struktur. Selektieren Sie dazu den Radiobutton Datentyp im ABAP-Dictionary-Einstiegsbild. 3. Geben Sie im Eingabefeld zum Radiobutton Datentyp den Namen der Struktur an: ZST_03_WD_KLASSE_SEL_KRIT. Der Name beginnt mit dem Buchstaben Z und liegt somit im Kundennamensraum. 4. Drücken Sie auf die Taste Anlegen, und setzen Sie im erscheinenden Auswahldialog den Radiobutton Struktur. Quittieren Sie Ihre Eingabe mit einem Klick auf das grüne Häkchen. 5. Im Pflegebild der Struktur vergeben Sie eine passende Kurzbeschreibung für die ABAP-Dictionary-Struktur, wie zum Beispiel »Klassen Selektionskriterien«. Nun legen Sie die Komponenten der Struktur an. Als Komponenten sind der Name und die Beschreibung einer ABAP-Klasse erforderlich: 왘



Datenelement ermitteln

Name 왘

Komponente: NAME_KLASSE



Komponententyp: SEOCLSNAME

Beschreibung 왘

Komponente: BESCHR_KLASSE



Komponententyp: SEODESCR

1. Um die Komponententypen zu ermitteln, wurde in diesem Beispiel das Einstiegsbild des Object Navigators (Transaktion SE24) analysiert. Dort steht das Eingabefeld für den Namen eines ABAPInterface oder einer ABAP-Klasse zur Verfügung. Wenn Sie den

106

1315.book Seite 107 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

Cursor in das Eingabefeld Objekttyp platzieren und auf die Taste (F1) drücken, erscheint die semantische Hilfe zum Eingabefeld. Drücken Sie nun auf die Taste Technische Information, erscheint die technische Information zum Eingabefeld. In der Gruppe FeldDaten finden Sie im Anzeigefeld Datenelement den Namen des Datenelementes (SEOCLSNAME), das zur Typisierung des Eingabefeldes verwendet wurde. 2. Für die Struktur ZST_03_WD_KLASSE_SEL_KRIT müssen Sie noch festlegen, wie diese in Zukunft erweitert werden kann. Verwenden Sie dazu den Menüpfad Zusätze 폷 Erweiterungskategorie... Setzen Sie im erscheinenden Auswahldialog den Radiobutton beliebig erweiterbar, und bestätigen Sie Ihre Eingabe über die Drucktaste Übernehmen.

Erweiterungskategorie

3. Wählen Sie die Struktur über die Drucktaste Aktivieren (Tastenkombination (Strg) + (F3)) an. Das Ergebnis Ihrer bisherigen Arbeit sehen Sie in Abbildung 3.1.

Aktivieren

Abbildung 3.1 Struktur ZST_03_WD_KLASSE_SEL_KRIT im ABAP Dictionary

Damit haben Sie die ABAP-Dictionary-Struktur ZST_03_WD_KLASSE_ SEL_KRIT vollständig angelegt und können diese in der Definition der Context-Struktur einsetzen. Zuvor gibt es jedoch noch eine Übung zur Festigung Ihres Wissens. Legen Sie eine ABAP-Dictionary-Struktur an, die für die Typisierung des Context-Knotens für die ABAPKlassen-Methoden dient. Der Name der ABAP-Dictionary-Struktur lautet ZST_03_WD_KLASSE_METHODE. Die benötigten Komponenten und deren Typen finden Sie in Tabelle 3.1. Vergessen Sie nicht, die Erweiterungskategorie zu setzen und die Struktur zu aktivieren.

107

3.1

1315.book Seite 108 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

Komponente

Komponententyp

NAME

SEOCPDNAME

ART_ICON

ICONNAME

IS_CLASS

WDY_BOOLEAN

IS_INTERFACE

WDY_BOOLEAN

IS_REDEFINED

WDY_BOOLEAN

Tabelle 3.1 Komponenten und Komponententypen für die ABAP-Dictionary-Struktur ZST_03_WD_KLASSE_METHODE Context-Struktur definieren

Nun ist alles bereit, um die Context-Struktur in der Web-DynproComponent ZWDC_03_KLASSEN_BROWSER zu definieren. Wie bereits erwähnt, benötigen Sie einen Context-Knoten, der die Daten vom Selektionsbild übernehmen und einen Knoten, der die gefundenen Methoden zu einer ABAP-Klasse aufnehmen kann.

Context-Knoten für die Selektion

Begonnen wird mit dem Context-Knoten für die Selektionskriterien. Die Daten aus dem Selektions-View sollten auch dem ComponentController zur Verfügung stehen, da die Zugriffe auf den Context, die später implementiert werden, alle vom Component-Controller ausgeführt werden. Das bedeutet, dass der Context-Knoten für die Selektion im Component-Controller angelegt und später durch ContextMapping der Zugriff für andere Controller ermöglicht wird. 1. Wechseln Sie dazu in den Component-Controller-Context der Web-Dynpro-Component ZWDC_03_KLASSEN_BROWSER, den Sie auf der Karteikarte Context im Component-Controller finden.

Knoten anlegen

2. Legen Sie dort den Context-Knoten KLASSEN_SEL_KRIT an: Über das Kontextmenü auf dem Context-Wurzelknoten und den Menüeintrag Anlegen 폷 Knoten öffnet sich der Pflegedialog für den Context-Knoten (siehe Abbildung 3.2). 3. Geben Sie im Eingabefeld Knotenname den Namen des ContextKnotens KLASSEN_SEL_KRIT ein (). 4. Nun kommt eine Neuerung! Geben Sie im Eingabefeld DictionaryStruktur den Namen der von Ihnen angelegten ABAP-DictionaryStruktur für die Selektionskriterien ein: ZST_03_WD_KLASSE_SEL_ KRIT (). Damit legen Sie fest, aus welchem Strukturtyp die Context-Attribute zum Context-Knoten ermittelt werden sollen.

108

1315.book Seite 109 Dienstag, 31. März 2009 11:16 11

Context-Programmierung





  Abbildung 3.2 Anlegen des Context-Knotens KLASSEN_SEL_KRIT mithilfe einer ABAP-Dictionary-Struktur

5. Kicken Sie auf Attribute aus Struktur hinzufügen, um die von Ihnen gewünschten Attribute auszuwählen (). Es erscheint ein Auswahldialog für die Komponenten der angegebenen Struktur.

Attribute hinzufügen

6. Markieren Sie alle Komponenten, um diese in Attribute umzuwandeln (). 7. Bestätigen Sie zum Abschluss Ihre Selektion mit einem Klick auf das grüne Häkchen. Damit haben Sie einen Context-Knoten mit Context-Attributen angelegt. Dieser Anlageweg wird in der Praxis sehr häufig eingesetzt, da die über den Strukturtyp angelegten Context-Knoten Vorteile gegenüber einzeln angelegten Context-Attributen bieten, wie zum Beispiel umgebungssensitive Eingabehilfen. In Abbildung 3.3 sehen Sie das Ergebnis Ihrer Mühen. Wenn Sie sich, ebenfalls zur Wiederholung, einige der Eigenschaften des Context-Knotens KLASSEN_SEL_KRIT ansehen, werden Sie feststellen, dass von diesem Context-Knoten genau ein Context-Element angelegt wird. Dieses wird durch die Kardinalität 1..1 definiert (). Zudem wird durch das Web-Dynpro-Framework die Initialisierung Lead-Selection durchgeführt, da diese Eigenschaft selektiert ist ().

109

Eigenschaften

3.1

1315.book Seite 111 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

3.1

Startet der Benutzer die Web-Dynpro-Anwendung, soll ihm ein Vorschlagswert für einen ABAP-Klassennamen im Selektionsbild angeboten werden, zum Beispiel CL_GUI_ALV_GRID. Dafür stehen Ihnen prinzipiell zwei Möglichkeiten zur Verfügung: Default-Werte und Programmierung.

Default-Wert eines Attributes Sie belegen die Context-Eigenschaft Default-Wert des Context-Attributes NAME_KLASSE mit dem Wert CL_GUI_ALV_GRID. Diese Vorgehensweise dürfte Ihnen aus der ABAP-Programmierung bekannt sein, bei der es möglich ist, für die Deklaration einer Variablen über den VALUE-Zusatz zur DATA-Anweisung die Variable mit einem Anfangswert zu belegen. Wenn Sie die Anfangsbelegung in den Context-Eigenschaften des Context-Attributes NAME_KLASSE durchführen, sollte das Ergebnis () wie in Abbildung 3.4 aussehen.



Abbildung 3.4 Setzen des Default-Wertes eines Context-Attributes

Programmierung Bei der Programmierung weisen Sie dem Context-Attribut NAME_ KLASSE den Wert CL_GUI_ALV_GRID mithilfe der Context-Programmierung zu. Sehen Sie sich das prinzipielle Vorgehen zu dieser Möglichkeit genauer an. Um auf das Context-Attribut NAME_KLASSE zugreifen zu können, müssen Sie gewissermaßen durch die Context-Hierarchie navigieren. Die Navigation beginnt beim Wurzelknoten CONTEXT. Von diesem ausge-

111

Navigation in der Context-Hierarchie

1315.book Seite 112 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

hend, navigieren Sie zum Unterknoten KLASSEN_SEL_KRIT, der das Attribut NAME_KLASSE besitzt. Der Zugriff auf den Inhalt des ContextAttributes geschieht über das Element zum Context-Knoten (siehe Abschnitt 2.4, »Context«). Da die Eigenschaft Kardinalität des Context-Knotens KLASSEN_SEL_KRIT auf den Wert 1..1 gesetzt wurde, ist gesichert, dass das Element zum Context-Knoten vorhanden ist. Haben Sie den Zugriff auf das Element, können Sie für das ContextAttribut NAME_KLASSE den Wert setzen. So weit zur Idee, jetzt folgt die Theorie. get_child_node( )

Das ABAP-Interface IF_WD_CONTEXT_NODE dient der Arbeit mit Context-Knoten, wie zum Beispiel dem Anlegen, Lesen, Ändern und Löschen der Elemente eines Knotens. In Tabelle 3.2 sehen Sie die wichtigsten Methoden aus diesem Interface, die im Laufe dieses Abschnittes besprochen und verwendet werden. Methode

Beschreibung

get_child_node( )

Referenz des Unterknotens ermitteln

get_element( )

Element aus der Knoten-Collection ermitteln

get_element_count( )

Anzahl der Elemente in der KnotenCollection

get_static_attributes_table( )

alle Attribute aller Elemente in Form einer internen Tabelle

create_element( )

Element anlegen

bind_element( )

Element der Knoten-Collection hinzufügen

bind_structure( )

aus der Struktur ein Element in der Knoten-Collection erzeugen und hinzufügen

bind_table( )

aus einer internen Tabelle pro Eintrag ein Element in der Knoten-Collection erzeugen und hinzufügen

remove_element( )

ein Element aus der Knoten-Collection entfernen

Tabelle 3.2 Ausgewählte Methoden des ABAP-Interface IF_WD_CONTEXT_NODE

Unter den Controller-Attributen zu jedem Controller finden Sie das Attribut wd_context, das mit diesem ABAP-Interface typisiert ist. Die ABAP-Interface-Methode get_child_node( ) aus eben diesem ABAP-

112

1315.book Seite 113 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

Interface wird verwendet, um die Referenz auf einen Kind-Knoten zu ermitteln. Das bedeutet, dass diese ABAP-Interface-Methode die Navigation in der Context-Hierarchie ermöglicht. Eine Analyse der Schnittstelle zur Methode, die Sie in Abbildung 3.5 sehen können, zeigt, dass der Returning-Parameter child_node vom Typ IF_WD_CONTEXT_NODE ist. (Falls Sie mit der Analyse der Schnittstelle einer Methode nicht vertraut sind, finden Sie im folgenden Kasten »Analyse der Schnittstelle einer Methode« weitere Informationen.)

child_node

Abbildung 3.5 Schnittstelle der Methode get_child_node( )

Darüber hinaus finden Sie den optionalen Importing-Parameter index für die Bestimmung des Indexes des Elementes im übergeordneten Knoten, zu dem die Knoteninstanz gehört. Falls Sie den Importing-Parameter index nicht benutzen, wird die Lead-Selection des übergeordneten Knotens zum Ermitteln des Elementes verwendet. Analyse der Schnittstelle einer Methode

Die Methoden zu ABAP-Klassen oder ABAP-Interfaces besitzen Parameter, die sogenannten Formalparameter, die Daten vom Aufrufer übernehmen oder an den Aufrufer zurückgeben können (Aktualparameter). Die Gesamtheit der Parameter wird als Schnittstelle oder Signatur einer Methode bezeichnet. Die Parameter werden in Gruppen (Arten) eingeteilt, je nach Verwendungszweck: 왘

Importing-Parameter Über diese Parameter können Daten an die Methode übergeben werden.



Exporting-Parameter Über diese Parameter können Daten an den Aufrufer zurückgegeben werden.

113

index

3.1

1315.book Seite 114 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen



Changing-Parameter Diese Parameter bieten eine Kombination aus Importing- und Exporting-Parametern.



Returning-Parameter Der Returning-Parameter ist ein Wert, der an den Aufrufer zurückgegeben werden kann. Bei der Verwendung dieser Parameterart kann eine funktionale Methode definiert werden, die direkt in Ausdrücken aufgerufen werden kann.

Um feststellen zu können, welche Parameter eine Methode anbietet und wie die Daten zu typisieren sind, die an die Parameter übergeben werden, wechseln Sie in den Class Builder (Transaktion SE24), dort auf eine ABAPKlasse oder ein Interface und weiter auf die Registerkarte Methoden. Setzen Sie den Fokus auf die gewünschte Methode, und drücken Sie auf die Taste Parameter. Damit erhalten Sie eine Liste der Formalparameter mit Parameterart und Parametertyp. set_attribute( )

Das ABAP-Interface IF_WD_CONTEXT_ELEMENT ermöglicht das Lesen, Ändern und Setzen der Attributdaten eines Elementes. Tabelle 3.3 zeigt die wichtigsten Methoden aus diesem Interface, die besprochen und verwendet werden. Methode

Beschreibung

set_attribute( )

den Wert eines Attributes in einem Element ändern

set_static_attributes( )

den Wert der Attribute durch eine Struktur ändern

get_attribute( )

ein Attribut aus dem Element auslesen

get_static_attributes( )

alle Attribute aus dem Element auslesen

Tabelle 3.3 Ausgewählte Methoden des ABAP-Interface IF_WD_CONTEXT_ ELEMENT

Um zum Beispiel den Wert eines einzelnen Context-Attributes ändern zu können, wird in diesem ABAP-Interface die Methode set_ attribute( ) angeboten. Der Methode muss dazu der Name des Context-Attributes (Parameter name) und der neue Wert (Parameter value) übergeben werden (siehe Abbildung 3.6).

114

1315.book Seite 115 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

3.1

Abbildung 3.6 Schnittstelle der Methode set_attribute( )

Erproben Sie die Verwendung der erwähnten Methoden an einem Beispiel: Sie werden eine Methode entwickeln, um den Wert des Context-Attributes NAME_KLASSE aus dem Context-Knoten KLASSEN_ SEL_KRIT zu setzen. 1. Wechseln Sie in den Component-Controller und dort auf die Registerkarte Methoden.

setctx_klassen_sel_ krit( )

2. Legen Sie die Methode setctx_klassen_sel_krit( ) mit dem Importing-Parameter is_value vom Typ ZST_03_WD_KLASSE_SEL_ KRIT an (siehe Abbildung 3.7).

Abbildung 3.7 Schnittstelle der Methode setctx_klassen_sel_krit( )

3. In dieser Methode implementieren Sie das Setzen des Context-Attributes NAME_KLASSE. Wechseln Sie dazu in die Methode setctx_ klassen_sel_krit( ). 4. Öffnen Sie den Web-Dynpro-Code-Wizard, und wechseln Sie auf die Karteikarte Context. Wählen Sie das Context-Attribut NAME_ KLASSE im Context-Knoten KLASSEN_SEL_KRIT im Feld Knoten/Attribut und in der Gruppe Operation auf dem Context die Option Setzen. 5. Bestätigen Sie Ihre Eingabe mit einem Klick auf das grüne Häkchen. Ihr Ergebnis sollte Listing 3.1 (außer Variante 2) entsprechen.

115

Web-DynproCode-Wizard

1315.book Seite 116 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

METHOD setctx_klassen_sel_krit . * Die Knotenreferenz DATA: lo_nd_klassen_sel_krit TYPE REF TO if_wd_context_node, * Die Elementreferenz lo_el_klassen_sel_krit TYPE REF TO if_wd_context_element. * Von zu mit Lead-Selection lo_nd_klassen_sel_krit = wd_context->get_child_node( name = wd_this->wdctx_klassen_sel_krit ). * Element via Lead-Selection lo_el_klassen_sel_krit = lo_nd_klassen_sel_krit->get_element( ). * Behandlung keine Lead-Selection IF lo_el_klassen_sel_krit IS INITIAL. EXIT. ENDIF. ** Variante 1 – Einzeln ** * Setze das Attribut lo_el_klassen_sel_krit->set_attribute( name = `NAME_KLASSE` value = is_value-name_klasse ). ** Variante 2 – Struktur ** *lo_el_klassen_sel_krit->set_static_attributes( * static_attributes = is_value ). ENDMETHOD. Listing 3.1 Ermitteln der Elementreferenz des Knotens KLASSEN_SEL_KRIT Beschreibung

Was haben Sie bis jetzt erreicht? Sie haben die Referenz auf den Unterknoten KLASSEN_SEL_KRIT ermittelt und dabei die Methode get_ child_node( ) genutzt. Des Weiteren haben Sie für das Element die Elementreferenz zu diesem Context-Knoten mit der Methode get_ element( ) ausgelesen. Falls kein Element als Lead-Selection gesetzt ist, wird die Methode mit EXIT verlassen. Das Ändern des Attributwertes zum Attribut NAME_KLASSE wird mit der Methode set_ attribute( ) aus dem ABAP-Interface IF_WD_CONTEXT_ELEMENT durchgeführt.

set_static_ attributes( )

Das einzelne Setzen von Attributen kann bei einer großen Anzahl von Attributen sehr aufwendig sein und das Coding stark in die Länge ziehen. Um die Veränderungen durch einen einzigen Aufruf an die Elementreferenz übergeben zu können, existiert die Methode set_

116

1315.book Seite 117 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

3.1

static_attributes( ) im ABAP-Interface IF_WD_CONTEXT_ELEMENT.

Dieser Methode kann über den Formalparameter static_attributes eine Struktur mit den Attributwerten übergeben werden. In Listing 3.1 wurde im Coding-Abschnitt Variante 2 dieser Aufruf eingefügt. Damit die Initialisierung der Attribute vor der ersten Anzeige des Selektionsbildes ausgeführt wird, muss die Methode setctx_klassen_ sel_krit( ) in der Methode wddoinit( ) des Component-Controllers aufgerufen werden.

Aufruf

1. Um den Aufruf zu implementieren, wechseln Sie in die Methode wddoinit( ) und starten dort den Web-Dynpro-Code-Wizard (siehe Abbildung 3.8).



Abbildung 3.8 Anweisungsmuster zum Methodenaufruf

2. Wechseln Sie dort auf den Karteireiter Allgemein, und wählen Sie die Option Methodenaufruf im aktuellen Controller aus. Geben Sie den Namen der Methode setctx_klassen_sel_krit( ) ein, oder benutzen Sie die Eingabehilfe, um diese aufzurufen. Bestätigen Sie Ihre Eingabe mit einem Klick auf das grüne Häkchen, um den Quelltext zu generieren. 3. In der Methode wddoinit( ) muss noch eine Struktur vom Typ ZST_03_WD_KLASSE_SEL_KRIT mit den aktuellen Werten belegt und an die Methode setctx_klassen_sel_krit( ) übergeben werden. Diese Schritte müssen Sie manuell ausführen. In Listing 3.2 sehen Sie die vollständig implementierte Methode wddoinit( ). METHOD wddoinit . DATA: ls_klassen_sel_krit TYPE wd_this->element_klassen_sel_krit. * Aktuelle Daten setzen ls_klassen_sel_krit-name_klasse = 'CL_GUI_ALV_GRID'. ls_klassen_sel_krit-beschr_klasse = 'ALV List Viewer'.

117

Web-DynproAnweisungsmuster

1315.book Seite 118 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

* Initialisierung der Selektionskriterien wd_this->setctx_klassen_sel_krit( is_value = ls_klassen_sel_krit ). ENDMETHOD. Listing 3.2 Aufruf der Initialisierung der Selektionskriterien Web-DynproDebugger

4. Den Test der Funktionalität können Sie mithilfe des Web-DynproDebuggers durchführen, nachdem bisher keine Views zur Anzeige der Daten angelegt wurden (siehe Abschnitt 8.2, »Debuggen von Web-Dynpro-Anwendungen«). Damit haben Sie das Thema der Änderung von Attributwerten eines Elementes abgeschlossen und sind für die Praxis gewappnet. Wie können Sie jedoch die Attributwerte eines Elementes lesen?

3.1.2 Drei Methoden

Lesen von Attributwerten eines oder mehrerer Elemente

Für das Lesen von Attributwerten aus einem Element werden unter anderen drei Methoden zur Verfügung gestellt, die in den folgenden Abschnitten noch näher besprochen werden: 왘

get_attribute( )

Diese Methode aus dem ABAP-Interface IF_WD_CONTEXT_ELEMENT ermöglicht Ihnen die Ermittlung des Wertes für ein spezifisches Attribut, dessen Name Sie an die Methode übergeben. Falls der übergebene Name des Attributes nicht bekannt ist, wird eine Ausnahme vom Typ CX_WD_CONTEXT geworfen. 왘

get_static_attributes( )

Diese Methode aus dem ABAP-Interface IF_WD_CONTEXT_ELEMENT liefert die Werte aller Attribute zu einem Element in einer Struktur zurück. Dabei kann sich die Übergabestruktur an die Methode bezüglich des Aufbaus des Formalparameters unterscheiden. In der Implementierung der Methode wird mittels der ABAP-Anweisung MOVE-CORRESPONDING die Übertragung der Werte durchgeführt. 왘

get_static_attributes_table( )

Diese Methode aus dem ABAP-Interface IF_WD_CONTEXT_NODE liefert die Werte aller Attribute aller Elemente in einer internen Tabelle zurück.

118

1315.book Seite 119 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

Die Entwicklung einer Methode zum Auslesen der Inhalte des Contexts sollte damit grundsätzlich kein weiteres Problem darstellen. Um die Web-Dynpro-Component ZWDC_03_KLASSEN_BROWSER weiterzuentwickeln, benötigen Sie die Werte der Selektionskriterien aus dem Context-Knoten KLASSEN_SEL_KRIT. Obwohl die Werte in den Attributen initialisiert wurden, kann es sein, dass der Benutzer diese verändert hat – davon ist sogar auszugehen!

Methode get_attribute( ) Um das Auslesen des Context-Knotens zu kapseln, legen Sie die Methode getctx_klassen_sel_krit( ) im Component-Controller an. Diese Methode sollte die Werte der Selektionskriterien als Struktur zurückgeben. Die Schnittstelle der Methode getctx_klassen_sel_ krit( ) besteht aus dem Returning-Parameter rs_value vom Typ ZST_03_WD_KLASSE_SEL_KRIT. Damit kann später ein funktionaler Aufruf der Methode ausgeführt werden. 1. Legen Sie im Component-Controller die Methode GETCTX_ KLASSEN_SEL_KRIT an.

2. Definieren Sie die Schnittstelle der Methode (siehe Abbildung 3.9): 왘

Parameter: rs_value



DeklArt: Returning



Bezugstyp: ZST_03_WD_KLASSE_SEL_KRIT

Abbildung 3.9 Schnittstelle der Methode getctx_klassen_sel_krit( )

3. Wechseln Sie in die Implementierung der Methode, und ermitteln Sie die Werte zu den Context-Attributen für jedes Context-Attribut einzeln. Dazu rufen Sie den Web-Dynpro-Code-Wizard auf und verwenden die Registerkarte Context. Wählen Sie aus dem Context das Attribut NAME_KLASSE im Knoten KLASSEN_SEL_KRIT aus,

119

getctx_klassen_ sel_krit( )

3.1

1315.book Seite 120 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

und setzen Sie die Option Operation auf dem Context auf den Wert Auslesen (siehe Abbildung 3.10). Beachten Sie den Aufbau des Pfades zum Context-Attribut. Dieser besteht aus dem Namen des Knotens, einem Punkt und dem Namen des Attributes. Dieser Aufbau wird in Kapitel 4, »Dynamische Web-Dynpro-Anwendungen«, noch benötigt.



Abbildung 3.10 Auslesen eines Attributes mit dem Web-Dynpro-Code-Wizard

4. Bestätigen Sie Ihre Eingabe über das grüne Häkchen, um den Quelltext zum Auslesen des Context-Attributes NAME_KLASSE einzufügen. Schnittstelle versorgen

5. Um den Wert des Context-Attributes zu übernehmen, müssen Sie dem Exporting-Parameter value der Methode get_attribute( ) noch die Strukturkomponente rs_value-name_klasse übergeben. Damit ist das Auslesen eines Context-Attributes aus der Lead-Selection vollständig implementiert. Zur Übung können Sie noch das Auslesen des Context-Attributes BESCHR_KLASSE implementieren. In Listing 3.3 finden Sie die relevanten Coding-Passagen für den Vergleich mit Ihrer Lösung. ** Variante 1: Einzeln ** * Lesen des Attributes NAME_KLASSE aus dem Element lo_el_klassen_sel_krit->get_attribute( EXPORTING name = `NAME_KLASSE` IMPORTING value = rs_value-name_klasse ). Listing 3.3 Lesen der Werte für die Context-Attribute NAME_KLASSE und BESCHR_KLASSE mit der Methode get_attribute( )

120

1315.book Seite 121 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

Sie werden jetzt möglicherweise überlegen, ob das Auslesen der Context-Attribute nicht kompakter realisiert werden kann, zum Beispiel durch das Lesen aller Attributwerte auf einmal. Eine gute Nachricht: Ja, das ist möglich – es wird im folgenden Abschnitt beschrieben.

Methode get_static_attributes( ) Die Methode GET_STATIC_ATTRIBUTES( ) aus dem ABAP-Interface IF_WD_CONTEXT_ELEMENT liefert alle Attribute zum Element in Form einer Struktur über den Exporting-Parameter static_attributes an den Aufrufer zurück. In Listing 3.4 sehen Sie die Quelltext-Passage, die Sie alternativ zu den beiden get_attribute( )-Aufrufen verwenden können. * Variante 2 – Struktur * lo_el_klassen_sel_krit->get_static_attributes( IMPORTING static_attributes = rs_value ). Listing 3.4 Verwendung der Methode get_static_attributes( ) in der ComponentController Methode getctx_klassen_sel_krit( )

Falls Sie die Methode im Debugger testen, wird unter Umständen folgende Fehlermeldung im Browser angezeigt: Attribut konnte nicht gefunden werden. Diese Meldung erscheint, falls der übergebene Name des Attributes beim Aufruf der Methode get_attribute( ) nicht gefunden werden kann. Dies könnte geschehen, wenn Sie einen falsch geschriebenen Namen für das Attribut übergeben. Zudem ist der Name des Attributes in Großschreibung zu übergeben, da aufgrund von Performanceaspekten in der Implementierung der Methode get_ attribute( ) keine Konvertierung auf Großschreibung durchgeführt wird.

Methode get_static_attributes_table( ) Bisher wurde das Lesen von Einzelattributwerten und allen Attributwerten eines Elementes besprochen. Die Methode get_static_ attributes_table( ) aus dem Interface IF_WD_CONTEXT_NODE bietet schließlich die Funktionalität, alle Attributwerte für alle Elemente eines Context-Knotens auszulesen!

121

Fehlermeldung

3.1

1315.book Seite 122 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

Als Beispiel zur Veranschaulichung soll der Context-Knoten METHODEN vollständig ausgelesen werden. Die METHODEN-Elemente, die Sie zum Auslesen noch anlegen werden, sollten alle Attribute in Form einer internen Tabelle an den Aufrufer zurückliefern. Der Typ für diese interne Tabelle befindet sich im Interface des Component-Controllers. ComponentControllerInterface

Wenn Sie auf die Attribute des Component-Controllers wechseln und dort auf den Bezugstyp IF_COMPONENTCONTROLLER des Attributes wd_this doppelklicken, erscheint die in Abbildung 3.11 gezeigte Definition des Component-Controller-Interface.



Abbildung 3.11 Interface IG_COMPONENTCONTROLLER Tabellentypen im ComponentControllerInterface

Der Name des Tabellentyps für den Context-Knoten METHODEN lautet elements_methoden und ist als Standardtabelle mit dem Zeilentyp element_methoden typisiert (). Dieser wiederum ist mit dem Strukturtyp ZST_03_WD_KLASSE_METHODE standardisiert, das heißt genau jenem Strukturtyp, der für die Definition des Context-Knotens METHODEN verwendet wurde. Um den Tabellentyp bei der Typisierung der Methodenschnittstelle ansprechen zu können, muss der voll qualifizierte Name angegeben werden, das heißt ig_componentcontroller =>elements_methoden. Damit sind Sie für die Implementierung der Lesemethode gerüstet.

122

1315.book Seite 123 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

3.1

1. Legen Sie die Component-Controller-Methode getctx_methoden( ) an. 2. Definieren Sie für die Methode den Returning-Parameter rt_ methoden mit dem Typ ig_componentcontroller=>elements_ methoden. In Abbildung 3.12 sehen Sie das Ergebnis der Typisierung der Schnittstelle.

Abbildung 3.12 Typisierung der Schnittstelle für getctx_methoden( )

3. Die Implementierung der Methode führen Sie wieder mit der Unterstützung des Web-Dynpro-Code-Wizards durch (siehe Abbildung 3.13): Öffnen Sie den Wizard, und wählen Sie als Wert für das Eingabefeld Knoten/Attribut den Context-Knoten METHODEN aus. Bestimmen Sie für die Operation auf dem Context den Wert Auslesen, und setzen Sie die Checkbox für das Feld als Tabellenoperation.

Web-DynproCode-Wizard und Tabellenoperationen

Abbildung 3.13 Auslesen des Contexts mit Tabellenoperation

4. Bestätigen Sie Ihre Eingaben über das grüne Häkchen, um den Quelltext zu erzeugen (siehe Listing 3.5).

123

Quelltext erzeugen

1315.book Seite 124 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

METHOD getctx_methoden . DATA lo_nd_methoden TYPE REF TO if_wd_context_node. * Navigiere zum Knoten lo_nd_methoden = wd_context->get_child_node( name = wd_this->wdctx_methoden ). * Liefere die Attribute der Elemente als Tabelle lo_nd_methoden->get_static_attributes_table( IMPORTING table = rt_methoden ). ENDMETHOD. Listing 3.5 Implementierung der Component-Controller-Methode getctx_methoden( )

Damit sind die Möglichkeiten zum Auslesen von Daten aus dem Context ausführlich besprochen. Woher kommen aber die Daten im Context? Ein Weg wurde bereits gezeigt: die manuelle Eingabe durch den Benutzer. Erforderlich ist jedoch auch die Möglichkeit, funktional die Daten in den Context zu stellen. Das wird das Thema des folgenden Abschnitts sein.

3.1.3 Neue ContextElemente anlegen

Erzeugen von Context-Elementen

Bisher wurde nur auf existierende Elemente zugegriffen und Daten aus den Attributen gelesen oder verändert. Wie können jedoch neue Elemente zu einem Knoten angelegt werden? Zum Erzeugen von Elementen werden drei Methodenalternativen durch das Interface IF_ WD_CONTEXT_NODE zur Verfügung gestellt: 왘

create_element( )

Diese Methode, in Kombination mit bind_element( ), ermöglicht Ihnen, ein Element zu erzeugen, es mit Einzelwerten oder mit einer Struktur zu befüllen und der Knoten-Collection hinzuzufügen. 왘

bind_structure( )

Diese Methode ermöglicht Ihnen auf kompakte Art und Weise, ein neues Element, basierend auf einer Struktur, in der Knoten-Collection anzulegen. 왘

bind_table( )

Diese Methode ermöglicht Ihnen, eine interne Tabelle zum Erzeugen mehrerer Elemente in der Knoten-Collection zu verwenden. Bei allen drei Alternativen haben Sie die Gelegenheit, festzulegen, ob die neuen Elemente oder das neue Element, die alten Elemente oder

124

1315.book Seite 125 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

3.1

das alte Element ersetzt oder ergänzt werden. Um ein neues Element zu einem Knoten anzulegen, muss zuerst die Referenz auf den betreffenden Knoten ermittelt werden. Ein erneuter Blick auf Abschnitt 3.1.1, »Änderung von Attributwerten eines Elementes«, zahlt sich hier aus.

Methoden create_element( ) und bind_element( ) Sehen Sie sich die erste Möglichkeit an: die Verwendung der Methoden create_element( ) und bind_element( ), um ein neues Element zu erzeugen und in die Knoten-Collection einzufügen (siehe Abbildung 3.14). Zuerst muss ein neues Element angelegt (), und die Daten des Elementes müssen gesetzt werden (). Im nächsten Schritt ist das neue Element in die Knoten-Collection einzufügen (). create_element( )

set_static_attributes( )





METHODEN Element 1



Element 2



Element neu







bind_element( )

Abbildung 3.14 Erzeugen eines neuen Elementes und Einfügen in die Knoten-Collection

Um ein neues Element anzulegen, muss die Methode create_ element( ) durch die ermittelte Knotenreferenz aufgerufen werden.

Hierfür existiert keine Unterstützung durch den Web-Dynpro-CodeWizard. Stattdessen verwenden Sie objektorientierte Anweisungsmuster, die Sie wie in der Programmierung mit ABAP Objects verwenden können (siehe Listing 3.6). ** Variante 1 ** * Element über Knoten anlegen lo_el_methode = lo_nd_methoden->create_element( ). * Element mit Struktur befüllen lo_el_methode->set_static_attributes( static_attributes = is_methode ). Listing 3.6 Anlegen des Elementes zum Knoten METHODEN und Befüllung mit der Methode set_static_attributes( )

125

create_element( )

1315.book Seite 126 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

Elementwerte setzen

Die Methode create_element( ) wird für den Knoten aufgerufen, in dem das neue Element anzulegen ist. Sie liefert als Rückgabewert eine Referenz auf ein Objekt vom Typ IF_WD_CONTEXT_ELEMENT, das heißt ein neues Element, das Sie noch übernehmen müssen, um die Attributwerte setzen zu können. Um die Attributwerte des Elementes zu setzen, können Sie entweder die Methode set_attribute( ), die Methode set_static_attributes( ) oder den Parameter static_attribute_values der Methode verwenden. Dieses Element ist aber noch nicht Teil der Knoten-Collection. Das Element der Knoten-Collection hinzuzufügen wird die nächste Aufgabe sein (siehe Listing 3.7). * Element in Collection einfügen lo_nd_methoden->bind_element( new_item = lo_el_methode set_initial_elements = abap_false ). Listing 3.7 Element für Knoten METHODEN an die Knoten-Collection anhängen

bind_element( )

Für das Hinzufügen eines Elementes steht die Methode bind_ element( ) aus dem Interface IF_WD_CONTEXT_NODE bereit. Diese Methode enthält drei Parameter: 왘

new_item

Dieser Parameter dient zur Übergabe der Elementreferenz. 왘

set_initial_elements

Dieser Parameter dient zur Bestimmung des Einfügemodus.





Falls dieser Parameter mit dem Wert ABAP_TRUE belegt wird, ersetzt dieses Element alle vorhandenen Elemente in der KnotenCollection.



Falls der Parameter mit dem Wert ABAP_FALSE versorgt wird, wird das neue Element zu der Knoten-Collection ergänzt, und die vorhandenen Elemente bleiben erhalten. Hier ist natürlich die Kardinalität des Context-Knotens zu beachten!

index

Dieser Parameter dient zur Vorgabe einer Einfügeposition in der Knoten-Collection. Falls kein Index angegeben wird, wird das Element am Ende der Knoten-Collection eingefügt. Damit haben Sie gesehen, wie ein Element angelegt und in die Knoten-Collection eingefügt wird. Doch das eher längliche Coding mutet

126

1315.book Seite 127 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

etwas aufwendig an. Daher wird eine Implementierungsvariante betrachtet, die die Aufgabe des Einfügens eines neuen Elementes effizienter umsetzt.

Methode bind_structure( ) Die Methode bind_structure( ) aus dem ABAP-Interface IF_WD_ CONTEXT_NODE kombiniert das Anlegen eines neuen Elementes mit dem

Setzen der Attributwerte und dem Einfügen in die Knoten-Collection (siehe Abbildung 3.15, ). Dabei bietet die Methode bind_structure( ) die gleichen Parameter wie die Methode bind_element( ). METHODEN Element 1



Element 2



Element neu







bind_structure( )

Abbildung 3.15 Erzeugen eines neuen Elementes mit bind_structure( )

In Listing 3.8 ist die Verwendung der Methode bind_structure( ) als Alternative zu der zuvor besprochenen Herangehensweise zu sehen. ** Variante 2 ** * Element an Collection anhängen lo_nd_methoden->bind_structure( new_item = is_methoden set_initial_elements = abap_false ). Listing 3.8 Erzeugen eines neuen Elementes mit der Methode bind_structure( )

Die Methode bind_structure( ) erzeugt ein einzelnes neues Element in der Knoten-Collection. Falls nun mehrere Elemente zu erzeugen sind – zum Beispiel sollte jede Zeile einer internen Tabelle als Element im Context-Knoten abgelegt werden –, müsste für jedes Element die Methode bind_structure( ) aufgerufen werden. Methode bind_table( ) Das Erzeugen mehrerer Elemente kann natürlich kompakter mit der Methode bind_table( ) aus dem Interface IF_WD_CONTEXT_NODE umgesetzt werden (siehe Abbildung 3.16, ). Zuerst wird es nötig sein,

127

Beschreibung

3.1

1315.book Seite 128 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

eine interne Tabelle mit Daten zu befüllen. Im nächsten Schritt müssen die Daten der internen Tabelle als neue Elemente in die KnotenCollection eingefügt werden. METHODEN Element 1



Element 2



… … …

… …

Elemente neu

… … …

bind_table( ) …





Abbildung 3.16 Elemente erzeugen mit der Methode bind_table( )

Zur Veranschaulichung dieser Methode wird das Beispiel weiterentwickelt. Sie werden diese Methode benutzen, um die Daten zu den Methoden einer ABAP-Klasse in den Context-Knoten METHODEN einzulagern. Dabei werden Sie insgesamt drei Component-Controller-Methoden mit unterschiedlichen Entwicklungsschwerpunkten erzeugen: 왘

is_klasse( )

Diese Methode überprüft, ob der Name, den der Benutzer im Selektionsbild eingegeben hat, dem Namen einer ABAP-Klasse entspricht. Die Anlage dieser Methode wird mit einem sogenannten Service-Aufruf realisiert. 왘

setctx_klassen_methoden( )

Diese Methode setzt die Daten der Methoden zur ABAP-Klasse im Context-Knoten METHODEN mit der Methode bind_table( ). 왘

getmodel_class_description( )

Diese Methode ermittelt ein Beschreibungsobjekt einer ABAPKlasse mithilfe der sogenannten Run Time Type Identification (RTTI), die es zum Beispiel ermöglicht, während der Laufzeit Beschreibungen von ABAP-Klassen zu ermitteln. Die Beschreibung beinhaltet unter anderem die Methoden der ABAP-Klasse. ComponentControllerMethode is_klasse( )

Die erste Methode, die Sie entwickeln werden, ist die ComponentController-Methode is_klasse( ). Bei der Implementierung dieser Methode, die auch ein Beispiel für eine Modellanbindung darstellt, greifen Sie auf bereits vorhandene Implementierungen zurück, um so wenig eigenes Coding wie möglich produzieren zu müssen.

128

1315.book Seite 129 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

Service-Aufruf-Wizard Bei der Implementierung von Modellanbindungen werden Sie durch den sogenannten Service-Aufruf-Wizard unterstützt. Er dient dazu, innerhalb einer Web-Dynpro-Component einen vorhandenen Funktionsbaustein oder auch Methoden einer vorhandenen ABAP-Klasse aufzurufen. Mithilfe dieses Wizards werden automatisch alle benötigten Context-Elemente in einen von Ihnen ausgewählten Controller generiert. Außerdem erzeugt der Wizard automatisch in diesem Controller eine Methode, die den Funktionsbaustein aufruft und die Parameterübergabe sicherstellt. Nun sind Sie wieder gefordert. Sie werden die Methode is_klasse( ) mithilfe dieses Wizards anlegen. In Abbildung 3.17 sehen Sie die Wizard-Schritte, die Sie bei der Anlage des Service-Aufrufes durchlaufen werden.

Start

Ende





   Abbildung 3.17 Service-Aufruf-Wizard zur Erzeugung der Component-ControllerMethode is_klasse( )

1. Starten Sie den Wizard mithilfe des Kontextmenüeintrages Anlegen 폷 Service-Aufruf der Web-Dynpro-Component in der Objektliste. 2. Nachdem der Startbildschirm mit den prinzipiellen Erläuterungen zum Wizard angezeigt wurde, erreichen Sie den nächsten Bildschirm über die Drucktaste Weiter.

129

Beschreibung

3.1

1315.book Seite 130 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

3. Im Schritt Controller auswählen () definieren Sie, wohin der Service-Aufruf generiert wird. Wählen Sie den Punkt Existierenden Controller nutzen, und tragen Sie bei Controller den Wert COMPONENTCONTROLLER ein. Über die Drucktaste Weiter geht es zum nächsten Schritt. Modellanbindung durch ReuseKomponenten

4. Im Schritt Service-Typ auswählen () geht es darum, festzulegen, in welchem Reuse-Komponententyp die Funktionalität verschalt ist. Es stehen die Optionen Funktionsbaustein, Methode einer Klasse und Proxy eines Web Service zur Verfügung. Sie wählen die Option Funktionsbaustein, da die Funktionalität, die Sie wiederverwenden werden, in einem Funktionsbaustein implementiert ist, und wechseln über die Drucktaste Weiter zum nächsten Schritt. 5. Im Schritt Service auswählen () geben Sie den Namen des Funktionsbausteins an, der im Service gerufen werden soll. Der SAPStandard-Funktionsbaustein zur Prüfung der Existenz einer ABAPKlasse lautet SEO_CLASS_EXISTENCE_CHECK. Da Sie keinen RFC-Aufruf (Remote Function Call) des Funktionsbausteins durchführen, darf die Destination (Zielsystem) nicht gepflegt werden. Über die Drucktaste Weiter geht es zum nächsten Schritt.

Schnittstellenanbindung

6. Im Schritt Context anpassen () müssen Sie definieren, über welche Objektart die Schnittstellenparameter des Funktionsbausteins repräsentiert werden sollen. Drei Objektarten stehen zur Verfügung: 왘

Parameter der Controller Methode



Controller Attribut



Context-Knoten beziehungsweise Context-Attribut

Sie sollen die Methode is_klasse( ) so aufrufen können, dass Parameter an die Methode übergeben und Ergebnisse wieder über Parameter an den Aufrufer zurückgeliefert werden. Dazu wählen Sie für clskey und not_active die Objektart Parameter der Methode und wechseln über die Drucktaste Weiter zum nächsten Schritt. Methodenname

7. Im Schritt Methodennamen angeben () vergeben Sie den Namen der Component-Controller-Methode. Geben Sie im Eingabefeld Methode den Namen is_klasse ein, und wechseln Sie über die Drucktaste Weiter zum letzten Schritt.

130

1315.book Seite 131 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

8. Im letzten Schritt Controller generieren werden die Component-Controller-Methode is_klasse( ) und der Context-Knoten SEO_CLASS_EXISTENCE erzeugt. Dazu müssen Sie noch auf die auf Taste Fertigstellen drücken. Damit ist der Wizard abgeschlossen: Sie haben die Component-Controller-Methode is_klasse( ) zur Modellanbindung mithilfe des Service-Aufruf-Wizards erzeugt. Dieser Wizard kann Ihnen viel Zeit bei der Erzeugung von Methoden sparen, wenn Sie vorhandene Reuse-Komponenten verwenden. Um die Methode für das Beispiel verwenden zu können, haben Sie noch einige wenige Anpassungen durchzuführen. Hauptsächlich betreffen die Änderungen die Typisierungen der Schnittstellenparameter, um diese mit den bisher benutzten Typen zu synchronisieren. 1. Löschen Sie den Context-Knoten SEO_CLASS_EXISTENCE. Er wird nicht benötigt, da die Methode is_klasse( ) über ihre Schnittstelle und nicht über den Context kommuniziert. 2. Ändern Sie die Schnittstelle zur Methode is_klasse( ). 3. Ändern Sie den Typ des Importing-Parameters clskey auf SEOCLSNAME, den Sie in den Selektionskriterien verwendet haben. 4. Ändern Sie den Typ des Exporting-Parameters not_active auf WDY_BOOLEAN. 5. Fügen Sie den neuen Exporting-Parameter ed_exists vom Typ WDY_BOOLEAN ein, der dem Aufrufer mitteilt, ob die ABAP-Klasse tatsächlich existiert. 6. Ändern Sie die Implementierung der Methode is_klasse( ), um die Veränderungen der Schnittstellenparameter zu berücksichtigen. Betrachten Sie dazu Listing 3.9, in dem die zu implementierenden Änderungen mit Beginn manuelle Ergänzung eingeleitet und durch Ende manuelle Ergänzung abgeschlossen werden. METHOD is_klasse . * declarations for context navigation * declarations for parameters * Beginn manuelle Ergänzung DATA: ls_seoclskey TYPE seoclskey. * Ende manuelle Ergänzung * get all involved child nodes * get input from context

131

Manuelle Anpassungen

3.1

1315.book Seite 132 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

* Beginn manuelle Ergänzung ls_seoclskey-clsname = clskey. ed_exists = abap_false. * Ende manuelle Ergänzung * the invocation – errors are always fatal !!! CALL FUNCTION 'SEO_CLASS_EXISTENCE_CHECK' EXPORTING clskey = ls_seoclskey "Manuelle Ergänzung ... * error handling CASE sy-subrc. * Beginn manuelle Ergänzung WHEN 0. "Die Klasse existiert! ed_exists = abap_true. * Ende manuelle Ergänzung WHEN

1.

Listing 3.9 Manuelle Anpassungen in der Methode is_klasse( )

Damit haben Sie die Generierung und Implementierung der Component-Controller-Methode is_klasse( ) abgeschlossen. Diese wird später zur Prüfung der Eingabe des Benutzers verwendet. Mit dem Wissen, das Sie über die Verwendung des Service-Aufruf-Wizards gesammelt haben, steht Ihnen nun der Weg offen, eine »saubere« Modellanbindung realisieren zu können. Damit trennen Sie, so wie es der Model-View-Controller-Ansatz (siehe Abschnitt 1.1, »ModelView-Controller«) fordert, die Visualisierungsaspekte von den Modellaspekten. Zusatzübung

Als zusätzliche Übung für die Verwendung des Service-AufrufWizards legen Sie den neuen Service-Aufruf getmodel_klassen_ information( ) im Component-Controller an, um die Beschreibung einer ABAP-Klasse zu ermitteln. Nutzen Sie für Schritt () aus Abbildung 3.17 den Funktionsbaustein SEO_CLASS_READ. Bilden Sie dann die angebotenen Parameter auf Parameter der Methoden ab. Nach der Anlage der Component-Controller-Methode getmodel_klassen_ information( ) ändern Sie die Typisierung des Exporting-Parameters class auf VSEOCLASS und den Typ des Importing-Parameters clskey auf SEOCLSNAME. Zudem löschen Sie den redundanten Context-Knoten SEO_CLASS_READ aus dem Component-Controller-Context. Orientieren Sie sich bei der Implementierung der Methode an der Component-Controller-Methode is_klasse( ). Die Methode getmodel_

132

1315.book Seite 133 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

3.1

klassen_information( ) werden Sie in Abschnitt 3.3.3, »Button«, zur Ermittlung der Beschreibung einer ABAP-Klasse verwenden.

Die Methode is_klasse( ), die zuvor implementiert wurde, prüft, ob eine ABAP-Klasse existiert. Sofern dies der Fall ist, sollten die Namen der Methoden der ABAP-Klasse im Context-Knoten METHODEN als Elemente angelegt werden. Dies wird die Aufgabe der nächsten Methode sein, die Sie implementieren werden. Dabei werden Sie Aspekte der Run Time Type Identification, die Sie im folgenden Abschnitt genauer kennenlernen werden, und die Methode bind_ table( ) nutzen. 1. Legen Sie die Component-Controller-Methode setctx_klassen_ methoden( ) an, und definieren Sie den Importing-Referenzparameter io_classdescr vom Typ CL_ABAP_CLASSDESCR (siehe Abbildung 3.18).

Abbildung 3.18 Schnittstelle der Methode setctx_klassen_methoden( )

Die ABAP-Klasse CL_ABAP_CLASSDESCR ist ein Teil der Run Time Type Identification und wird als Typ für Klassenbeschreibungsobjekte verwendet. Die ABAP-Klasse CL_ABAP_CLASSDESCR besitzt das öffentliche Instanzattribut methods, in dem die Namen der Methoden der ABAP-Klasse in einer internen Tabelle abgelegt sind. 2. Wechseln Sie in die Implementierung der Methode. Dort sollen Sie aus der internen Tabelle ir_classdescr->methods die Methoden Zeile für Zeile auslesen und jede Methode als Element im Context-Knoten METHODEN ablegen. Wie würden Sie diese Anforderung implementieren? Nehmen Sie sich etwas Zeit zum Überlegen, bevor Sie sich das Listing 3.10 genauer ansehen. METHOD setctx_klassen_methoden . * Referenz auf den METHODEN-Knoten DATA lo_nd_methoden TYPE REF TO if_wd_context_node. * Die interne Tabelle zum Knoten METHODEN DATA lt_methoden TYPE wd_this->elements_methoden.

133

Elemente erzeugen

1315.book Seite 134 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

* Die Struktur eines Elementes METHODEN DATA ls_methode TYPE wd_this->element_methoden. * Eine Zeile aus den Modelldaten für die Methoden FIELD-SYMBOLS: LIKE LINE OF io_classdescr->methods. * Ermittlung der Knotenreferenz für METHODEN lo_nd_methoden = wd_context->get_child_node( name = wd_this->wdctx_methoden ). * Transformation der Modelldaten in Knotendaten IF io_classdescr IS BOUND. LOOP AT io_classdescr->methods ASSIGNING . * Modelldaten in Context-Struktur transportieren MOVE-CORRESPONDING TO ls_methode. * Icon für Methodenart setzen CASE abap_true. WHEN ls_methode-is_class. ls_methode-art_icon = 'ICON_OO_CLASS_METHOD'. WHEN ls_methode-is_interface. ls_methode-art_icon = 'ICON_OO_INTERFACE'. WHEN OTHERS. ls_methode-art_icon = 'ICON_OO_INST_METHOD'. ENDCASE. * An die Context-Tabelle anhängen APPEND ls_methode TO lt_methoden. ENDLOOP. ENDIF. * Tabelle an den Knoten anhängen lo_nd_methoden->bind_table( new_items = lt_methoden set_initial_elements = abap_true ). ENDMETHOD. Listing 3.10 Implementierung der Component-Controller-Methode setctx_klassen_ methoden( ) Implementierungsdetails

Die Implementierung der Methode beginnt mit der Ermittlung der Referenz des Context-Knotens METHODEN. Danach folgt das zeilenweise Auslesen der internen Tabelle ir_classdescr->methods. Das Feldsymbol wurde verwendet, um Referenzen auf die Einträge der internen Tabelle zu ermitteln. Mit der Anweisung MOVE-CORRESPONDING werden die namensgleichen Modelldaten in die Datenstruktur für das Context-Element transportiert. Damit wird eine methodenlokale interne Tabelle aufgebaut, die dann mit-

134

1315.book Seite 135 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

hilfe der Methode bind_table( ) an den Context-Knoten übergeben wird und dort alle Elemente anlegt. Hinweis

War die Aufgabe schwer zu lösen? Erfahrungsgemäß ist diese Art der Aufgabenstellung symptomatisch bei der Entwicklung von Web-Dynpro-Anwendungen, deshalb wurde sie Ihnen hier präsentiert. Die Implementierung einer Methode beginnt meistens mit dem Auslesen von Daten aus einem Context. Diese Daten dienen dann als Basis für die Geschäfts- oder Visualisierungslogik. Nach der Abarbeitung dieser Logiken werden die neuen oder veränderten Daten am Ende der Methodenimplementierung in den Context zurückgestellt.

Run Time Type Identification Die Implementierung der nächsten Methode führt Sie in ein weiteres zentrales Thema der Context-Programmierung ein, die Run Time Type Identification (RTTI). Die RTTI stellt die Mechanismen zur Verfügung, um während der Laufzeit Beschreibungen von Typen, das heißt auch von ABAP-Klassen, zu ermitteln. Dies geschieht in Form von Beschreibungsobjekten, die mit ABAP-Klassen aus der RTTI typisiert sind. In Abbildung 3.19 sehen Sie die Vererbungshierarchie der RTTI-ABAP-Klassen. CL_ABAP_TYPEDESCR

CL_ABAP_DATADESCR

CL_ABAP_ELEMDESCR

CL_ABAP_REFDESCR

CL_ABAP_OBJECTDESCR

CL_ABAP_CLASSDESCR

CL_ABAP_INTFDESCR

CL_ABAP_COMPLEXDESCR

CL_ABAP_STRUCTDESCR

CL_ABAP_TABLEDESCR

Abbildung 3.19 Vererbungshierarchie der RTTI-ABAP-Klassen

Die Klasse CL_ABAP_TYPEDESCR ist die Wurzelklasse der RTTI und ermöglicht während der Laufzeit die Erzeugung von Beschreibungen

135

CL_ABAP_ TYPEDESCR

3.1

1315.book Seite 136 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

der Laufzeitobjekte, wie zum Beispiel von ABAP-Klassen. Dabei spielt unter anderem die Methode describe_by_name( ) eine wichtige Rolle: Über diese Methode wird das Beschreibungsobjekt an den Aufrufer zurückgeliefert. Die RTTI selbst ist ein Teil der Run Time Type Services (RTTS), die auch noch die Run Time Type Creation (RTTC) umfasst, die für diese Aufgabenstellungen aber nicht relevant ist und daher auch nicht weiter behandelt wird. Casting

Wichtig zu wissen ist, dass die Methode describe_by_name( ) immer ein Objekt vom Typ CL_ABAP_TYPEDESCR zurückliefert. Das bedeutet für den Anwender, dass ein Downcast auf den entsprechenden Typ durchgeführt werden muss, um auf die interessanten Details, wie zum Beispiel die Liste der Methoden zu einer ABAP-Klasse, zugreifen zu können. Dazu muss eine Unterklasse verwendet werden, wie zum Beispiel die ABAP-Klasse CL_ABAP_CLASSDESCR, die in Abbildung 3.19 farblich hervorgehoben ist. Im Folgenden wird im Rahmen der Implementierung der ComponentController-Methode getmodel_class_description( ) die Verwendung der RTTI genauer betrachtet. Diese Methode ermittelt aufgrund der Eingabe des Benutzers das Beschreibungsobjekt für eine ABAPKlasse. Dabei ist natürlich zu prüfen, ob die ABAP-Klasse existiert, und darüber hinaus müssen die Methoden aus dem Beschreibungsobjekt im Context abgelegt werden. Dafür werden Sie die beiden von Ihnen zuvor implementierten Methoden is_klasse( ) und setctx_klassen_ methoden( ) in der neuen Methode getmodel_class_description( ) verwenden – ein schönes Beispiel für Wiederverwendung.

getmodel_class_ description( )

1. Legen Sie die Methode getmodel_class_description( ) im Component-Controller an. Definieren Sie für diese Methode die zwei Exporting-Parameter ed_exists und not_active, jeweils vom Typ WDY_BOOLEAN (siehe Abbildung 3.20).

Abbildung 3.20 Schnittstelle der Methode getmodel_class_description( )

136

1315.book Seite 137 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

2. Wechseln Sie in die Implementierung der Methode. Versuchen Sie, die Methode Schritt für Schritt zu implementieren. Falls Sie dazu Denkanstöße benötigen, können Sie einen Blick auf Listing 3.11 riskieren. METHOD getmodel_class_description . * Ausnahmeobjekt DATA: lo_exception TYPE REF TO cx_root, * Klassenbeschreibung lo_classdescr

TYPE REF TO cl_abap_classdescr,

* Typbeschreibung der Klasse lo_typedescr TYPE REF TO cl_abap_typedescr, * Selektionskriterien lv_rs_value TYPE wd_this->element_klassen_sel_krit. * Hole den Namen der Klasse aus dem Context lv_rs_value = wd_this->getctx_klassen_sel_krit( ). * Prüfung, ob der Name der Klasse gültig ist TRY. wd_this->is_klasse( EXPORTING clskey = lv_rs_value-name_klasse IMPORTING ed_exists = ed_exists not_active = not_active ). * Ermittlung der RTTI-Beschreibung CALL METHOD cl_abap_typedescr=>describe_by_name EXPORTING p_name = lv_rs_value-name_klasse RECEIVING p_descr_ref = lo_typedescr EXCEPTIONS type_not_found = 1 OTHERS = 2. * Klasse existiert nicht IF sy-subrc 0. ed_exists = abap_false. not_active = abap_true. ENDIF. * Downcast von CL_ABAP_TYPEDESCR auf CL_ABAP_CLASSDESCR lo_classdescr ?= lo_typedescr. CATCH cx_root INTO lo_exception. * Klasse existiert nicht ed_exists = abap_false.

137

3.1

Implementierung

1315.book Seite 138 Dienstag, 31. März 2009 11:16 11

3

Entwicklung von Web-Dynpro-Anwendungen

not_active = abap_true. ENDTRY. * Ablage der Referenz in den Attributen wd_this->go_klassen_beschreibung = lo_classdescr. * Aufbereiten der Daten für den Context wd_this->setctx_klassen_methoden( io_classdescr = lo_classdescr ). ENDMETHOD. Listing 3.11 Implementierung der Component-Controller-Methode getmodel_class_description( ) Beschreibung

Die Methode sollte im ersten Schritt die Selektionskriterien aus dem Context auslesen. Sie macht das aber nicht direkt, sondern verwendet dazu die zuvor implementierte Methode getctx_klassen_sel_ krit( ). Danach wird die Methode is_klasse( ) eingesetzt, um festzustellen, ob der Suchname dem Namen einer ABAP-Klasse entspricht. War die Suche erfolgreich, wird die statische Methode cl_abap_ typedescr=>describe_by_name( ) verwendet, um die Beschreibung zur Klasse zu ermitteln. Nachdem das Downcasting durchgeführt wurde, wird das Beschreibungsobjekt zur ABAP-Klasse in den Attributen des Component-Controllers abgelegt. Sie müssen dazu noch das öffentliche Attribut go_klassen_beschreibung vom Typ CL_ABAP_ CLASSDESCR definieren. Am Ende der Methode wird die Methode setctx_klassen_methoden( ) benutzt, um die Daten im Context zu setzen. Damit sind die Implementierungen abgeschlossen und können zum Beispiel mithilfe des Web-Dynpro-Debuggers (siehe Kapitel 8, »Tipps und Tricks aus der Praxis«) getestet werden. Damit wurden die Möglichkeiten erläutert, um Elemente im Context zu erzeugen. Der nächste Abschnitt rundet das Thema der ContextProgrammierung ab: Es geht um das Löschen von Context-Elementen.

3.1.4 remove_element( )

Löschen von Context-Elementen

Für das Löschen von Elementen steht die Methode remove_ element( ) im Interface IF_WD_CONTEXT_NODE zur Verfügung (siehe Abbildung 3.21).

138

1315.book Seite 139 Dienstag, 31. März 2009 11:16 11

Context-Programmierung

get_element( )

 METHODEN Element 1



Element 2



Element löschen







remove_element( )

Abbildung 3.21 Entfernen eines Elementes mit remove_element( )

Die Referenz des Elementes, das zu löschen ist, kann zum Beispiel über die Methode get_element( ) ermittelt werden (). Der Methode remove_element( ) () muss über den Importing-Parameter element die Referenz auf das Element übergeben werden, das zu entfernen ist. Des Weiteren steht der Parameter has_been_removed als Returning-Parameter vom Typ ABAP_BOOL zur Verfügung, um festzustellen, ob das Element bereits existent war (ABAP_TRUE) oder nicht (ABAP_FALSE). Mit dem Löschen von Context-Elementen ist das Thema der ContextProgrammierung aus der Sicht einer Einführung in dieses Thema vollständig besprochen. Damit sind Sie nun in der Lage, das Anlegen und Manipulieren von Context-Daten zu implementieren. Zusätzlich wurden die Run Time Type Identification als zentrales Hilfsmittel in der Context-Programmierung eingeführt und die praktische Anwendbarkeit beispielhaft beschrieben. Die wichtigste Methode, die bei der Verwendung der RTTI hauptsächlich zum Einsatz kommt, ist cl_abap_typedescr=>describe_by_name( ). Der Service-Aufruf-Wizard hat wertvolle Dienste bei der Realisierung der Modellanbindung geleistet. Sie haben gesehen, wie vorhandene Reuse-Komponenten einfach wiederverwendet und in der Beispielanwendung genutzt werden können. Der nächste Abschnitt wird Ihnen die Definition und Programmierung von Views näherbringen. Dazu werden Layouts und Container sowie die wichtigsten View-Elemente detailliert dargestellt.

139

Service-AufrufWizard

3.1

1315.book Seite 465 Dienstag, 31. März 2009 11:16 11

Index _blank 205 1 aus n 331, 337

A ABAP Debugger 씮 Debugger ABAP Dictionary 106 ABAP 260 ABAP_INTFDESCR 260 Datenelement 107 DATS 349 Erweiterungskategorie 107 SEOCPDNAME 263 SEOEXPOSE 332 SFBECLNAME 350, 367 Struktur 105, 106 Strukturänderung 332 Strukturkomponente 106 Strukturtyp 105 Suchhilfe 344, 345 T100 212 Text 211, 212 TIMS 349 transparente Tabelle 105 View 105 WDR_CONTEXT_ATTR_VALUE 335 WDR_CONTEXT_ATTRIBUTE_INFO 256, 258 WDR_NAME_VALUE_LIST 231 WDR_TEXT_KEY 218 WDUI_TRI_STATE 343 ABAP List Viewer 씮 SAP List Viewer ABAP Workbench 36 ABAP-Anweisung CATCH 229, 236 CONCATENATE 207 EXIT 116 FIELD-SYMBOLS 368 MESSAGE 221 MESSAGE WITH 221 MOVE-CORRESPONDING 118, 134 RAISE 228 SELECT-OPTIONS 364 TRY 236 ACC Warnung 167

Advanced List Viewer 씮 SAP List Viewer Aggregation 141 AJAX 19, 34, 420 Aktion 41, 78 Anlage 57, 58, 78, 91 Ereignisbehandler 78 Standard 79, 238 validierungsunabhängige 79, 239 Aktionsbehandler 163 Aliasname 214 ALV 씮 SAP List Viewer Animation 씮 Performance Anpassungsanforderung 383 Anpassungshierarchie 384 Anweisungsmuster 125 Anwendung Eigenschaft 47 Test 48 Anwendungskonfiguration Sicherung 390 Test 390 URL-Parameter 391 Zuordnung 391 Anwendungsparameter 48, 399 WDCONFIGURATIONID 391, 399 WDDISABLEUSERPERSONALIZATION 399 WDHIDEMOREFIELDHELPASDEFAULT 373 Anzeigeposition 162 Arbeitsgeschwindigkeit 329 Architekturmuster 20 Assistance-Klasse 79, 216 Text 212 Asynchronous JavaScript and XML 씮 AJAX Attribut Anlage 88 wd_assist 79, 218 wd_comp_controller 66, 75 wd_context 65, 83, 112 wd_this 65 Attributinformation 332 Ausnahme 228 Ausnahmeklasse Ausnahmetext 212

465

1315.book Seite 466 Dienstag, 31. März 2009 11:16 11

Index

Ausnahmeklasse (Forts.) CX_ROOT 228 CX_WD_CONTEXT 118 Ausnahmemechanismus 228 Auswahlliste 331, 332 Domänenfestwert 332 Implementierung 332, 335

B BAdI 449 Barrierefreiheit 167 Prüfung 167 Baumeingabe 187 Baumhierarchie 180 Benutzerfreundlichkeit 329 Bereichsauswahl 194 Beschreibungsobjekt 249 Blatt 177 Blätterspalte 187 Browse-Button 210 Browser-Fenster 씮 Popup-Fenster BSP 씮 Business Server Pages Business Add-in 씮 BAdI Business Function Set 450 Business Server Pages 19, 24, 28

C Cascading Stylesheets 149, 405 Maßeinheit 149 Change-Log 씮 Context Client-Server-Architektur 25 Compiler 33 Component Aktivierung 48 Controller-Interface 122 Interface 39 Kopie 417 Component-Controller 씮 Controller Component-Interface 306 Anlage 306 Component-Verwendung 286, 287 Aktualisierung 304 Anlage 295 Beispiel 288 Controller-Verwendung 72, 298 Definition 287 Eintrag 292

466

Component-Verwendung (Forts.) fremde Methode 297 fremdes Ereignis 297 Instanzierung 294 Configuration-Controller 386 Setzen 394 Container 141 Element 40 Group 141 TransparentContainer 141 Tray 141 ViewContainerUIElement 142 Content-Management-System 19 Context 80, 104 Attribut 104, 109, 333 Attributanlage 255, 256 Aufbau 81 Bindung 98 Change-Log 402, 437, 438 Datenbindung 84 Definition 80 Editor 83 Eigenschaft 85 Element 44, 81, 124 Erweiterung 452 externes Mapping 418 Interface-Knoten 300 Kardinalität 82, 85 Knoten 81, 87, 104, 249, 250, 252, 254 Knotenattribut 88 Knotenstruktur 249 Konstante 93 Laufzeit 82 Lead-Selection 86, 87 Mapping 94, 96, 288, 291, 333 Navigation 111 Parametertabelle 258 Pfad 120 Programmierung 104 Rekursionsknoten 181 RTTI 259 Verwendung 89 Context-Change-Log 씮 Context Context-Mapping componentübergreifendes 299 Definition 301 einfaches 299, 300, 301 externes 299, 302, 303, 304, 305, 310

1315.book Seite 467 Dienstag, 31. März 2009 11:16 11

Index

Context-Mapping (Forts.) Löschung 304 Controller 63 Attribut 65 Component 38, 64, 73 Custom 64, 386, 392, 394 Interface 64, 288, 296, 297, 299 Methode 66 Sichtbarkeit 72, 75 View 64 Window 64, 70 Controller-Verwendung 씮 ComponentVerwendung Custom-Controller 씮 Controller Customizing 396 Dialogfenster 397 Modus 396 Start 396

D Data Dictionary 32 Datei Export 204, 209 Import 204 Daten Invalidierung 206 Konvertierung 207 Datenbindung 씮 Context Datenquelle 181 Datentyp einfacher 340 Datenzeile 187 Bereich 188 DDIC-Bindung 213 Debugger 401, 426, 427 Context 428 Layout 427 neuer 427 Startproblem 427 Default-View 417 Dereferenzierung 368 Dialogfenster 씮 Popup-Fenster Downcast 136 Drei-Schichten-Architektur 20, 21 Drucktaste 163 dynamische Programmierung 246 Dynpro 25, 142 Ablauflogik 26

Dynpro (Forts.) Datentransport 27 Maskendefinition 26 Process After Input 26 Process Before Output 26

E Easy-POWL 씮 POWER-List Editierbarkeit 160 Eigenschaft accessibilityDescription 167 activateAccessKey 443 behaviour 208 cellDesign 143, 144, 149 cellPadding 151 cellSpacing 151 checked 339, 343, 444, 447 colCount 152, 337, 338 colSpan 149 contextMenuBehaviour 445, 447 contextMenuId 444, 445, 447 data 205 dataSource 175, 176, 190, 342 defaultItemIconSource 175 defaultNodeIconSource 175 Default-Wert 111 descriptiveText 341 design 46, 57, 59, 157, 191, 376 Dictionary-Struktur 108 displayEmptyRows 192 emptyTableText 192 enabled 46, 100, 175 Erweiterung 454 expanded 176, 179 explanation 371, 443 fileName 208 finale 388, 397 hAlign 146, 149, 157 handleHotkeys 440 hasChildren 176 height 149 iconSource 176, 341 ignoreAction 179 imageSource 163, 169, 206 Kardinalität 109, 110, 189 keyToSelect 337 labelFor 160, 291 Layout 142

467

1315.book Seite 468 Dienstag, 31. März 2009 11:16 11

Index

Eigenschaft (Forts.) Layoutdaten 142 Lead-Selection 109 length 160 MenuCheckBox 447 mimeType 204 multipleSelection 342 OVS-Component-Verwendung 352 paddingBottom 152 paddingLeft 152 paddingRight 153 paddingTop 153 passwordField 160 readOnly 160 rootText 175 rootVisible 175 rowBackgroundDesign 146, 149 rowDesign 147 rowSelectable 193 scrollingMode 141, 185 selectedKey 337, 338, 445 selectedTab 169 Selection 189, 193 selectionChangeBehaviour 342 selectionMode 193 Sichtbarkeit 388 sortState 196 state 160, 237 strechedVertically 148 stretchedHorizontally 148 target 205 text 46, 157, 160, 169, 206, 337, 341, 374 textDirection 157 textDocumentName 375 texts 96, 337, 340 title 175, 289 titleVisible 175 tooltip 46, 163, 370 vAlign 149 value 84, 90, 160, 456 vGutter 143, 144, 149 visible 46, 84, 100 visibleItems 341 visibleRowCount 191 width 149, 192 wrapping 143, 157 einfaches Mapping 씮 Context Einfachselektion 341

468

Eingabehilfe 329 Auswahlmöglichkeit 329 umgebungssensitive 109 Wertehilfe 329 Einstellung persönliche 396 Einzelauswahl 194 Element 씮 Context Empty View 씮 View Enhancement Builder 449 Enhancement Framework 449 Enhancement 씮 Erweiterung Entwicklungszeit 14, 243 Context-Definition 245 Ereignis 76 Definition 76 Ereignisbehandler 77 onAction 57, 59, 164, 179 onEnter 91 onExpandAll 178 onLeadSelection 195 onLoadChildren 180 onSelect 96, 331, 334 onSort 196 Registrierung 76 Sichtbarkeit 76 Ereignisbehandler 76, 297 Mechanismus 164 Methode 42 OVS 352 Ersetzungswert 231 Erweiterung Abgleich nach Upgrade 458 Anlage 450 Component-Verwendung 452 Context 453 Exit-Methode 457 explizite 450 Implementierung 456 implizite 449 Layout 454 Mapping 454 Methode 453 Navigationslink 452 Plug 452 UI-Element 454, 457 zusammengesetzte 451 Exit-Methode 453

1315.book Seite 469 Dienstag, 31. März 2009 11:16 11

Index

Expansion 176 externes Mapping 씮 Context

F Fehlernachricht 239 Attribut 121 Context-Bezug 239 Feldbezeichner 212 Field-Symbol 368 first_time 265, 271 fixedTableLayout 193 Flattersatz 146 Form tabellarische 340 framework controlled 씮 View-Lebensdauer Fremdschlüsselverprobung 347 Funktion 187 Funktionsbaustein 129 DOCU_CREATE 375 DOCU_GET 374 SEO_CLASS_LIB_INTROSPECTION 361

H Häkchen 339 Hello World 36 Help Center 380 Hierarchie 170 Hilfe &DEFINITION& 372 &USE& 372 Anwendung 380 Ausblendung 376 Erläuterung 370, 373 Erläuterungstext 370, 371 F1-Hilfe 370, 372 F4-Hilfe 344 Felddokumentation 372 Hilfetext mit Quickinfo 370 Info-Objekt 376 KW-Dokument 370, 376 Link 377, 380 mehr Feldhilfe 372 Menütext 377 semantische 330, 369 Soforthilfe 372 technische 372

Hook-Methode 66 Ablaufreihenfolge 69 Hotkey 402, 438 globaler 440 lokaler 440 Tastenkombination 439 UI-Element 439 Visualisierung 440 HTMLB 30 HTTP-Roundtrip 156

I Icon 164 IETF 204 Inbound-Plug 씮 Plug Individualisierung 396 Information semantische 370 Informationsobjekt 249 Inhaltsbereich 168 Inline-CSS 씮 Performance Interface Component-Controller 122 element_* 122 elements_* 122 IF_POWL_FEEDER 328 IF_SALV_WD_TABLE_* 315 IF_WD_COMPONENT 431 IF_WD_COMPONENT_USAGE 408 IF_WD_CONTEXT 437 IF_WD_CONTEXT_ELEMENT 82, 114 IF_WD_CONTEXT_NODE 82, 93, 112 IF_WD_CONTEXT_NODE_INFO 251, 252, 263, 264 IF_WD_MESSAGE_MANAGER 225, 228 IF_WD_OVS 354 IF_WD_SELECT_OPTIONS 365 IF_WD_TABLE_METHOD_HNDL 197, 202 IF_WD_WINDOW 431, 435 IG_COMPONENTCONTROLLER 122 View 53 Interface-Controller 씮 Controller Interface-Knoten 씮 Context Interface-Typ 297 IF_* 297 IG_* 297

469

1315.book Seite 470 Dienstag, 31. März 2009 11:16 11

Index

Interface-Typ (Forts.) IWCI_* 297 Interface-View 288 WND_SELECTION_SCREEN 365 Internationalisierung 211 Internet Engineering Task Force 씮 IETF Internet Transaction Server 씮 ITS Intervalleingabe 364 ItemListBox 174 ITS 19, 24, 28, 31

J JavaServer Pages 28 Joker 345

K Kalenderhilfe 349 Kardinalität 씮 Context Karteikarte Anlage 172 Karteireiter 168 Key-Technik 334 Klasse Beschreibungsobjekt 133 CL_ABAP_CHAR_UTILITIES 207 CL_ABAP_CONV_OUT_CE 206 CL_SALV_WD_CONFIG_TABLE 311 CL_TEXT_IDENTIFIER 213 CL_WD_COMPONENT_ASSISTANCE 79 CL_WD_DYNAMIC_TOOL 189, 237, 278 CL_WD_FORMATTED_TEXT 374 CL_WD_RUNTIME_SERVICES 209 CL_WD_UTILITIES 216 Konstante 257 Knopf 336 Knoten Collection 125 kollabierter 176 nicht rekursiver 173, 174 rekursiver 173, 180 Knoteninformation 332 Konfiguration 385 Anlage 386 Anwendungskonfiguration 385, 389 Component-Defined 395

470

Konfiguration (Forts.) Component-Konfiguration 390 explizite 392, 395 implizite 386 Konfigurationsdatensatz 385, 386 Pflegeoberfläche 388 Sicht 387 Konfigurationsdatensatz 386 Pflege 395 Konfigurationseditor 385 Konfigurationsmodus sap-config-mode=X 396 Konfigurator 385 Konsole 24 Konstante Verwendung 257 Kontextmenü 402, 441 Anlage 446 dynamisches 445 Einsatzszenario 441 Entwicklung 444 Feldhilfe 443 Sichtbarkeit 442 Soforthilfe 443 Standardwert 443 statisches 445 Systemmenü 442 Zugangstaste 442 Konvertierungsobjekt 207 Kopie strukturelle 185 Kurztext 370

L Laden dynamisches 180 Länge definierte 217 maximale 217 Laufzeit 15, 243 Laufzeitanalyse 씮 Performance Layout 142 Daten 142 FlowLayout 41, 143 GridLayout 41, 150 MatrixLayout 41, 147 RowLayout 41, 146

1315.book Seite 471 Dienstag, 31. März 2009 11:16 11

Index

Lead-Selection DropDownByIndex 331 RadioButtonGroupByIndex 338 Lightspeed-Rendering 410, 420, 438 Listbox 341

M m aus n 339 Mainframe-Server 25 Mapping 씮 Context Markierspalte 187 MatrixData 148 MatrixHeadData 148 Mehrfachselektion 341 Meldung 72 permanente 239 Standard 239 Message Area 222 Attribuierung 223 Design 223 Liste 224 Message Manager 72, 225 Metadaten 33 Metainformationsobjekt 249 Methode add_attribute( ) 256, 265 add_child( ) 273, 283 add_new_child_node( ) 252, 254, 260, 261, 265 add_selection_field( ) 365 attach_file_to_response( ) 209 bind_( ) 283 bind_element( ) 112, 124, 125, 126 bind_structure( ) 92, 112, 127, 263 bind_table( ) 112, 127, 135, 409 bound_( ) 283 check_mandatory_attr_on_view( ) 238 clear_messages( ) 240 convert( ) 207 create( ) 207 create_component( ) 295, 367, 416 create_element( ) 112, 124, 125 create_from_sapscript( ) 374 create_range_table( ) 365 create_table_from_node( ) 189, 278 delete_component( ) 295, 408 describe_by_name( ) 136, 138, 260 enable_context_change_log( ) 437

Methode (Forts.) funktionale 114 get_( ) 283 get_attribute( ) 114, 118, 119, 265 get_attributes( ) 265 get_child( ) 283 get_child_node( ) 92, 112, 265 get_child_nodes( ) 265, 275 get_children( ) 283 get_context( ) 437 get_element( ) 112, 269 get_element_count( ) 100, 112 get_lead_selection( ) 95 get_message_area( ) 224 get_messages( ) 240 get_node_info( ) 251, 264, 335 get_on_( ) 283 get_parent( ) 265 get_range_table_of_sel_field( ) 368 get_root_element( ) 267, 269 get_selected_elements( ) 195, 341 get_static_attributes( ) 114, 118, 121 get_static_attributes_table( ) 112, 118, 121 get_string( ) 281 get_text( ) 219 get_window_manager( ) 431 has_active_component( ) 295, 367 if_wd_component_assistance~get_text( ) 216 init_selection_screen( ) 365 is_empty( ) 240 is_selected( ) 341 new_( ) 271, 277, 280 new_caption( ) 276 new_matrix_head_data( ) 273 new_matrix_layout( ) 271 new_tab( ) 275 new_tabstrip( ) 273, 282 new_transparent_container( ) 277 path_get_node( ) 277, 341 remove_all_children( ) 273, 283 remove_attribute( ) 265 remove_child( ) 283 remove_child_node( ) 264, 265 remove_child_nodes( ) 265 remove_element( ) 95, 112, 138 remove_message( ) 240

471

1315.book Seite 472 Dienstag, 31. März 2009 11:16 11

Index

Methode (Forts.) report_attribute_error_message( ) 231, 233 report_attribute_exception( ) 235 report_attribute_message( ) 233 report_attribute_t100_message( ) 233, 234 report_element_error_message( ) 233 report_element_exception( ) 235 report_element_t100_message( ) 233 report_error_message( ) 233 report_exception( ) 235 report_fatal_error_message( ) 233 report_fatal_exception( ) 235 report_message( ) 233 report_success( ) 233 report_t100_message( ) 233, 234 report_warning( ) 233 Schnittstelle 113 set_( ) 271, 283 set_attribute( ) 114 set_configuration( ) 355 set_content( ) 277 set_display_attributes( ) 224 set_global_options( ) 365 set_image_source( ) 277 set_input_structure( ) 358 set_on_( ) 280, 283 set_output_table( ) 360 set_selected( ) 340, 341 set_static_attributes( ) 114, 117, 409 set_text( ) 376 set_text_document_name( ) 376 set_width( ) 271 Signatur 113 Typ 66 wd_cpifc_( ) 297 wd_cpuse_( ) 294 wd_get_api( ) 435 wddoafteraction( ) 71 wddoapplicationstatechange( ) 70 wddobeforeaction( ) 71, 236 wddobeforenavigation( ) 70, 71 wddoexit( ) 69 wddoinit( ) 69 wddomodifyview( ) 71, 265, 410 wddoonclose( ) 70 wddooncontextmenu( ) 444, 445 wddoonopen( ) 70

472

Methode (Forts.) wddopostprocessing( ) 70 Methodentyp einfacher 66 Ereignisbehandler 67 Supply-Funktion 67, 98 Microsoft Excel Blatt 208 Plug-in 208 MIME Darstellung 208 Typ 204 Modellanbindung 128, 132 Model-View-Controller 20, 24, 29, 34, 41, 49 Beispiel 23 Business Server Pages 29 Controller 22 Herkunft 20 Model 21 View 22 Modifikation 449 MouseOver 163 Multi-Component-Architektur 285, 286 Beispiel 287 Component-Instanzierung 289 Performance 287 Mussfeld-Prüfung 237 MVC 씮 Model-View-Controller

N Nachricht 211, 221 Nachrichtenbereich 222 Nachrichtenkategorie 227 Ausnahme 228 Tabelle T100 228 Text 228 Nachrichtenklasse 221, 233 Nachrichtennummer 221, 233 Nachrichtenpflege 221 Nachrichtentext 221 Platzhalter 221 Nachrichtentyp 221, 233 Fehler 221 Information 221 Nachrichtenverlinkung 231 Navigation Element 168

1315.book Seite 473 Dienstag, 31. März 2009 11:16 11

Index

Navigation (Forts.) Menü 168 Navigationslink 50, 62 Nicht-Singleton-Knoten 177 Null-Client 25

O Oberflächenelement 339 Object Value Selector 씮 OVS Online Text Repository 씮 OTR OTR 211, 213 Aliastext 213 Browser 213 Grundwortschatz 214 Kurztext 213 Namensaufbau 215 Pflege 215 SOTR_VOCABULARY_BASIC 214 Outbound-Plug 씮 Plug Overwrite-Exit 452, 453, 457 OVS 345, 350 Anbindung 351 Aufruf 354 Eingabefeld 355 Ereignisbehandler 353 Ergebnismenge 360 Ergebnis-View 353 Fenstertitel 354 Gruppenüberschrift 355 if_wd_ovs=>co_phase_0 358 Konfigurationsaspekt 355 Label 355 ovs_callback_object 353 ovs_callback_object->phase_indicator 354 ovs_callback_object->query_parameters 361 ovs_callback_object->selection 362 Phasen 354, 358, 360, 362 Phasenmodell 353 Selektions-View 353 Spaltenüberschrift 354 Suchilfekontext 359 Überschrift 354 Verwendung 351 Wertehilfe 350

P PAI 156 Parameter 113 Aktualparameter 113 Art 113 Changing 114 Exporting 113 Formalparameter 113 Importing 113 Returning 114 Typ 114 Parameterreferenz view 265 Performance 174 Analyse-Tool 410 Animation 405, 406 Backend-Laufzeit 403 Checkliste 407, 408, 409 Component-Instanzierung 408 Context-Änderung 423 Datenkomprimierung 404 Datenmenge 403 Delta-Rendering 405, 406, 420, 421, 422, 425 Dirty-Flag 421, 425 Document Object Model 410, 413 Frontend-Rendering-Laufzeit 404 HTTP-Komprimierung 406 Inline-CSS 405 Instanzierung 415 Laufzeitanalyse 404 Nesting-Analyse 410, 412 On-Demand-Instanzierung 426 Performancemonitor 410 Roundtrip 420, 421 Sichtbarkeit 416 Singleton 178, 409 Struktur 409 Systemkonfiguration 404 Trace-Tool 410, 413, 423 View-Lebensdauer 408 Personal Object Work Entity Repository List 씮 POWER-List Personalisierung 396 Start 398 Pfad absoluter 210 Pflichteingabe 158

473

1315.book Seite 474 Dienstag, 31. März 2009 11:16 11

Index

Phasenmodell 69, 71 Platzhalter 217, 229 Plug 49 Ereignisbehandler 59, 78 Exit 55 Inbound 50 Interface-Flag 54 Konvention 58 Outbound 50 Resume 54, 55 Standard 54 Startup 53 Suspend 55 Popup-Fenster 56, 402, 429 Browser-Fenster 433 Button 434 Button-Konstante 435 close( ) 433 create_popup_to_confirm( ) 430 create_window( ) 430, 432 create_window_for_cmp_usage( ) 430, 431 Dialogfenster 432 Erzeugung 431 Fenstergröße 434 modales 429 Öffnung 433 open( ) 433 Schließen 433 set_window_size( ) 434 subscribe_to_button_event( ) 434 Window-Manager 430, 433 Post-Exit 452, 453 POWER-List 324 Abfrage 325 Anwendungsmöglichkeit 325 Easy-POWL 327 Favorit 326 Feeder-Klasse 325 kalkulierte Daten 326 POWL_EASY_DEMO 325 Suchkriterium 325 Pre-Exit 452, 453 Primäreigenschaft 157, 161, 190 Process After Input 씮 PAI Programmierung Aktion 280 Attribut 255 Context 248

474

Programmierung (Forts.) Context-Manipulation 247 controllerübergreifende 72 dynamische 246 Grund 248 Kardinalität 254 Kontra 245 Layoutmanipulation 247 Lead-Selection 254 Selection 254 Singleton 254 View 266 Warnung 265 Zuordnung 247 Prüftabelle Texttabelle 347

Q Quelltextgerüst 353

R RadioButton 337 Registerkarte 168 implementiertes Interface 307 Rekursion 174 Remote Function Call 씮 RFC Rendering 178 Reuse-Komponententyp 130 RFC AIO_FOR_HELP_LINKS 377 Verbindung 130, 377 Root-Element Austausch 45, 409 ROOTUIELEMENTCONTAINER 44, 45, 141 Roundtrip 씮 Performance RowData 146 RowHeadData 146 RTTC 136 RTTI 103, 135 Beschreibungsobjekt 259 CL_ABAP_CLASSDESCR 133 CL_ABAP_STRUCTDESCR 260 CL_ABAP_TYPEDESCR 135 Vererbungshierarchie 135 Verwendung 136 RTTS 136

1315.book Seite 475 Dienstag, 31. März 2009 11:16 11

Index

Run Time Type Creation 씮 RTTC Run Time Type Identification 씮 RTTI Run Time Type Services 씮 RTTS

S SAP GUI 26 SAP Knowledge Warehouse Bereich 377 Kontext 377 Mappe 377 Struktur 377 Suchkontext 377 technischer Name 378 Thema 378 SAP List Viewer 28, 307 anwendungsspezifische Funktion 312 Aussehen 308 Configuration Model 311, 312, 313 CONTROL_VIEW 310 DATA 310 data_check( ) 317 DDIC-Bindung 319 dynamisches Mapping 310 Ereignis 315 Feldeinstellung 312 Funktion 322 get_model( ) 316 get_model_extended( ) 316 Implementierung 308 Integration 309 Leistungsumfang 308 ON_DATA_CHECK 317 ON_FUNCTION 322, 323 R_PARAM 315 SERVICE 310 set_data( ) 311, 315 Spalte ausblenden 319 Spalte erzeugen 321 Spalte konfigurieren 318 Spalte löschen 318 Spalteneinstellung 312 Spaltentitel 319 Standardfunktion 312 Tabelleneinstellung 312 TABLE 309, 310 Toolbar 322 Zelleneditor 321 SAPscript 374

Schalter 339 Schlüsselwert 334 Screen Painter 26 SELECT-OPTIONS 363 Bedingung 366 Einzeleingabe 364 Ereignis 366 Interface-Controller 367 Intervalleingabe 364 Kriterium 364 Mehrfachselektion 366 Ranges-Tabelle 366 Standardfunktion 366 Selektionsbild 157 Standard 364 Service-Aufruf 103 Service-Aufruf-Wizard 129, 361 Schritt 129 Start 129 Zeitersparnis 131 Shortcut 씮 Hotkey Singleton 씮 Performance Soforthilfe 씮 Kontextmenü Spalte 187 orientierte 140 Speichern-Dialog 208 Speicherverbrauch 403 Standardanwendung 383 Standard-Component 285 Object Value Selector 286 POWER-List 286 SAP List Viewer 286 SELECT-OPTIONS 286 Standardmeldung 239 Standard-Message-Area 222 Anzeige 222 Standardwert 씮 Kontextmenü Standard-Zelleneditor 200 Subklasse 268 SubScreen 142 Suchhilfe 329, 345 Anbindung 346, 350 Datenelement 348 Datenelementebene 348 direkte 350 Exportparameter 345 Feldebene 348 Importparameter 345 Kontext 348

475

1315.book Seite 476 Dienstag, 31. März 2009 11:16 11

Index

Suchhilfe (Forts.) Prüftabelle 347 Selektionsmethode 345 Treffermenge 345 Superklasse 268 Supply-Funktion 67, 290, 298, 302, 304 Switch Framework 450

T T100 228 Tab Page 168 Tabelle 170 dynamische 189 hierarchische 187 manuelle 189 Template 189 Tabelleninhalt Sortierung 196 Tabellenspalte Einfügen 196 Verschiebung 201 Tabellenüberschrift 190 Taste Aktivierung 107 F4 345 Shift+Klick 342 Strg+Klick 342 Tabellennavigation 194 Tabellenzeile 189, 194 Text Ermittlung 161 Kennung 217 Literal 220 Pool 216 Tabelle 347 übersetzungsrelevanter 211 Textelement Anlage 217 Textsymbol 211, 216 Konstante 217 Toolbar 168, 187 Einfügen 169 Trace-Tool 씮 Performance Transaktion ICON 163 IF_POWL_EASY_FEEDER 328 POWL_CAT 328 POWL_EASY 328

476

Transaktion (Forts.) POWL_QUERY 328 POWL_QUERYR 328 POWL_TYPE 328 POWL_TYPER 328 S_MEMORY_INSPECTOR 404 SE11 105, 106, 332 SE24 106, 114, 228, 268 SE30 404 SE63 212 SE91 221 SICF 406 SOTR_EDIT 215 WD_TRACE_TOOL 414 Typ skalarer 159 Typgruppe 257

U Überschrift 187 Uhrzeithilfe 349 UI-Element 40, 140 Anlage 41 Button 57 Dokumentation 157 DropDown 331 DropDownByIndex 96, 291 Eigenschaft 45 Group 40, 45 Label 90 MultiPane 409, 443 PageHeader 289, 301 PageHeaderArea 302 RowRepeater 409, 443 Sichtbarkeit 100 TabStrip 289 TextView 44, 46 TransparentContainer 40 ViewContainer 40, 56, 309 zusammengesetztes 188 UI-Kategorie 155 action 155, 163 complex 155, 190 Favorites 155 graphic 155 integration 156 layout 155 selection 155

1315.book Seite 477 Dienstag, 31. März 2009 11:16 11

Index

UI-Kategorie (Forts.) text 155 URL-Parameter 398 sap-config-mode 399 sap-wd-configId 399 sap-wd-ssrconsole 399

V Vererbungshierarchie 268 View 38, 40 Anlage 42 API 435 Editor 43 Einbettung 292 Empty 61, 417 Erweiterung 452, 456 Hierarchie 49 Lebensdauer 44, 415 View Designer 43 View-Controller 씮 Controller View-Element 140 ABAP-Klassenrepräsentation 267 Button 163 Caption 169 CheckBox 339 CheckBoxGroup 339 DropDownByIndex 331 DropDownByKey 332 Eigenschaft 271 Einfügen 156, 266 Einfügeposition 267 Explanation 373 FileDownload 204 FileUpload 204, 210 Group 336 Image 198 InputField 159 InvisibleElement 152 ItemListBox 341 Karteikarte 168 Konstante 257 Label 143, 160 Laufzeitobjekt 271 Menu 444 MenuActionItem 444 MenuCheckBox 444 MenuRadioButton 445 MenuSeparator 445

View-Element (Forts.) MessageArea 223 RadioButton 336 RadioButtonGroupByIndex 337 RadioButtonGroupByKey 337, 338 ScrollContainer 150 Tab 268 Table 187 TableColumn 196 TabStrip 168, 268 TextView 157 Toolbar 169 Tree 173 TreeItemType 175, 177 TreeNodeType 175 TriStateCheckBox 342 Typ 266 Verschiebung 156, 162 View-Interface IF_WD_VIEW_ELEMENT 268, 270 View-Klasse CL_WD_CAPTION 276 CL_WD_LAYOUT_DATA 268 CL_WD_MATRIX_DATA 268 CL_WD_MATRIX_HEAD_DATA 268, 273 CL_WD_TAB 268, 275 CL_WD_TABSTRIP 257, 268, 273 CL_WD_TRANSPARENT_CONTAINER 277 CL_WD_UIELEMENT 268, 370 CL_WD_UIELEMENT_CONTAINER 270 CL_WD_VIEW_ELEMENT 268 CL_WDR_VIEW_ELEMENT 268 Vorschlagswert 111 Vorwärtsnavigation 215

W Warnung ACC 167 WD_GLOBAL_SETTING 404, 405 wdevent 179, 280 context_element 179 id 179 name 281 Name/Wert-Paare 281 parameters 179 path 179

477

1315.book Seite 478 Dienstag, 31. März 2009 11:16 11

Index

Web Dynpro 31 Anwendung 35, 47 Autorenumgebung 374 Component 34, 37, 38 Debugger 118 Entwicklungsumgebung 36 Explorer 36, 38 Java 31 Kapselung 32 Komponentenmodell 32 Metadatenmodell 31 Namenskonvention 31 Programmiermodell 33, 36 Text-Browser 374 Vorteil 31 Werkzeugkasten 104 Web-Dynpro-Anpassung Customizing 383 explizite 384 implizite 384 Konfiguration 383 Konfigurationsdatenset 383 Personalisierung 384 Web-Dynpro-Anwendung CONFIGURE_APPLICATION 389 CONFIGURE_COMPONENT 386 Eigenschaft 222 WDR_TEST_UI_ELEMENTS 156 Web-Dynpro-Code-Wizard 115 Auslesen 120 Component-Instanzierung 296 Context-Element 92 Meldung 229 Methodenaufruf 74, 117 Navigationsübergang 170 Start 74 Tabellenoperation 123 Table 199 Template Table 189 Template-Galerie 199 Textsymbol 219 Web-Dynpro-Component Kopie 249 WDR_OVS 350 WDR_SELECT_OPTIONS 365 Web-Dynpro-Component-Interface IWD_VALUE_HELP 363 Web-Dynpro-Debugger 씮 Debugger

478

Web-Dynpro-Entwicklung Vorgehen 246 Werkzeugleiste 168 Wertehilfe 344 DATS 349 Datumsauswahl 344 Domäne 348 Domänenfestwert 344 Festwert 348 frei programmierte 363 keine 350 Prüftabelle 344 Schlüsselfeld 347 Suchalgorithmus 346 TIMS 349 Wertehilfe-Modus 257 automatischer 346 deaktivierter 346 Dictionary-Suchhilfe 350 OVS 352 when visible 씮 View-Lebensdauer Wiederholungsknoten 181 Wiederverwendung 166 ABAP Dictionary 344 von Components 씮 Multi-ComponentArchitektur Window 39, 49 Editor 52 Eigenschaft 53 Interface 53 Struktur 52 View 60, 61 Window-API 224 Window-Controller 씮 Controller Window-Manager 씮 Popup-Fenster wrapping 144 WYSIWYG 43

Z Zeile 187 orientierte 140 Selektion 189 Umbruch 207 Vorsprung 207 Zelleneditor 188, 197 Einfügen 198 Zugangstaste 씮 Kontextmenü Zweidimensionalität 187