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)
DATA: t_comp TYPE cl_abap_structdescr=>component_table.
* Objeto utilizado para criar a estrutura dinâmica
DATA: o_strtype TYPE REF TO cl_abap_structdescr.
* Objeto utilizado para criar a tabek dinâmica
DATA: o_tabtype TYPE REF TO cl_abap_tabledescr.
* O nosso ponto de dados de referência
DATA: wa_data TYPE REF TO DATA.
* Área de trabalho para lidar com atributos e o nome de cada campo.
DATA: wa_comp LIKE LINE OF t_comp.
* Variáveis para construir o nome de cada campo
DATA: v_nome_campo TYPE txt30.
DATA: v_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 5 TIMES.
CLEAR: v_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_c( p_length = 1024 ).
APPEND wa_comp TO t_comp.
CLEAR: wa_comp.
ENDDO.
*&---------------------------------------------------------------------
* ETAPA: 3
*&---------------------------------------------------------------------
* Agora temos de criar uma estrutura com todos os campos carregados
* na etapa anterior
*&---------------------------------------------------------------------
o_strtype = cl_abap_structdescr=>create( t_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=>create( p_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