Erste Schritte
Grundlegende Methoden und Konzepte anwenden
Mit lokalen Klassen arbeiten
Daten aus der Datenbank lesen
Mit strukturierten Datenobjekten arbeiten
Mit komplexen internen Tabellen arbeiten
Datenbankänderungen mit Business Objects implementieren
Das ABAP-RESTful-Anwendungsprogrammiermodell beschreiben

Methoden definieren und aufrufen

Objective

After completing this lesson, you will be able to methoden definieren und aufrufen.

Methodendefinition

Im Definitionsteil einer Klasse definieren Sie mit METHODS eine Instanzmethode und mit CLASS-METHODS eine statische Methode. Auf den Namen der Methode folgt ihre Signatur, d.h. die Menge von Werten, die mit dem Aufrufer der Methode ausgetauscht werden, sowie die Ausnahmen, die für die Methode auftreten können.

Die Signatur einer Methode besteht aus Parametern und Ausnahmen. Jeder Parameter hat einen Namen und einen Typ.

ABAP kennt folgende Arten von Parametern:

Importing-Parameter

Importing-Parameter sind Werte, die die Methode vom Aufrufer erhält. Eine Methode kann eine beliebige Anzahl von Importing-Parametern haben.

Standardmäßig sind Importing-Parameter obligatorisch. Es gibt aber zwei Möglichkeiten, sie als optional zu definieren:

  • Mit dem Zusatz OPTIONAL. Der Parameter ist optional und sein Standardwert ist der entsprechende Initialwert für den Typen des Parameters.
  • Mit dem Zusatz DEFAULT <val>. Der Parameter ist optional, und Sie geben seinen Defaultwert über <val> an.

Innerhalb einer Methode dürfen Sie Importing-Parameter nicht ändern. Wenn Sie dies versuchen, verursachen Sie einen Syntaxfehler.

Exporting-Parameter

Exporting-Parameter sind Ergebnisse, die von der Methode zurückgegeben werden. Eine Methode kann eine beliebige Anzahl von Exporting-Parametern haben. Alle Exporting-Parameter sind optional – ein aufrufendes Programm verwendet nur die Werte, die es wirklich benötigt.

Changing-Parameter

Changing-Parameter sind Werte, die die Methode vom Aufrufer erhält. Im Gegensatz zu Importing-Parametern kann die Methode die Werte dieser Parameter ändern. Sie werden dann mit demselben Namen an den Aufrufer zurückgegeben. Eine Methode kann eine beliebige Anzahl von Changing-Parametern haben. Changing-Parameter sind standardmäßig obligatorisch. Sie können sie auf dieselbe Weise wie Importing-Parameter als optional definieren.

Returning-Parameter

Ein Returning-Parameter ist ein Methodenergebnis, das direkt in einem Ausdruck verwendet werden kann. Eine Methode kann nur einen Returning-Parameter haben. Returning-Parameter müssen eine spezielle Form der Parameterübergabe verwenden, die als Wertübergabe bezeichnet wird. Diese Form der Parameterübergabe wird durch das Umschließen des Parameternamens mit Klammern (keine Leerzeichen!) definiert. Außerdem wird das Schlüsselwort VALUE vorangestellt.

Mit dem Schlüsselwort RAISING werden die Ausnahmen aufgelistet, die die Methode auslösen kann, um auf eine Fehlersituation hinzuweisen. Das aufrufende Programm kann dann auf den Fehler reagieren.

Fügen Sie als Beispiel unserer Klasse „lcl_connection" zwei Methoden hinzu.

Eine set_attributes( ) Methode zum Festlegen der Werte für die Attribute carrier_id und connection_id und eine get_attributes( ) Methode, um die Werte dieser Attribute zurückzugeben. Wenn set_attributes( ) zwei Importparameter benötigt, einen für jedes Attribut, benötigt die get_attributes( ) Methode zwei Exportparameter.

Für jede Methode, die Sie definieren, müssen Sie auch eine Implementierung im Implementierungsteil der Klasse anlegen. Bis Sie diesen Vorgang durchgeführt haben, werden Syntaxfehler in Ihrer Klasse angezeigt. Die Syntaxprüfung meldet, dass die Implementierung der Methode fehlt.

