понедельник, 16 февраля 2015 г.

Два способа получить структуру внутренней таблицы.

Способ №1, используя класс CL_ABAP_TYPEDESCR.
typesbegin of typ_itab,
           a 
type c,
           b 
type i,
           
c type p length decimals 2,
          
end of typ_itab.
datalt_out_n type table of typ_itab,"таблица структуру которой нужно будет получить

      l_tabledescr_ref 
type ref to cl_abap_tabledescr,
      l_descr_ref      
type ref to cl_abap_structdescr,
      wa_table 
type abap_compdescr.

l_tabledescr_ref ?= cl_abap_typedescr
=>describe_by_datalt_out_n ).
l_descr_ref ?= l_tabledescr_ref
->get_table_line_type( ).
write'CL_ABAP_TYPEDESCR' color col_positive.
loop at l_descr_ref->components into wa_table .
  
writewa_table-name,
           wa_table-type_kind
,
           wa_table
-length,
           wa_table
-decimals.
endloop.
Это собственно все. Быстро, удобно, красиво, но работает только с  внутренними таблицами без заголовка, для таблиц с заголовком смотрим способ №2.

Способ №2, используя ФМ GET_COMPONENT_LIST.
databegin of lt_out_h occurs 0"таблица структуру которой нужно будет получить
         s1 
type c,
         s2 
type c,
         s3 
type p length decimals 2,
        
end of lt_out_h,

lt_components 
like standard table of rstrucinfo,
wa_components 
like line of lt_components.
call function 'GET_COMPONENT_LIST'
  
exporting
    
program    sy-cprog
    fieldname  
'LT_OUT_H'
  
tables
    components 
lt_components.
write'GET_COMPONENT_LIST' color col_positive.
loop at lt_components into wa_components.
  
writewa_components-compname,
           wa_components
-level,
           wa_components-leng
,
           wa_components
-type,
           wa_components-olen
,
           wa_components-decs
.
endloop.
 Достоинство этого способа это то, что мы может получить структуру внутренней таблицы находящейся не только в нашей программе, но и в любой другой. Для этого нужно в параметр program передать название программы, в которой находится интересующая нас таблица.
Минус данного способа, он работает только с таблицами с заголовками. Для работы с таблицами без заголовка смотрим способ №1.