En este ejercicio, definirá e implementará métodos en su clase local lcl_connection. A continuación, llamará estos métodos desde el método main( ) de su clase global.
Tarea 1: Copiar plantilla (opcional)
Copie la clase de modelo. Si ha finalizado el ejercicio anterior, puede omitir esta tarea y continuar editando su clase ZCL_##_LOCAL_CLASS o su clase ZCL_##_INSTANCES.
Pasos
Abra el código fuente de la clase global /LRN/CL_S4D400_CLS_INSTANCES en el editor ABAP.
En la barra de herramientas de Eclipse, seleccione Abrir objeto de desarrollo ABAP. Como alternativa, pulse Ctrl + Mayús + A.
Introduzca /LRN/CL_S4D400_CLS como string de búsqueda.
En la lista de objetos de desarrollo, seleccione /LRN/CL_S4D400_CLS_INSTANCES y, a continuación, seleccione OK.
Vincule la vista Explorador de proyectos con el editor.
En la barra de herramientas Explorador de proyectos, busque el botón Vincular con editor. Si aún no se ha pulsado, selecciónelo. Como resultado, el objeto de desarrollo, que está abierto en el editor, debería resaltarse en el Explorador de proyectos.
Copie la clase /LRN/CL_S4D400_CLS_INSTANCES en una clase de su propio paquete (nombre sugerido: ZCL_##_METHODS, donde ## representa su número de grupo).
En la vista Explorador de proyectos, haga clic con el botón derecho en la clase /LRN/CL_S4D400_CLS_INSTANCES para abrir el menú de contenido.
En el menú contextual, seleccione Duplicar ....
Introduzca el nombre del paquete en el campo Paquete. En el campo Nombre, introduzca el nombre ZCL_##_METHODS, donde ## representa su número de grupo.
Ajuste la descripción y seleccione Siguiente.
Confirme la orden de transporte y seleccione Finalizar.
Tarea 2: Definir métodos
En su clase local lcl_connection, defina los métodos de instancia get_output y set_attributes.
Pasos
Navegue a la definición de la clase local lcl_connection.
En la clase global, seleccione Tipos locales.
Añada un método get_output a la sección pública de la clase. Debería tener un parámetro de retorno r_output del tipo de tabla global STRING_TABLE.
Nota
Recuerde rodear el nombre del parámetro de retorno con VALUE( ).
Ajuste el código de la siguiente manera:
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.
Nota
Por el momento, ignore el error de sintaxis Falta implementación para el método "GET_OUTPUT".
Añada un método set_attributes a la sección pública de la clase. Debería tener un parámetro de importación para cada atributo de instancia de la clase. Utilice los mismos tipos para los parámetros que ha utilizado para tipificar los atributos. Para distinguir los parámetros de los atributos, añada el prefijo i_ a los nombres de parámetro. Además, el método debe emitir la excepción CX_ABAP_INVALID_VALUE.
Ajuste el código de la siguiente manera:
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.
Nota
Por el momento, ignore el error de sintaxis Falta implementación para el método "SET_ATTRIBUTES".
Tarea 3: Implementar métodos
Pasos
Utilice una corrección rápida para añadir las implementaciones de método a la clase.
Sitúe el cursor en el nombre de uno de los métodos en el editor y pulse Ctrl + 1.
Haga doble clic en la sugerencia Añadir 2 métodos no implementados.
Implemente el método get_output. Añada algunos modelos de cadena para devolver el parámetro r_output. En los modelos de cadena, utilice expresiones integradas para añadir los valores de los atributos carrier_id y connection_id.
En la clase local, añada el siguiente código entre las sentencias METHOD get_output. y ENDMETHOD.
12345
APPEND |------------------------------| TO r_output.
APPEND |Carrier: { carrier_id }| TO r_output.
APPEND |Connection: { connection_id }| TO r_output.
Implemente el método set_attributes. Si alguno de los dos parámetros de importación está vacío (IS INITIAL), emita la excepción CX_ABAP_INVALID_VALUE. De lo contrario, rellene los dos atributos de instancia con los valores de los parámetros de importación.
Ajuste el código de la siguiente manera:
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.
Active su clase.
Seleccione Ctrl + F3 para activar la clase.
Tarea 4: Llamar un método funcional
En el método principal de su clase global, llame el método funcional get_output.
Pasos
Cambie a la implementación del método if_oo_adt_classrun~main en la clase global.
En la clase global, seleccione Clase global, desplácese hacia abajo hasta la implementación del método if_oo_adt_classrun~main.
Al final del método, añada un loop sobre las conexiones de tabla internas con una conexión de variable de referencia como área de trabajo.
Añada el siguiente código antes de ENDMETHOD..
12345
LOOP AT connections INTO connection.
ENDLOOP.
En el loop, llame el método funcional get_output para cada instancia a su vez y escriba el resultado en la consola.
Consejo
Puede utilizar la llamada del método get_output directamente como entrada para out->write( ).
Ajuste el código de la siguiente manera:
1234567
LOOP AT connections INTO connection.
out->write( connection->get_output( ) ).
ENDLOOP.
Active la clase. Ejecútela como una aplicación de consola y analice la salida de la consola.
Pulse Ctrl + F3 para activar la clase.
Pulse F9 para ejecutar la clase.
Analice la salida en la ventana Consola.
Tarea 5: Utilizar finalización de código y tratar excepciones
Utilice la compleción de código para llamar el método set_attributes y tratar la excepción que emite el método.
Pasos
Para la primera instancia de la clase lcl_connection, sustituya el acceso directo a los atributos carrier_id y connection_id por una llamada del método de instancia set_attributes( ). Utilice la compleción de código para insertar la firma completa del método.
Consejo
Pulse Ctrl + Espacio después de escribir el componente select (->) para visualizar una lista de atributos y métodos disponibles. Seleccione el método y, a continuación, pulse Mayús + Intro para insertar la firma completa del método.
Coloque el cursor en la siguiente línea después de la primera connection = NEW #( )..
Escriba connection-> y pulse Ctrl + Espacio.
Seleccione set_attributes y pulse Mayús + Intro.
Transfiera valores a los parámetros de importación. Utilice los mismos literales que ha utilizado anteriormente para fijar los atributos de esta instancia.
Elimine o comente el acceso directo a los atributos de instancia para esta instancia.
Trate la excepción. Rodee la llamada de método con TRY. y ENDTRY.. Añada un bloque CATCH para tratar la excepción CX_ABAP_INVALID_VALUE. Asegúrese de que la nueva instancia solo se añada a las conexiones de tabla internas si la llamada de método se ha realizado correctamente.
Anule el comentario de la línea de código generada CATCH cx_abap_invalid_value..
Añada TRY. antes de la llamada de método.
Añada ENDTRY. después de la sentencia CATCH.
Entre la sentencia CATCH y la sentencia ENDTRY agregue out->write( `Method call failed` ).
Mueva la sentencia APPEND hacia arriba entre la llamada de método y la sentencia CATCH.
La llamada de método completa ahora debería tener el siguiente aspecto:
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.
Repita el paso anterior para las otras dos instancias de la clase lcl_connection.
Después de este paso, la implementación del método if_oo_adt_classrun~main debería tener un aspecto similar al siguiente:
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.
Active la clase. Ejecútelo y depure las llamadas de método.
Pulse Ctrl + F3 para activar la clase.
Pulse F9 para ejecutar la clase.