Neste exercício, você definirá e implementará métodos em sua classe local lcl_connection. Em seguida, você chamará esses métodos a partir do método main( ) de sua classe global.
Tarefa 1: Copiar modelo (opcional)
Copie a classe modelo. Se você concluiu o exercício anterior, pode ignorar esta tarefa e continuar processando sua classe ZCL_##_LOCAL_CLASS ou sua classe ZCL_##_INSTANCES.
Etapas
Abra o texto fonte da classe global /LRN/CL_S4D400_CLS_INSTANCES no editor ABAP.
Na barra de ferramentas Eclipse, selecione Abrir objeto de desenvolvimento ABAP. Como alternativa, pressione Ctrl + Shift + A.
Insira /LRN/CL_S4D400_CLS como cadeia de pesquisa.
Na lista de objetos de desenvolvimento, selecione /LRN/CL_S4D400_CLS_INSTANCES e, em seguida, OK.
Vincule a visão Explorador de projetos ao editor.
Na barra de ferramentas do Explorador de projetos, localize o botão Link com editor. Se ainda não estiver pressionado, selecione-o. Como resultado, o objeto de desenvolvimento, que está aberto no editor, deve ser destacado no Explorador de projetos.
Copie a classe /LRN/CL_S4D400_CLS_INSTANCES para uma classe em seu próprio pacote (nome sugerido: ZCL_##_METHODS, onde ## representa seu número de grupo).
Na visão Explorador de projetos, clique com o botão direito do mouse na classe /LRN/CL_S4D400_CLS_INSTANCES para abrir o menu de conteúdo.
No menu de contexto, selecione Duplicar ....
Insira o nome do seu pacote no campo Pacote. No campo Nome, insira o nome ZCL_##_METHODS, onde ## representa seu número de grupo.
Ajuste a descrição e selecione Seguinte.
Confirme a ordem de transporte e selecione Concluir.
Tarefa 2: Definir métodos
Em sua classe local lcl_connection, defina os métodos de instância get_output e set_attributes.
Etapas
Navegue para a definição da classe local lcl_connection.
Na classe global, selecione Tipos locais.
Adicione um método get_output à seção pública da classe. Ele deve ter um parâmetro de retorno r_output do tipo de tabela global STRING_TABLE.
Nota
Lembre-se de cercar o nome do parâmetro de retorno com VALUE( ).
Ajuste o código da seguinte forma:
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
De momento, ignorar o erro de sintaxe Implementação em falta para o método "GET_OUTPUT".
Adicione um método set_attributes à seção pública da classe. Ele deve ter um parâmetro de importação para cada atributo de instância da classe. Utilize os mesmos tipos para os parâmetros que você utilizou para digitar os atributos. Para distinguir os parâmetros dos atributos, adicione o prefixo i_ aos nomes de parâmetro. Além disso, o método deve acionar a exceção CX_ABAP_INVALID_VALUE.
Ajuste o código da seguinte forma:
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 enquanto, ignore o erro de sintaxe Implementação em falta para o método "SET_ATTRIBUTES".
Tarefa 3: Implementar métodos
Etapas
Utilize uma correção rápida para adicionar as implementações de método à classe.
Posicione o cursor no nome de um dos métodos no editor e pressione Ctrl + 1.
Clique duas vezes na sugestão Adicionar 2 métodos não implementados.
Implemente o método get_output. Anexe alguns modelos de string ao parâmetro de retorno r_output. Nos modelos de string, use expressões incorporadas para adicionar os valores dos atributos carrier_id e connection_id.
Na classe local, adicione o seguinte código entre as instruções METHOD get_output. e ENDMETHOD.
12345
APPEND |------------------------------| TO r_output.
APPEND |Carrier: { carrier_id }| TO r_output.
APPEND |Connection: { connection_id }| TO r_output.
Implemente o método set_attributes. Se um dos dois parâmetros de importação estiver vazio (IS INITIAL), crie a exceção CX_ABAP_INVALID_VALUE. Caso contrário, preencha os dois atributos de instância com os valores dos parâmetros de importação.
Ajuste o código da seguinte forma:
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.
Ative sua classe.
Selecione Ctrl + F3 para ativar a classe.
Tarefa 4: Chamar um método funcional
No método principal de sua classe global, chame o método funcional get_output.
Etapas
Mude para a implementação do método if_oo_adt_classrun~main na classe global.
Na classe global, selecione Classe global e role para baixo até a implementação do método if_oo_adt_classrun~main.
No final do método, adicione um loop sobre as conexões de tabela interna com conexão de variável de referência como área de trabalho.
Adicione o seguinte código antes de ENDMETHOD..
12345
LOOP AT connections INTO connection.
ENDLOOP.
No loop, chame o método funcional get_output para cada instância e escreva o resultado no console.
Dica
Você pode usar a chamada do método get_output diretamente como entrada para out->write( ).
Ajuste o código da seguinte forma:
1234567
LOOP AT connections INTO connection.
out->write( connection->get_output( ) ).
ENDLOOP.
Ative a classe. Execute-o como um aplicativo de console e analise a saída do console.
Pressione Ctrl + F3 para ativar a classe.
Pressione F9 para executar a classe.
Analise a saída na janela Console.
Tarefa 5: Utilizar code completion e tratar exceções
Utilize o code completion para chamar o método set_attributes e tratar a exceção que o método gera.
Etapas
Para a primeira instância da classe lcl_connection, substitua o acesso direto aos atributos carrier_id e connection_id por uma chamada do método de instância set_attributes( ). Use o preenchimento de código para inserir a assinatura completa do método.
Dica
Pressione Ctrl + espaço depois de digitar o componente selecionado (->) para exibir uma lista de atributos e métodos disponíveis. Selecione o método e pressione Shift + Enter para inserir a assinatura completa do método.
Posicione o cursor na linha seguinte após o primeiro connection = NEW #( )..
Digite connection-> e pressione Ctrl + espaço.
Selecione set_attributes e pressione Shift + Enter.
Transfira valores para os parâmetros de importação. Utilize os mesmos literais que você utilizou anteriormente para definir os atributos desta instância.
Remova ou comente o acesso direto aos atributos de instância para esta instância.
Trate a exceção. Envolva a chamada de método com TRY. e ENDTRY.. Adicione um bloqueio CATCH para tratar a exceção CX_ABAP_INVALID_VALUE. Certifique-se de que a nova instância só é adicionada a conexões de tabela internas se a chamada de método tiver sido efetuada com êxito.
Anule o comentário da linha de código gerada CATCH cx_abap_invalid_value..
Adicione TRY. antes da chamada de método.
Adicione ENDTRY. após a instrução CATCH.
Entre a instrução CATCH e a instrução ENDTRY, adicione out->write( `Method call failed` ).
Mova a instrução APPEND para cima entre a chamada de método e a instrução CATCH.
A chamada completa do método deve ter o seguinte 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 a etapa anterior para as outras duas instâncias da classe lcl_connection.
Após esta etapa, a implementação do método if_oo_adt_classrun~main deve ter um aspecto semelhante a este:
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.
Ative a classe. Execute-o e depure as chamadas de método.
Pressione Ctrl + F3 para ativar a classe.
Pressione F9 para executar a classe.