Hinweis

ADT bietet eine Schnellkorrektur zum Hinzufügen der fehlenden Implementierung. Um diese Schnellkorrektur zu verwenden, gehen Sie wie folgt vor:
  1. Positionieren Sie den Cursor in einer METHODS-Anweisung mit einem Fehler, und drücken Sie Strg + 1.
  2. Wählen Sie aus der Liste der möglichen Quickfixes die Option Implementierung für … hinzufügen, und drücken Sie die Eingabetaste. Wenn die Implementierung für mehrere Methoden fehlt, lautet der Quickfix-Titel Nicht implementierte Methoden hinzufügen.

Definieren von Methoden

Methodenimplementierung

Sie müssen jede definierte Methode implementieren. Dies geschieht im Implementierungsteil der Klasse, indem Sie das Anweisungspaar METHOD <method_name> und ENDMETHOD hinzufügen.

Die Methodenimplementierung enthält ABAP-Anweisungen, die auf die Parameter der Methode (es ist nicht zulässig, Importing-Parameter zu ändern) und alle Typen, Attribute sowie Konstanten zugreifen, die Sie unabhängig von ihrer Sichtbarkeit in der Klasse deklariert haben. Instanzmethoden können sowohl auf Instanz- als auch auf statische Attribute zugreifen. Statische Methoden können nur auf statische Komponenten zugreifen.

Innerhalb des Implementierungsteils einer Klasse können Sie auf die Attribute dieser Klasse ohne Referenzvariable und '->' (oder bei statischen Attributen auf den Klassennamen und '=>') zugreifen.

Nur bei der Implementierung von Instanzmethoden bietet ABAP die eingebaute Variable ME. ME ist eine Referenzvariable, die mit der aktuellen Klasse typisiert und zur Laufzeit mit der Adresse der aktuellen Instanz gefüllt wird. Die Verwendung von ME ist optional und sollte vermieden werden, es sei denn, der Name eines Attributs kollidiert mit dem Namen eines anderen Datenobjekts, z.B. mit einem Parameternamen.

Im Beispiel haben die Importing-Parameter der Methode „set_attributes( )" den gleichen Namen wie die entsprechenden Attribute. In einer solchen Situation bezeichnet der Name allein den Parameter. Erst durch das Voranstellen von „me->" wird deutlich, dass auf ein Attribut der aktuellen Instanz zugegriffen werden soll.

Wenn bei der Ausführung einer Methode ein Fehler auftritt, kann die Methode mit der Anweisung RAISE EXCEPTION TYPE eine Ausnahme auslösen, gefolgt vom Namen der Ausnahme.

Notiz

Technisch gesehen sind Ausnahmenamen die Namen spezieller ABAP-Klassen, und die Anweisung RAISE EXCEPTION TYPE erzeugt eine Instanz der referenzierten Klasse. Die Instanz wird als Ausnahmeobjekt und die spezielle Art von ABAP-Klasse als Ausnahmeklasse bezeichnet.

Sobald eine Ausnahme ausgelöst wird, wird die Methodenausführung abgebrochen.

Die Kontrolle wird an das aufrufende Programm zurückgegeben, wenn alle Voraussetzungen erfüllt sind. Andernfalls bricht das gesamte Programm mit einem Laufzeitfehler ab.

Die Voraussetzungen zum Fortsetzen des Programms lauten wie folgt:

  • Die ausgelöste Ausnahme wird in der RAISING-Klausel der Methodensignatur deklariert.
  • Der Methodenaufruf ist von einer TRY … ENDTRY-Kontrollstruktur umgeben.
  • Die TRY … ENDTRY-Kontrollstruktur enthält einen CATCH-Block für die Ausnahme

Notiz

Für einige Ausnahmen zeigt der ABAP Editor eine Syntaxwarnung mit Quickfix an, wenn Sie eine Ausnahme auslösen, die noch nicht in der RAISING-Klausel der Methode deklariert ist.

Implementieren von Methoden

