Show TOC

Dynamische Erzeugung von Component-VerwendungenLocate this document in the navigation structure

Mehrfachverwendung einer Component

Im Abschnitt Component-Verwendung ohne Controller-Zugriff wurde beschrieben, dass es je nach Anwendungsfall sinnvoll sein kann, eine bestimmte Interface-View einer Component innerhalb einer verwendenden Component mehrmals anzuzeigen. Wenn die Anzahl der Einbettungen konstant und zur Designzeit bereits bekannt ist, kann die Struktur des einbettenden Windows statisch aufgebaut werden. Wenn jedoch der Anwendungsentwickler der verwendenen Component zur Designzeit noch nicht weiß, wie viele Verwendungen zur Laufzeit benötigt werden, kann er die die Erzeugung der Component-Verwendungen dynamisch programmieren. Das folgende Code-Fragment zeigt einen Ausschnitt, der zum Beispiel in einer Methode des Component-Controllers der verwendenden Component implementiert sein könnte:

method MY_CONTROLLER_METHOD .
data: L_COMPONENT_USAGE  type ref to IF_WD_COMPONENT_USAGE,
L_MY_INITIAL_USAGE        type ref to IF_WD_COMPONENT_USAGE.
L_MY_INITIAL_USAGE = WD_THIS->WD_CPUSE_MY_INITAL_USAGE( ).
L_COMPONENT_USAGE = L_MY_INITIAL_USAGE->CREATE_COMP_USAGE_OF_SAME_TYPE( <NAME_OF_THE_SECOND_USAGE> ).
endmethod.

Es muss also zunächst eine erste Verwendung statisch angelegt werden, bevor zur Laufzeit daraus weitere Verwendungen der selben Component (....USAGE_OF_SAME_TYPE) dynamisch erzeugt werden können. Das oben stehende Beispiel zeigt die Erzeugung einer zweiten Component-Verwendung. Wenn die Anzahl der später benötigten Verwendungen zur Design-Zeit jedoch noch nicht bekannt ist, muss dieser Schritt in einer geeigneten Schleife programmiert werden.

Die erzeugten Component-Verwendungen können in einer internen Tabelle, ein Attribut des Controllers, verwaltet werden. Dieses Attribut muss für diesen Zweck explizit angelegt werden. Die Web-Dynpro-Laufzeit bietet Ihnen hierfür den Typ WDAPI_COMPONENT_USAGE an, den Sie jedoch nicht verwenden müssen, Sie können durchaus auch einen eigenen Datentyp anlegen.

Verwendung unterschiedlicher Components

In vielen Anwendungsfällen ist es nötig, die Verwendung unterschiedlicher Components dynamisch anzulegen. Beispielsweise könnte in einer internationalen Anwendung die Verwendung einer jeweiligen landesspezifischen Component erst nach Eingabe der entsprechenden Länderkennung erzeugt werden. In diesem Fall ist die zu verwendende Component zu Laufzeit nicht bekannt. In einem solchen Fall wird an Stelle einer Verwendung einer anderen Component die Verwendung eines separaten Component-Interfaces deklariert (sieheArbeiten mit Web-Dynpro-Component-Interfaces) . Die Programmierung erfolgt ganz analog zu dem oben genannten Beispiel. Alle Components, die in die verwendende Component eingebettet werden sollen, müssen zur Design-Zeit das entsprechende Component-Interface implementieren. Zur Laufzeit können dann zunächst beliebig viele Verwendungen des Interfaces erzeugt werden. Die Zuordnung, welche konkrete Implementierung hinter jeder einzelnen Verwendung steht, findet jedoch erst zum Zeitpunkt der Instanziierung der jeweiligen Component statt (siehe Component-Verwendung ohne Controller-Zugriff). Der Name der zu instanziierenden Component wird in diesem Fall als Variable programmiert und erst zur Laufzeit übergeben.

Wenn Sie eine Interface-View einer auf diese Weise dynamisch eingebundenen Component in ein Window einbetten wollen, müssen Sie diese Einbettung ebenfalls dynamisch programmieren. SieheDynamische Einbettung einer Interface-View.

Component-Verwendungsgruppen

Anstelle dynamisch erzeugte Component-Verwendungen in einer internen Tabelle am Component-Controller zu verwalten, können Sie eine so genannte Component-Verwendungsgruppe dafür nutzen. Das Konzept der Component-Verwendungsgruppen integriert die Verwaltung der dynamisch erzeugten Verwendungen in die Web-Dynpro-Laufzeit.

Eine Component-Verwendungsgruppe wird immer in der verwendenden Component angelegt, sinnvollerweise am Component-Controller. Im folgenden Code-Fragment ist die dynamische Erzeugung einer Component-Verwendungsgruppe dargestellt:

method MY_CONTROLLER_METHOD .
data: 
L_CMP_API type ref to IF_WD_COMPONENT,
L_CMP_USAGE_GROUP         type ref to IF_WD_COMPONENT_USAGE_GROUP.
L_CMP_API = WD_THIS->WD_GET_API( ).
if L_CMP_API->HAS_CMP_USAGE_GROUP( 'TESTGROUP' ) is initial.
WD_THIS->CMP_USAGE_GROUP = L_CMP_API->CREATE_CMP_USAGE_GROUP(
NAME            = 'TESTGROUP'
USED_COMPONENT  = '<name used component>').
endif.

In diese dynamisch erzeugte Verwendungsgruppe können nun Component-Verwendungen hinzugefügt werden:

WD_THIS->CMP_USAGE_GROUP->ADD_COMPONENT_USAGE(
NAME                  = 'USAGE1'
EMBEDDING_POSITION    = '<name view>/<name container>'
USED_COMPONENT        = '<name used component>'   ).
WD_THIS->CMP_USAGE_GROUP->ADD_COMPONENT_USAGE(
NAME                  = 'USAGE2'
EMBEDDING_POSITION    = '<Name View>/<Name Container>'
USED_COMPONENT        = '<Name used component>'   ).

Für die Werte des Parameters EMBEDDING_POSITION gilt folgende Konvention: Wenn in dem ausgewählten Container wiederum eine View enthalten ist, wird die weitere Spezifizierung mit einem Punkt von der Angabe der äußeren View oder des äußeren Containers getrennt:

EMBEDDING_POSITION  = '<Name View>/<Name Container>.<Name Sub-view>/<Name Container2>*'

Diese Schachtelung kann mehrfach wiederholt werden.