Mit der Anweisung sap:call-external haben Sie die Möglichkeit ABAP-Aufrufe mit einer beliebigen Anzahl von Rückgabewerten aus einem XSLT-Programm durchzuführen.
Die Aufrufe können sowohl auf der Ebene der Instanzen von ABAP-Klassen oder auch der Klassen selbst erfolgen. In ersten Fall werden daher Instanzmethoden, im zweiten dagegen Klassenmethoden verwendet.
Beim Aufruf von Interface-Methoden müssen diese grundsätzlich über den Namen des Interfaces gefolgt vom Interface-Komponentenselektor (intf~) gekennzeichnet werden.
Aufrufe von Instanzmethoden erfolgen gemäß der Syntax:
<sap:call-external name="prefix:localname" method="instanceMethod"> <sap:callvalue param="inParam1" select="expression"/> <sap:callvalue param="inParam2" select="expression"/> ... <sap:callvariable param="exParam1" name="varName1" type="xslType"/> <sap:callvariable param="exParam2" name="varName2" type="xslType"/> ... </sap:call-external> |
Die Anweisung sap:call-external kann an jeder Position im XSL-Quelltext stehen, an der sonst auch xsl:call-template erlaubt ist.
Der Aufruf einer Instanzmethode erfordert die Angabe eines Objektnamens, der ein ABAP-Objekt identifiziert und den Namen der aufzurufenden Methode.
Die beiden Sub-Anweisungen sap:callvalue und sap:callvariable werden für
die Übergabe von Parameterwerten benötigt.
Mit sap:callvalue
werden Parameterwerte an die gerufene Methode als Import-Parameter
übergeben. Das Attribut param gibt je einen
Parameternamen aus der Methodendefinition in ABAP an; die Wertezuweisung
erfolgt mit dem Attribut select. Dabei können die
XSLT-Typen string,
number, boolean und node-set an die ABAP-Parameter
übergeben werden.
Beispiel:
Die Konvertierung, etwa der Typen number und node-set in die entsprechenden ABAP-Werte erfolgt nach dem folgenden Schema:
· ein Wert des Typs number kann in ABAP sowohl in Integer- als auch in einen Float-Typ umgewandelt werden.
· ein Node-Set wird stets in eine iXML-Node-Collection konvertiert. Beachten Sie, daß keine implizite Konvertierung von Node-Sets in Strings erfolgen kann. Um beispielsweise den Wert eines Attributs "attr" an einen String-Parameter in ABAP zu übergeben, muss der XPath-Ausdruck string(@attr) verwendet werden.
Die aus dem Methodenaufruf zurückgelieferten Werte werden mit der Sub-Anweisung sap:callvariable an XSLT-Variablen gebunden. Das Attribut param gibt hier den ABAP-Parameternamen aus der Methodendefinition an. Das Attribut name bezeichnet dagegen die zugehörige XSLT-Variable. Zusätzlich kann das Attribut type verwendet werden, um die resultierenden Werte einem bestimmten XSLT-Typ zuzuordnen. Anderenfalls kommt die Standardkonvertierung zu Einsatz.
Beispiel:
Daten vom Typ C(1) werden per Default in einen XSLT-String konvertiert. Ist dagegen boolean im Attribut type explizit angegeben, so wird entsprechend in XSLT-Boolean umgesetzt.
Generell können auch ABAP-Objekte als Parameter angegeben werden.
Beachten Sie, daß ABAP-Parameter von Typ "changing" sowohl mit sap:callvalue als auch mit sap:callvariable übergeben werden können.
Beim Aufruf der Klassenmethoden ist das Attribut name durch class ersetzt. Als Wert von
class ist
demzufolge der Name der ABAP-Klasse und für method der Name der gewünschte
Klassenmethode anzugeben.
Die Syntax lautet dann also:
<sap:call-external class="className" method="clasMethod"> ... </sap:call-external> |
Das nachfolgende Beispiel demonstriert einen Zugriff auf die Datenbank des SAP-Systems, mit dem zusätzliche Daten zu einer ausgewählten Flugverbindung ausgegeben werden. Der Aufruf erfolgt mittels der Klassenmethode GET_DETAIL für die Klasse CL_FLIGHT_INFO.
Die erhaltene Information wird mit Hilfe von sap:callvariable an die entsprechenden XSLT-Variablen (duration, distance, unit, ...) gebunden.
<sap:call-external class="CL_FLIGHT_INFO" method="GET_DETAIL"> <sap:callvalue param="AIRLID" select="string($carr/@code)"/> <sap:callvalue param="CONNID" select="string(@code)"/> <sap:callvalue param="FLDATE" select="string(departure/date)"/> <sap:callvariable param="FLIME" name="duration"/> <sap:callvariable param="DIST" name="distance" type="number"/> <sap:callvariable param="UNIT" name="unit"/> <sap:callvariable param="PLTYPE" name="planetype"/> <sap:callvariable param="SEATSM" name="seatsmax"/> </sap:call-external>
|