Methodenaufrufe

Der Aufruf einer Instanzmethode erfolgt über eine Referenzvariable und den Selektor für die Instanzkomponenten (->). Nach dem Komponentenselektor folgt der Name der aufzurufenden Methode. Für statische Methoden verwenden Sie den Klassennamen und den statischen Komponentenselektor (=>). In beiden Fällen erfolgt die Parameterübergabe in einem Klammerpaar. Die Klammern werden auf jeden Fall benötigt. Sie bleiben leer, wenn keine Parameter übergeben werden sollen.

Notiz

Zwischen dem Methodennamen und der öffnenden Klammer ist kein Leerzeichen erlaubt. Andererseits ist mindestens ein Leerzeichen nach der öffnenden Klammer und vor der schließenden Klammer erforderlich.

Importing-Parameter werden nach dem Schlüsselwort EXPORTING aufgeführt, da die Werte, die von der aufgerufenen Methode importiert werden, vom aufrufenden Programm exportiert werden. Die Parameternamen werden auf der linken Seite eines Gleichheitszeichens (=) aufgeführt, auf der rechten Seite wird ein Ausdruck aufgeführt. Dieser Ausdruck kann ein einfaches Literal, eine Konstante oder eine Variable sein, aber auch alle anderen Ausdrücke sind erlaubt, solange der Typ des Ausdrucks mit dem Typ des Parameters übereinstimmt.

Exporting-Parameter werden nach dem Schlüsselwort IMPORTING aufgeführt. Beachten Sie, dass für den Exporting-Parameter der Parametername ebenfalls auf der linken Seite des Gleichheitszeichens aufgeführt wird. Die Variable auf der rechten Seite muss denselben Typ wie der Parameter aufweisen.

Changing-Parameter werden nach dem Schlüsselwort CHANGING aufgeführt. Der Typ der Variablen auf der rechten Seite muss mit dem Typ des Parameters auf der linken Seite übereinstimmen.

Das Beispiel zeigt den Aufruf der Instanzmethoden set_attributes( ) und get_attributes( ). Die Parameternamen stehen immer auf der linken Seite des Gleichheitszeichens (=).

Hinweis

Sie können die Code Completion in ADT verwenden, um den Methodenaufruf einschließlich der Parameterübergabe zu generieren. Dazu gehen Sie wie folgt vor :

  1. Geben Sie die Referenzvariable (bzw. den Klassennamen) und den Komponentenselektor ein.
  2. Nachdem Sie den Komponentenselektor eingegeben haben, drücken Sie Strg + Leertaste, um eine Liste der Komponenten anzuzeigen, die Sie adressieren können.
  3. Wählen Sie eine Methode aus, und drücken Sie Umschalt + Enter, um den Namen der Methode und ihre vollständige Signatur in Ihren Code einzufügen. Optionale Parameter werden in Kommentarzeilen aufgeführt.

Beim Aufruf einer Methode wird immer das Schlüsselwort IMPORTING benötigt, um den Wert von Exporting-Parametern zu empfangen. Das Schlüsselwort EXPORTING wird jedoch optional, wenn Sie nur Importing-Parameter bereitstellen möchten.

Bei Methoden mit nur einem obligatorischen Importing-Parameter können Sie sogar die explizite Parameterzuordnung weglassen. Im Beispiel ist der Parameter „i_carrier_id" optional mit dem Standardwert 'LH'. Daher wird der Wert zwischen den Klammern dem verbleibenden obligatorischen Importing-Parameter „i_connection_id" zugeordnet.

Aufrufen von Methoden

Ausnahmebehandlung

In einem vorherigen Abschnitt dieses Kurses haben Sie gelernt, wie Sie Laufzeitfehler mit TRY … ENDTRY-Kontrollstrukturen behandeln.

Ausnahmen, die in der RAISING-Klausel einer Methodendefinition deklariert sind, werden genauso behandelt:

  • Platzieren Sie den Methodenaufruf im TRY -Block der TRY … ENDTRY -Kontrollstruktur.
  • Definieren Sie einen CATCH-Block mit dem Namen der Ausnahme, die Sie behandeln möchten.

