Show TOC Anfang des Inhaltsbereichs

Syntaxdokumentation Statische Methoden aufrufen  Dokument im Navigationsbaum lokalisieren

In einem ST-Programm kann wie folgt eine statische Methode einer globalen Klasse von ABAP Objects aufgerufen werden:

 

<tt:call-method class="class" [s-|d-]name="meth">
  [<tt:with-parameter [s-|d-]name
="para1" [ref="node1"|val="val1"|var="var1"] />
   <tt:with-parameter [s-|d-]name
="para2" [ref="node2"|val="val2"|var="var2"] />
   ...]
</tt:call-method>

 

Mit class kann eine in der Klassenbibliothek vorhandene Klasse und mit meth eine öffentlich sichtbare Methode dieser Klasse angegeben werden. Dabei wird nicht nach der Groß-/Kleinschreibung unterschieden. Während die Methode bei der Angabe von name bei Serialisierung und Deserialisierung aufgerufen wird, wird sie bei der Angabe von s-name wird nur bei der Serialisierung und bei der Angabe von d-name nur bei der Deserialisierung aufgerufen.

Die Schnittstellenparameter para1, para2, … der aufgerufenen Methode können bzw. müssen mit dem ST-Befehl tt:with-parameter mit Aktualparametern verknüpft werden. Das Attribut name gibt den Namen eines Formalparameters an. Bei der Angabe von s-name wird ihm nur bei der Serialisierung und bei der Angabe von d-name nur bei der Deserialisierung ein Aktualparameter angebunden, was es unter Umständen erlaubt eine einzige Methode für beide Richtungen zu verwenden. Als Aktualparameter können mit ref Datenwurzeln, mit var Variablen bzw.  Parameter und mit val Werte angegeben werden. Je nach Art des Formalparameters werden die Werte der angegebenen Aktualparameter beim Aufruf übergeben bzw. bei Beendigung der aufgerufenen Methode übernommen.

Bei der Anbindung von Aktualparametern  ist zu beachten, dass bei der Serialisierung nur lesend auf Datenwurzeln zugegriffen werden kann, weshalb sie dann nur an Eingabeparameter der Methode übergeben werden können. Umgekehrt kann bei der Deserialisierung nur schreibend auf Datenwurzeln zugegriffen werden, weshalb sie dann nur von Ausgabeparametern oder Rückgabewerten übernommen werden können.

Der Typ eines Aktualparameters muss zur Typisierung des Schnittstellenparameters passen. Der Typ einer Datenwurzel, die selbst in der Anweisung tt:root typisiert worden sein kann, wird durch den Typ des angebundenen ABAP-Datenobjekts bestimmt. Parameter oder Variablen haben keinen statischen Typ, außer sie werden mit dem Zusatz ref-type der Anweisungen tt:parameter bzw. tt:variable als Referenzvariable definiert. Solcherart definierte Datenreferenzvariablen können an ebensolche Schnittstellenparameter angebunden werden.

Bei dem Aufruf einer Methode wird die Kontrolle vom ST-Prozessor an den ABAP-Prozessor der ABAP-Laufzeitumgebung übergeben. In der Methode gibt es keine Einschränkungen bezüglich der dort ausführbaren Anweisungen. Bei ordnungsgemäßer Beendigung der Methode über ENDMETHOD oder RETURN wird die Kontrolle wieder an den ST-Prozessor übergeben und das ST-Programm hinter tt:call-method fortgesetzt. Ansonsten kehrt die Kontrolle nicht in das ST-Programm zurück:

      Wenn die Methode über eine Anweisung wie LEAVE PROGRAM, SUBMIT ohne den Zusatz AND RETURN oder LEAVE TO TRANSACTION verlassen wird, verhält sich der weitere Programmablauf genau wie wenn die Methode aus einem ABAP-Programm aufgerufen worden wäre, d.h. der aktuelle interne Modus wird mitsamt dem ST-Programm abgebaut.

      Wenn die Methode so über eine klassenbasierte Ausnahme abgebrochen wird, dass die Ausnahme aus der Methode propagiert wird, wird die Anweisung CALL TRANSFORMATION mit der behandelbaren Ausnahme CX_ST_CALL_METHOD_ERROR abgebrochen. Das Attribut EXCEPTION_NAME des Ausnahmeobjekts enthält dann den Namen der ursprünglichen Ausnahme.

      Nicht-klassenbasierte Ausnahmen können nicht behandelt werden. Wenn die Methode über eine nicht-klassenbasierte Ausnahme abgebrochen wird, kommt es immer zu einem Laufzeitfehler.

