Динамически определяемая переменная в ABAP

Допустим, у меня есть переменная (char30), которая содержит имя типа данных, и я хотел бы создать другую переменную этого типа данных.

Пример:

lv_type = 'BU_PARTNER'
data: rt_value type range of ( lv_type ).

Любые советы, как добиться этого в ABAP?

Спасибо!


person sachad    schedule 12.08.2017    source источник


Ответы (3)


Таблица RANGE — это просто таблица STANDARD с таким компонентом, как 'LOW', 'HIGH', 'EQ' and 'OPTION'.

Использование API, связанного с RTTS, для создания такая STANDARD таблица.

data:
    lr_data          type ref to data,
    lt_ra_string     type range of string,
    ls_ra_string     like line of lt_ra_string,
    ls_component     type line of abap_component_tab,
    lt_component    type abap_component_tab,
    lt_ra_components type abap_component_tab,
    lo_struc_descr type ref to cl_abap_structdescr,
    lo_table_descr type ref to cl_abap_tabledescr,
    lo_data_descr  type ref to cl_abap_datadescr.

field-symbols:
    <lv_value> type any,
    <lt_ra_type> type standard table,
    <ls_ra_type> type any.

    data(lv_type) = 'BU_PARTNER'.

create data lr_data type (lv_type).

lo_struc_descr ?= cl_abap_structdescr=>describe_by_data( p_data = ls_ra_string ).

lt_component = lo_struc_descr->get_components( ).

lo_data_descr ?= cl_abap_elemdescr=>describe_by_name( lv_type ).

lt_ra_components = value #( for comp in lt_component (
                            name = comp-name
                            type = cond #( 
                                when comp-name eq 'SIGN' 
                                  or comp-name eq 'OPTION'
                                then  comp-type
                                else lo_data_descr )
                        ) ).
lo_struc_descr ?= cl_abap_structdescr=>create( lt_ra_components ).
lo_table_descr ?= cl_abap_tabledescr=>create( lo_struc_descr ).

create data lr_data type handle lo_table_descr.
assign lr_data->* to <lt_ra_type>.

create data lr_data like line of <lt_ra_type>.
assign lr_data->* to <ls_ra_type>.

assign component 'SIGN' of structure <ls_ra_type> to <lv_value>.
<lv_value> = 'I'.
assign component 'OPTION' of structure <ls_ra_type> to <lv_value>.
<lv_value> = 'EQ'.
assign component 'LOW' of structure <ls_ra_type> to <lv_value>.
<lv_value> = 'DUMMY1'.
assign component 'HIGH' of structure <ls_ra_type> to <lv_value>.
<lv_value> = 'DUMMY2'.

* <lt_ra_type> is your range table
append <ls_ra_type> to <lt_ra_type>.    
person Haojie    schedule 13.08.2017

Тип данных range — это не что иное, как структура с четырьмя полями:

Вариант подписи Низкий Высокий

Таким образом, вы можете использовать RTTS для динамического построения такой структуры, поскольку типы данных для знака и параметра фиксированы, а типы данных для «низкого» и «высокого» вы можете установить динамически. Затем, когда у вас есть ссылка на объект структуры, вы можете назначить его к символу поля.

person TheG    schedule 12.08.2017

Насколько я знаю, нет встроенной команды для динамического создания таблиц диапазонов. Вы должны использовать RTTC для построения таблицы диапазонов:

TYPE-POOLS: abap.

DATA:
  g_dataelement     TYPE rollname,
  go_structdescr    TYPE REF TO cl_abap_structdescr,
  go_tabledescr     TYPE REF TO cl_abap_tabledescr,
  gt_component      TYPE abap_component_tab,
  gs_component      TYPE LINE OF abap_component_tab,
  gr_range          TYPE REF TO data,
  gr_range_line     TYPE REF TO data.

FIELD-SYMBOLS: <gs_range_line> TYPE any,
               <gs_range> TYPE table.

START-OF-SELECTION.

  g_dataelement = 'BU_PARTNER'.

  " Create component table
  gs_component-name = 'SIGN'.
  gs_component-type ?= cl_abap_elemdescr=>get_c( 1 ).
  INSERT gs_component INTO TABLE gt_component.
  gs_component-name = 'OPTION'.
  gs_component-type ?= cl_abap_elemdescr=>get_c( 2 ).
  INSERT gs_component INTO TABLE gt_component.
  gs_component-name = 'LOW'.
  gs_component-type ?= cl_abap_elemdescr=>describe_by_name( g_dataelement ).
  INSERT gs_component INTO TABLE gt_component.
  gs_component-name = 'HIGH'.
  gs_component-type ?= cl_abap_elemdescr=>describe_by_name( g_dataelement ).
  INSERT gs_component INTO TABLE gt_component.

  " Create type descriptors
  go_structdescr ?= cl_abap_structdescr=>create( gt_component ).
  go_tabledescr ?= cl_abap_tabledescr=>create( go_structdescr ).

  " Create usable variables
  CREATE DATA gr_range TYPE HANDLE go_tabledescr.
  ASSIGN gr_range->* TO <gs_range>.

  CREATE DATA gr_range_line TYPE HANDLE go_structdescr.
  ASSIGN gr_range_line->* TO <gs_range_line>.
person szako    schedule 13.08.2017