Notiz

Wenn Quelltext vorhanden ist, den Sie überspringen möchten, wenn der Methodenaufruf fehlgeschlagen ist, können Sie diesen Quelltext nach dem Methodenaufruf im TRY-Block platzieren.

Try It Out: Methodenaufrufe und Ausnahmebehandlung

  1. Legen Sie wie in der ersten Übung dieser Schulung eine neue globale Klasse an, die das Interface IF_OO_ADT_CLASSRUN implementiert.
  2. Kopieren Sie das folgende Code-Snippet in den Implementierungsteil der Methode if_oo_adt_classrun~main( ):
    Code Snippet
    123456789101112131415161718192021222324252627282930
    CONSTANTS c_carrier_id TYPE /dmo/carrier_id VALUE 'LH'. CONSTANTS c_connection_id TYPE /dmo/connection_id VALUE '0400'. DATA connection TYPE REF TO lcl_connection. DATA connections TYPE TABLE OF REF TO lcl_connection. * Create Instance ********************************************************************** connection = NEW #( ). * Call Method and Handle Exception ********************************************************************** out->write( |i_carrier_id = '{ c_carrier_id }' | ). out->write( |i_connection_id = '{ c_connection_id }'| ). TRY. connection->set_attributes( EXPORTING i_carrier_id = c_carrier_id i_connection_id = c_connection_id ). APPEND connection TO connections. out->write( `Method call successful` ). CATCH cx_abap_invalid_value. out->write( `Method call failed` ). ENDTRY.
  3. Navigieren Sie zur Registerkarte ///Local Types, und fügen Sie dort das folgende Code-Snippet ein:
    Code Snippet
    12345678910111213141516171819202122232425262728293031323334
    CLASS lcl_connection DEFINITION. PUBLIC SECTION. * Attributes DATA carrier_id TYPE /dmo/carrier_id. DATA connection_id TYPE /dmo/connection_id. * Methods METHODS set_attributes IMPORTING i_carrier_id TYPE /dmo/carrier_id DEFAULT 'LH' i_Connection_id TYPE /dmo/connection_id RAISING cx_abap_invalid_value. ENDCLASS. CLASS lcl_connection IMPLEMENTATION. METHOD set_attributes. IF i_carrier_id IS INITIAL OR i_connection_id IS INITIAL. RAISE EXCEPTION TYPE cx_abap_invalid_value. ENDIF. carrier_id = i_carrier_id. connection_id = i_connection_id. ENDMETHOD. ENDCLASS.
  4. Drücken Sie STRG + F3, um die Klasse zu aktivieren, und F9, um sie als Konsolen-App auszuführen.
  5. Analysieren Sie die Konsolenausgabe. Debuggen Sie das Programm, und probieren Sie mit dem Quelltext Verschiedenes aus, um sich mit den Konzepten vertraut zu machen. Ändern Sie insbesondere die Werte der beiden Konstanten, um das Auslösen der Ausnahme zu debuggen.

Funktionale Methoden

Methoden, die einen Returning-Parameter aufweisen, werden als funktionale Methoden bezeichnet. Es ist nicht möglich, mehr als einen Returning-Parameter für dieselbe Methode zu definieren. Sie müssen den Returning-Parameter in der Form VALUE(<Parametername>) definieren. Neben dem Returning-Parameter kann eine funktionale Methode eine beliebige Kombination anderer Parameter aufweisen. Am häufigsten werden jedoch nur Importing-Parameter hinzugefügt. Der Grund dafür ist, dass Sie mit zusätzlichen Exporting- oder Changing-Parametern den größten Vorteil funktionaler Methoden verlieren, nämlich dass Sie das Ergebnis einer funktionalen Methode direkt in anderen ABAP-Ausdrücken verwenden können.

Die Abbildung zeigt zwei Beispiele, wie Sie funktionale Methoden in Ausdrücken verwenden können. Im ersten einfachen Beispiel ist der Returning-Parameter direkt einer Variable zugewiesen. Das zweite Beispiel zeigt, wie der Aufruf der funktionalen Methode als Eingabe für eine andere Methode verwendet wird. Das System führt die funktionale Methode aus und verwendet dann den Wert des Rückgabeparameters als Eingabe für die Methode write( ).

