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.
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
Öffnen Sie den Quelltext der globalen Klasse /LRN/CL_S4D400_CLS_INSTANCES im ABAP Editor.
Wählen Sie in der Eclipse-Symbolleiste Open ABAP Development Object. Drücken Sie alternativ Strg + Umschalt + A.
Geben Sie als Suchzeichenfolge /LRN/CL_S4D400_CLS ein.
Wählen Sie aus der Liste der Entwicklungsobjekte /LRN/CL_S4D400_CLS_INSTANCES aus, und wählen Sie dann OK.
Verknüpfen Sie die View Project Explorer mit dem Editor.
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.
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).
Klicken Sie in der View Project Explorer mit der rechten Maustaste auf die Klasse /LRN/CL_S4D400_CLS_INSTANCES, um das Kontextmenü zu öffnen.
Wählen Sie im Kontextmenü Duplicate ...
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.
Passen Sie die Beschreibung an, und wählen Sie Next.
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
Navigieren Sie zur Definition der lokalen Klasse lcl_connection.
Wählen Sie in der globalen Klasse Local Types.
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.
Passen Sie den Quelltext wie folgt an:
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".
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.
Passen Sie den Quelltext wie folgt an:
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
Verwenden Sie einen Quickfix, um die Methodenimplementierungen zur Klasse hinzuzufügen.
Positionieren Sie den Cursor auf den Namen einer der Methoden im Editor, und drücken Sie Strg + 1.
Doppelklicken Sie auf den Vorschlag ///2 nicht implementierte Methoden hinzufügen.
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.
Fügen Sie in der lokalen Klasse den folgenden Quelltext zwischen den Anweisungen METHOD get_output. und ENDMETHOD. hinzu:
12345
APPEND |------------------------------| TO r_output.
APPEND |Carrier: { carrier_id }| TO r_output.
APPEND |Connection: { connection_id }| TO r_output.
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.
Passen Sie den Quelltext wie folgt an:
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.
Aktivieren Sie Ihre Klasse.
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
Wechseln Sie zur Implementierung der Methode if_oo_adt_classrun~main in der globalen Klasse.
Wählen Sie in der globalen Klasse ///Global Class, blättern Sie nach unten zur Implementierung der Methode if_oo_adt_classrun~main.
Fügen Sie am Ende der Methode eine Schleife über die interne Tabelle connections mit der Referenzvariable connection als Arbeitsbereich hinzu.
Fügen Sie folgenden Code vor ENDMETHOD. hinzu:
12345
LOOP AT connections INTO connection.
ENDLOOP.
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.
Passen Sie den Quelltext wie folgt an:
1234567
LOOP AT connections INTO connection.
out->write( connection->get_output( ) ).
ENDLOOP.
Aktivieren Sie die Klasse. Führen Sie sie als Konsolen-App aus, und analysieren Sie die Konsolenausgabe.
Drücken Sie Strg + F3, um die Klasse zu aktivieren.
Drücken Sie F9, um die Klasse auszuführen.
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
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.
Positionieren Sie den Cursor in der nächsten Zeile nach der ersten connection = NEW #( )..
Geben Sie connection-> ein, und drücken Sie Strg + Leertaste.
Wählen Sie set_attributes, und drücken Sie Umschalt + Eingabetaste.
Übergeben Sie Werte an die Importing-Parameter. Verwenden Sie dieselben Literale, die Sie zuvor zum Setzen der Attribute dieser Instanz verwendet haben.
Entfernen oder kommentieren Sie den direkten Zugriff auf die Instanzattribute für diese Instanz.
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.
Kommentieren Sie die generierte Quelltextzeile CATCH cx_abap_invalid_value. aus.
Fügen Sie TRY. vor dem Methodenaufruf hinzu.
Fügen Sie ENDTRY. nach der CATCH-Anweisung hinzu.
Fügen Sie zwischen der CATCH-Anweisung und der ENDTRY-Anweisung Folgendes hinzu: out->write( `Method call failed` ).
Verschieben Sie die APPEND-Anweisung nach oben zwischen den Methodenaufruf und die CATCH-Anweisung.
Der vollständige Methodenaufruf sollte nun wie folgt aussehen:
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.
Wiederholen Sie den vorherigen Schritt für die anderen beiden Instanzen der Klasse lcl_connection.
Nach diesem Schritt sollte die Implementierung der Methode if_oo_adt_classrun~main wie folgt aussehen:
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.
Aktivieren Sie die Klasse. Führen Sie sie aus, und debuggen Sie die Methodenaufrufe.
Drücken Sie Strg + F3, um die Klasse zu aktivieren.
Drücken Sie F9, um die Klasse auszuführen.