Wenn in der aufgerufenen Methode ABAP-Datenobjekte geändert werden, die an Datenwurzeln des aufrufenden ST-Programms angebunden sind, werden diese Änderungen im ST-Programm sofort wirksam. Dabei gilt folgende Einschränkung: Wenn innerhalb einer tt:loop-Schleife eine Methode aufgerufen wird, sind bei der Serialisierung innerhalb der Methode (auch innerhalb weiterer geschachtelter tt:loop-Schleifen) nur lesende und bei der Deserialisierung keinerlei Zugriffe auf die aktuelle interne Tabelle oder deren Komponenten erlaubt. Andernfalls kommt es zu einem Laufzeitfehler.

Hinweis

Wenn an die Schnittstellenparameter von aufgerufenen Methoden Variablen oder Parameter angebunden werden, ist zu beachten, dass diese nur dann serialisierbar oder deserialisierbar sind, wenn sie elementare Werte enthalten.

 

Beispiel

Die folgende Transformation ist als DEMO_ST_WITH_METHOD_CALL auf dem AS ABAP vorhanden. Sie ruft während der Serialisierung in einer tt:loop-Schleife über die Datenwurzel SCARR_TAB die statische Methode GET_FLIGHTS der globalen Klasse CL_DEMO_CALL_FROM_ST auf.  Dabei wird die Komponente carrid der internen Tabelle SCARR_TAB an den Eingabeparameter der Methode übergeben.

 

<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">
  <tt:root name="SCARR_TAB"/>
  <tt:root name="SPFLI_TAB"/>
  <tt:template>
    <Flights>
      <tt:loop ref=".SCARR_TAB">
        <Flights>
          <tt:attribute name="Carrier" value-ref="CARRNAME"/>
          <tt:call-method class="CL_DEMO_CALL_FROM_ST" s-name="GET_FLIGHTS">
            <tt:with-parameter name="CARRID" ref="carrid"/>
          </tt:call-method>
          <tt:loop ref=".SPFLI_TAB">
            <Connection>
              <tt:attribute name="ID" value-ref="CONNID"/>
              <From>
                <tt:value ref="CITYFROM"/>
              </From>
              <To>
                <tt:value ref="CITYTO"/>
              </To>
            </Connection>
          </tt:loop>
        </Flights>
      </tt:loop>
    </Flights>
  </tt:template>
</tt:transform>

 

Die Simple Transformation kann in einer anderen Methode MAIN der gleichen Klasse DEMO_ST_WITH_METHOD_CALL wie folgt aufgerufen werden:

 

METHOD main.
  DATA:  scarr_tab  TYPE SORTED TABLE OF scarr
                    WITH UNIQUE KEY carrid,
         xml_string TYPE string,
         exc        TYPE REF TO cx_st_call_method_error.

  SELECT *
         FROM scarr
         INTO TABLE scarr_tab.

  IF sy-subrc <> 0.
    RETURN.
  ENDIF.

  TRY.
      CALL TRANSFORMATION demo_st_with_method_call
        SOURCE scarr_tab = scarr_tab
               spfli_tab = spfli_tab
        RESULT XML xml_string.
    CATCH cx_st_call_method_error INTO exc.
      MESSAGE exc TYPE 'I' DISPLAY LIKE 'E'.
      RETURN.
  ENDTRY.

  cl_abap_browser=>show_xml( EXPORTING xml_string = xml_string
                                       modal      = 'X' ).

ENDMETHOD.

 

Die internen Tabellen scarr_tab und spfli_tab sind beides statische Attribute der Klasse.  Während scarr_tab gefüllt an die gleichnamige Datenwurzel der Transformation übergeben wird, wird spfli_tab leer übergeben und in der aus der Simple Transformation aufgerufenen Methode GET_SPFLI gemäß dem übergebenen Parameter carrid bei jedem Schleifendurchlauf anders gefüllt.

Die Methode MAIN ist mit dem ausgelieferten Transaktionscode DEMO_ST_METHOD_CALL (OO-Transaktion) verknüpft und ergibt bei ihrem Aufruf folgendes Ergebnis:

 

<FlightList>

  <Flights Carrier="American Airlines">

    <Connection ID="0017">

      <From>NEW YORK</From>

      <To>SAN FRANCISCO</To>

    </Connection>

    <Connection ID="0064">

      <From>SAN FRANCISCO</From>

      <To>NEW YORK</To>

    </Connection>

    <Connection ID="0555">

      <From>ROME</From>

      <To>FRANKFURT</To>

    </Connection>

    ...

  </Flights>

  <Flights Carrier="Air Berlin">

    ...

  </Flights>

</FlightList>

 

Durch die Anbindung des Attributs spfli_tab an die Simple Transformation und den Schreibzugriff auf dieses Attribut in der aufgerufenen Methode umgeht obiges Programm also die Einschränkung, dass während der Serialisierung innerhalb des ST-Programms selbst nicht schreibend auf einen Datenknoten zugegriffen werden kann.

 

Ende des Inhaltsbereichs