Probieren Sie es aus: Funktionale Methoden

  1. Legen Sie wie in der ersten Übung dieser Schulung eine neue globale Klasse an, die das Interface IF_OO_ADT_CLASSRUN implementiert.
  2. Kopieren Sie das folgende Code-Snippet in den Implementierungsteil der Methode if_oo_adt_classrun~main( ):
    Code Snippet
    123456789101112131415161718192021222324252627282930313233343536
    DATA connection TYPE REF TO lcl_connection. DATA connections TYPE TABLE OF REF TO lcl_connection. * Create Instance ********************************************************************** connection = NEW #( ). connection->set_attributes( EXPORTING i_carrier_id = 'LH' i_connection_id = '0400' ). APPEND connection TO connections. * Calling Functional Method ********************************************************************** " in a value assignment (with inline declaration for result) DATA(result) = connection->get_output( ). " in logical expression IF connection->get_output( ) IS NOT INITIAL. " as operand in a statement LOOP AT connection->get_output( ) INTO DATA(line). ENDLOOP. " to supply input parameter of another method out->write( data = connection->get_output( ) name = ` ` ). ENDIF.
  3. Navigieren Sie zur Registerkarte ///Local Types, und fügen Sie dort das folgende Code-Snippet ein:
    Code Snippet
    12345678910111213141516171819202122232425262728293031323334353637383940414243
    CLASS lcl_connection DEFINITION. PUBLIC SECTION. * Attributes DATA carrier_id TYPE /dmo/carrier_id. DATA connection_id TYPE /dmo/connection_id. * Methods METHODS set_attributes IMPORTING i_carrier_id TYPE /dmo/carrier_id DEFAULT 'LH' i_Connection_id TYPE /dmo/connection_id. " Functional Method METHODS get_output RETURNING VALUE(r_output) TYPE string_table. * PROTECTED SECTION. * PRIVATE SECTION. ENDCLASS. CLASS lcl_connection IMPLEMENTATION. METHOD set_attributes. carrier_id = i_carrier_id. connection_id = i_connection_id. ENDMETHOD. METHOD get_output. APPEND |------------------------------| TO r_output. APPEND |Carrier: { carrier_id }| TO r_output. APPEND |Connection: { connection_id }| TO r_output. ENDMETHOD. ENDCLASS.
  4. Drücken Sie STRG + F3, um die Klasse zu aktivieren, und F9, um sie als Konsolen-App auszuführen.
  5. Analysieren Sie die Konsolenausgabe. Debuggen Sie das Programm, und probieren Sie mit dem Quelltext Verschiedenes aus, um sich mit den Konzepten vertraut zu machen. Debuggen Sie insbesondere die verschiedenen Aufrufe der funktionalen Methode get_output( )..

Methoden definieren und aufrufen

In dieser Übung definieren und implementieren Sie Methoden in Ihrer lokalen Klasse lcl_connection. Diese Methoden rufen Sie dann aus der main( ) Methode Ihrer globalen Klasse auf.

Vorlage:

  • /LRN/CL_S4D400_CLS_INSTANCES (globale Klasse)

Lösung:

  • /LRN/CL_S4D400_CLS_METHODS (globale Klasse)

Aufgabe 1: Vorlage kopieren (optional)

Kopieren Sie die Vorlageklasse. Wenn Sie die vorherige Übung abgeschlossen haben, können Sie diese Aufgabe überspringen und mit der Bearbeitung Ihrer Klasse ZCL_##_LOCAL_CLASS oder Ihrer Klasse ZCL_##_INSTANCES fortfahren.

