Criando Work area e Tabela dinamica de maneira simples

quinta-feira, 18 de abril de 2013 0 comentários
Olá amigos do Abap Recife.
Neste post será visto uma maneira bem limpa de como criar uma tabela interna dinâmica ou work area dinâmica, onde o seu tipo não será predefinido por uma tabela transparente, ou estrutura types, ou categoria de tabela e outros.
Algumas vezes precisei criar uma estrutura dinâmica a partir de dados vindo de arquivo txt ou tabela transparente. Gostaria de compartilhar este método com vocês. Segue exemplo abaixo:
  *---------------------------------------------------------------------
* ETAPA: 1
*---------------------------------------------------------------------

* Essa tabela armazena o conteúdo de todos os componentes (campos)
DATAt_comp   TYPE cl_abap_structdescr=>component_table.

* Objeto utilizado para criar a estrutura dinâmica
DATAo_strtype  TYPE REF TO cl_abap_structdescr.

* Objeto utilizado para criar a tabek dinâmica
DATAo_tabtype  TYPE REF TO cl_abap_tabledescr.

* O nosso ponto de dados de referência
DATAwa_data   TYPE REF TO DATA.

* Área de trabalho para lidar com atributos e o nome de cada campo.
DATAwa_comp      LIKE LINE OF t_comp.

* Variáveis para construir o nome de cada campo
DATAv_nome_campo   TYPE txt30.
DATAv_numero_campo TYPE text10.

* Ponteiro para manipular tabela interna dinâmica
FIELD-SYMBOLS<t_tab> TYPE ANY TABLE.

* Ponteiro para manipular work área dinâmica
FIELD-SYMBOLS<wa_tab> TYPE ANY.

START-OF-SELECTION.

*&---------------------------------------------------------------------
* ETAPA: 2
*&---------------------------------------------------------------------
* Neste ponto, irá preencher t_comp com
* cinco campos chamados: CAMPO01, CAMPO02, CAMPO03, CAMPO04, CAMPO05
*&---------------------------------------------------------------------
  DO TIMES.
    CLEARv_nome_campo.
    WRITE sy-INDEX TO v_numero_campo.
    CONDENSE v_numero_campo.
    CONCATENATE 'CAMPO0' v_numero_campo INTO v_nome_campo.
*   Nome para cada campo
    wa_comp-NAME v_nome_campo.

*   Para este exemplo vamos construir todo o campo com o tipo C 
*   e 1.024 de comprimento
    wa_comp-TYPE cl_abap_elemdescr=>get_cp_length 1024 ).
    APPEND wa_comp TO t_comp.
    CLEARwa_comp.
  ENDDO.

*&---------------------------------------------------------------------
* ETAPA: 3
*&---------------------------------------------------------------------
* Agora temos de criar uma estrutura com todos os campos carregados
* na etapa anterior
*&---------------------------------------------------------------------
  o_strtype cl_abap_structdescr=>createt_comp ).

* Nesta etapa, é criada uma tabela utilizando o_strtype,
* E passando dois parâmetros adicionais: 
*     p_table_kind (Standard, Hashed, Ordenado)
* P_unique (esta para indicar se tem chave única ou não)
  o_tabtype 
  cl_abap_tabledescr=>createp_line_type  o_strtype
                              p_table_kind cl_abap_tabledescr=>tablekind_std
                              p_unique     abap_false ).

*&---------------------------------------------------------------------
* ETAPA: 4
*&---------------------------------------------------------------------
* Dados para lidar com o novo tipo de tabela.
*&---------------------------------------------------------------------
  TRY.
      CREATE DATA wa_data  TYPE HANDLE o_tabtype.
    CATCH cx_sy_create_data_error.
  ENDTRY.

*&---------------------------------------------------------------------
* ETAPA: 5
*&---------------------------------------------------------------------
*& Armazena tabela interna no ponteiro(field symbol)
*&---------------------------------------------------------------------
  TRY.
      ASSIGN wa_data->TO <t_tab>.
    CATCH cx_sy_assign_cast_illegal_cast.
    CATCH cx_sy_assign_cast_unknown_type.
    CATCH cx_sy_assign_out_of_range.
  ENDTRY.

*&---------------------------------------------------------------------
* ETAPA: 6
*&---------------------------------------------------------------------
* Dados para lidar com a nova work area.
*&---------------------------------------------------------------------
  TRY.
      CREATE DATA wa_data  TYPE HANDLE o_strtype.
    CATCH cx_sy_create_data_error.
  ENDTRY.

*&---------------------------------------------------------------------
* ETAPA: 7
*&---------------------------------------------------------------------
*&  Armazena nova work area no ponteiro
*&---------------------------------------------------------------------
  TRY.
      ASSIGN wa_data->TO <wa_tab>.
    CATCH cx_sy_assign_cast_illegal_cast.
    CATCH cx_sy_assign_cast_unknown_type.
    CATCH cx_sy_assign_out_of_range.
  ENDTRY.


* Confira os valores de <t_tab>  e <wa_tab> via DEBUG
   BREAK-POINT.



Os valores de <t_tab> e <wa_tab> via debug, no final do programa:




Este exemplo pode ser aplicado para linhas de arquivo texto, resultado de busca em tabela transparente e outros. Use sua imaginação.
As idéias desse post foram baseadas nesta publicação http://yuhalbert.com/creating-sap-abap-dynamic-table-in-5-steps/
Abraço e até Logo.

Rafael Chagas

0 comentários:

Postar um comentário