Schritte

  1. Öffnen Sie den Quelltext der globalen Klasse /LRN/CL_S4D400_CLS_INSTANCES im ABAP Editor.

    1. Wählen Sie in der Eclipse-Symbolleiste Open ABAP Development Object. Drücken Sie alternativ Strg + Umschalt + A.

    2. Geben Sie als Suchzeichenfolge /LRN/CL_S4D400_CLS ein.

    3. Wählen Sie aus der Liste der Entwicklungsobjekte /LRN/CL_S4D400_CLS_INSTANCES aus, und wählen Sie dann OK.

  2. Verknüpfen Sie die View Project Explorer mit dem Editor.

    1. Suchen Sie in der Symbolleiste Project Explorer die Drucktaste Link with Editor. Wählen Sie die Drucktaste, falls diese noch nicht markiert ist. Dadurch sollte das Entwicklungsobjekt, das im Editor geöffnet ist, im Project Explorer hervorgehoben sein.

  3. Kopieren Sie die Klasse /LRN/CL_S4D400_CLS_INSTANCES in eine Klasse in Ihrem eigenen Paket (Namensvorschlag: ZCL_##_METHODS, wobei ## für Ihre Gruppennummer steht).

    1. Klicken Sie in der View Project Explorer mit der rechten Maustaste auf die Klasse /LRN/CL_S4D400_CLS_INSTANCES, um das Kontextmenü zu öffnen.

    2. Wählen Sie im Kontextmenü Duplicate ...

    3. Geben Sie den Namen Ihres Pakets in das Feld Package ein. Geben Sie im Feld Name den Namen ZCL_##_METHODS ein, wobei ## für Ihre Gruppennummer steht.

    4. Passen Sie die Beschreibung an, und wählen Sie Next.

    5. Bestätigen Sie den Transportauftrag, und wählen Sie Finish.

Aufgabe 2: Methoden definieren

Definieren Sie in Ihrer lokalen Klasse lcl_connection die Instanzmethoden get_output und set_attributes.

Schritte

  1. Navigieren Sie zur Definition der lokalen Klasse lcl_connection.

    1. Wählen Sie in der globalen Klasse Local Types.

  2. Fügen Sie dem öffentlichen Bereich der Klasse die Methode get_output hinzu. Sie sollte einen Rückgabeparameter r_output des globalen Tabellentyps STRING_TABLE haben.

    Notiz

    Denken Sie daran, den Namen des Returning-Parameters mit VALUE( ) zu umschließen.
    1. Passen Sie den Quelltext wie folgt an:

      Code Snippet
      1234567891011121314
      PUBLIC SECTION. DATA carrier_id TYPE /dmo/carrier_id. DATA connection_id TYPE /DMO/Connection_id. CLASS-DATA conn_counter TYPE i. METHODS get_output returning value(r_output) type string_table. PROTECTED SECTION.

      Notiz

      Ignorieren Sie für den Moment den Syntaxfehler ///Implementierung fehlt für Methode "GET_OUTPUT".
  3. Fügen Sie dem öffentlichen Bereich der Klasse eine Methode set_attributes hinzu. Diese sollte einen Importing-Parameter für jedes Instanzattribut der Klasse aufweisen. Verwenden Sie dieselben Typen für die Parameter, mit denen Sie die Attribute typisiert haben. Um die Parameter von den Attributen zu unterscheiden, fügen Sie dem Parameternamen das Präfix i_ hinzu. Zusätzlich sollte die Methode die Ausnahme CX_ABAP_INVALID_VALUE auslösen.

    1. Passen Sie den Quelltext wie folgt an:

      Code Snippet
      123456789101112131415161718192021
      PUBLIC SECTION. DATA carrier_id TYPE /dmo/carrier_id. DATA connection_id TYPE /DMO/Connection_id. CLASS-DATA conn_counter TYPE i. METHODS set_attributes IMPORTING i_carrier_id TYPE /dmo/carrier_id i_connection_id TYPE /dmo/connection_id RAISING cx_abap_invalid_value. METHODS get_output returning value(r_output) type string_table. PROTECTED SECTION.

      Notiz

      Ignorieren Sie für den Moment den Syntaxfehler ///Implementierung fehlt für Methode "SET_ATTRIBUTES".

Aufgabe 3: Methoden implementieren

Schritte

  1. Verwenden Sie einen Quickfix, um die Methodenimplementierungen zur Klasse hinzuzufügen.

    1. Positionieren Sie den Cursor auf den Namen einer der Methoden im Editor, und drücken Sie Strg + 1.

    2. Doppelklicken Sie auf den Vorschlag ///2 nicht implementierte Methoden hinzufügen.

  2. Implementieren Sie die Methode get_output. Hängen Sie einige Zeichenketten-Templates an den Returning-Parameter r_output an. Verwenden Sie in den Zeichenketten-Templates eingebettete Ausdrücke, um die Werte der Attribute carrier_id und connection_id hinzuzufügen.

    1. Fügen Sie in der lokalen Klasse den folgenden Quelltext zwischen den Anweisungen METHOD get_output. und ENDMETHOD. hinzu:

      Code Snippet
      12345
      APPEND |------------------------------| TO r_output. APPEND |Carrier: { carrier_id }| TO r_output. APPEND |Connection: { connection_id }| TO r_output.
  3. Implementieren Sie die Methode set_attributes. Wenn einer der beiden Importing-Parameter leer ist (IS INITIAL), lösen Sie die Ausnahme CX_ABAP_INVALID_VALUE aus. Andernfalls füllen Sie die beiden Instanzattribute mit den Werten der Importing-Parameter.

    1. Passen Sie den Quelltext wie folgt an:

      Code Snippet
      123456789101112
      METHOD set_attributes. IF i_carrier_id IS INITIAL OR i_connection_id IS INITIAL. RAISE EXCEPTION TYPE cx_abap_invalid_value. ENDIF. carrier_id = i_carrier_id. connection_id = i_connection_id. ENDMETHOD.
  4. Aktivieren Sie Ihre Klasse.

    1. Wählen Sie Strg + F3, um die Klasse zu aktivieren.

Aufgabe 4: Funktionale Methoden aufrufen

Rufen Sie in der Methode main Ihrer globalen Klasse die funktionale Methode get_output auf.

Schritte

  1. Wechseln Sie zur Implementierung der Methode if_oo_adt_classrun~main in der globalen Klasse.

    1. Wählen Sie in der globalen Klasse ///Global Class, blättern Sie nach unten zur Implementierung der Methode if_oo_adt_classrun~main.

  2. Fügen Sie am Ende der Methode eine Schleife über die interne Tabelle connections mit der Referenzvariable connection als Arbeitsbereich hinzu.

    1. Fügen Sie folgenden Code vor ENDMETHOD. hinzu:

      Code Snippet
      12345
      LOOP AT connections INTO connection. ENDLOOP.
  3. Rufen Sie in der Schleife nacheinander für jede Instanz die funktionale Methode get_output auf, und schreiben Sie das Ergebnis in die Konsole.

    Hinweis

    Sie können den Aufruf der Methode get_output direkt als Eingabe für out->write( ). verwenden.
    1. Passen Sie den Quelltext wie folgt an:

      Code Snippet
      1234567
      LOOP AT connections INTO connection. out->write( connection->get_output( ) ). ENDLOOP.
  4. Aktivieren Sie die Klasse. Führen Sie sie als Konsolen-App aus, und analysieren Sie die Konsolenausgabe.

    1. Drücken Sie Strg + F3, um die Klasse zu aktivieren.

    2. Drücken Sie F9, um die Klasse auszuführen.

    3. Analysieren Sie die Ausgabe im Fenster Console.

Aufgabe 5: Code Completion verwenden und Ausnahmen behandeln

Verwenden Sie die Code Completion, um die Methode set_attributes aufzurufen und die von der Methode ausgelöste Ausnahme zu behandeln.

Schritte

  1. Ersetzen Sie für die erste Instanz der Klasse lcl_connection den direkten Zugriff auf die Attribute carrier_id und connection_id durch einen Aufruf der Instanzmethode set_attributes( ). Verwenden Sie die Code Completion, um die vollständige Signatur der Methode einzufügen.

    Hinweis

    Drücken Sie Strg + Leertaste, nachdem Sie die Komponentenauswahl (->) typisiert haben, um eine Liste der verfügbaren Attribute und Methoden anzuzeigen. Wählen Sie die Methode, und drücken Sie dann Umschalt + Eingabetaste, um die vollständige Signatur der Methode einzufügen.
    1. Positionieren Sie den Cursor in der nächsten Zeile nach der ersten connection = NEW #( )..

    2. Geben Sie connection-> ein, und drücken Sie Strg + Leertaste.

    3. Wählen Sie set_attributes, und drücken Sie Umschalt + Eingabetaste.

    4. Übergeben Sie Werte an die Importing-Parameter. Verwenden Sie dieselben Literale, die Sie zuvor zum Setzen der Attribute dieser Instanz verwendet haben.

    5. Entfernen oder kommentieren Sie den direkten Zugriff auf die Instanzattribute für diese Instanz.

  2. Behandeln Sie die Ausnahme. Umschließen Sie den Methodenaufruf mit TRY. und ENDTRY.. Fügen Sie einen CATCH-Block hinzu, um die Ausnahme CX_ABAP_INVALID_VALUE zu behandeln. Stellen Sie sicher, dass die neue Instanz nur zur internen Tabelle connections hinzugefügt wird, wenn der Methodenaufruf erfolgreich war.

    1. Kommentieren Sie die generierte Quelltextzeile CATCH cx_abap_invalid_value. aus.

    2. Fügen Sie TRY. vor dem Methodenaufruf hinzu.

    3. Fügen Sie ENDTRY. nach der CATCH-Anweisung hinzu.

    4. Fügen Sie zwischen der CATCH-Anweisung und der ENDTRY-Anweisung Folgendes hinzu: out->write( `Method call failed` ).

    5. Verschieben Sie die APPEND-Anweisung nach oben zwischen den Methodenaufruf und die CATCH-Anweisung.

    6. Der vollständige Methodenaufruf sollte nun wie folgt aussehen:

      Code Snippet
      1234567891011121314151617
      TRY. connection->set_attributes( EXPORTING i_carrier_id = 'LH' i_connection_id = '0400' ). * connection->carrier_id = 'LH'. * connection->connection_id = '0400'. APPEND connection TO connections. CATCH cx_abap_invalid_value. out->write( `Method call failed` ). ENDTRY.
  3. Wiederholen Sie den vorherigen Schritt für die anderen beiden Instanzen der Klasse lcl_connection.

    1. Nach diesem Schritt sollte die Implementierung der Methode if_oo_adt_classrun~main wie folgt aussehen:

      Code Snippet
      12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
      METHOD if_oo_adt_classrun~main. DATA connection TYPE REF TO lcl_connection. DATA connections TYPE TABLE OF REF TO lcl_connection. * First Instance ********************************************************************** connection = NEW #( ). TRY. connection->set_attributes( EXPORTING i_carrier_id = 'LH' i_connection_id = '0400' ). * connection->carrier_id = 'LH'. * connection->connection_id = '0400'. APPEND connection TO connections. CATCH cx_abap_invalid_value. out->write( `Method call failed` ). ENDTRY. * Second instance ********************************************************************** connection = NEW #( ). TRY. connection->set_attributes( EXPORTING i_carrier_id = 'AA' i_connection_id = '0017' ). * connection->carrier_id = 'AA'. * connection->connection_id = '0017'. APPEND connection TO connections. CATCH cx_abap_invalid_value. out->write( `Method call failed` ). ENDTRY. * Third instance ********************************************************************** connection = NEW #( ). TRY. connection->set_attributes( EXPORTING i_carrier_id = 'SQ' i_connection_id = '0001' ). * connection->carrier_id = 'SQ'. * connection->connection_id = '0001'. APPEND connection TO connections. CATCH cx_abap_invalid_value. out->write( `Method call failed` ). ENDTRY. * Output ********************************************************************** LOOP AT connections INTO connection. out->write( connection->get_output( ) ). ENDLOOP. ENDMETHOD.
  4. Aktivieren Sie die Klasse. Führen Sie sie aus, und debuggen Sie die Methodenaufrufe.

    1. Drücken Sie Strg + F3, um die Klasse zu aktivieren.

    2. Drücken Sie F9, um die Klasse auszuführen.