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

У меня есть выпадающий список в моей программе, в который я ввел названия разных таблиц. Итак, я работал с IF-Statement. По сути:

if wa_list-key = '1'.
(replace name of table with the one choosen from the dropdown list)
endif.

У меня такая подборка:

select * from customer into table lt_customer.

Какой синтаксис замены имен таблиц? Я знаю, что операторы замены работают только со строками, но есть ли способ обойтись?


person Sanako-yan    schedule 30.04.2018    source источник
comment
Я не понимаю - чего вы пытаетесь достичь? Зачем вам работать с оператором REPLACE? Введите REPLACE в SE80 и нажмите F1 ...   -  person dotchuZ    schedule 30.04.2018
comment
что бы вы предпочли? Я хочу, чтобы мой раскрывающийся список работал, чтобы я мог выбирать из разных таблиц.   -  person Sanako-yan    schedule 30.04.2018
comment
Бесполезен из-за разных типов таблиц ...   -  person dotchuZ    schedule 30.04.2018
comment
Один пример: KNA1 и LFA1 (и связанные структуры) действительно похожи и могут иметь идентичную обработку для получения некоторых данных. Однако практическая польза от этого редко бывает полезной из-за объема дополнительной работы. Обычно проще сделать 2 выбора или использовать if,elseif.. для разветвления логики процесса. С учетом сказанного, некоторый контекст того, чего вы пытаетесь достичь, определенно поможет нам дать вам ответ. Само по себе динамическое выделение вам не очень поможет, потому что вам также нужна динамическая обработка данных.   -  person Zero    schedule 16.05.2018


Ответы (2)


Вы можете динамически выбирать из таблицы:

DATA: lv_table TYPE tabname.

    SELECT * 
           INTO TABLE lt_table
           FROM (lv_table).

Однако выбранная вами таблица lt_table должна иметь ту же структуру, что и таблица базы данных, из которой вы выбираете, в противном случае произойдет дамп. Чтобы преодолеть это, вы можете использовать INTO COORESPONDING FIELDS OF lt_table (вместо INTO TABLE...). Вы также можете динамически объявлять условия WHERE: WHERE (lv_where) Все зависит от ваших конкретных потребностей.

person József Szikszai    schedule 30.04.2018
comment
Если вам нужен более общий доступ, проверьте эту ссылку на предотвращение атак с использованием SQL-инъекций. - person Sandra Rossi; 01.05.2018

В ответе JozsefSzikszai вы получите дамп, когда структура и таблица базы данных будут разными. Итак, вы можете попробовать это -

DATA: lv_tabname TYPE tabname.

DATA: lo_tabtype     TYPE REF TO cl_abap_tabledescr,
      lo_struct_type TYPE REF TO cl_abap_structdescr,
      lr_data        TYPE REF TO data,
      lt_comp_tab    TYPE cl_abap_structdescr=>component_table,
      ls_comp_fld    TYPE cl_abap_structdescr=>component.

FIELD-SYMBOLS: <fs_tab> TYPE ANY TABLE,
               <fs_struct> TYPE ANY.

lv_tabname = 'ZTEST_DIV'.  " Give tab name from your dropdown select

lo_struct_type ?= cl_abap_typedescr=>describe_by_name( lv_tabname ).
lt_comp_tab  = lo_struct_type->get_components( ).

lo_struct_type = cl_abap_structdescr=>create( lt_comp_tab ).
lo_tabtype     = cl_abap_tabledescr=>create( lo_struct_type ).

CREATE DATA lr_data TYPE HANDLE lo_tabtype.
ASSIGN lr_data->* TO <fs_tab>.

*CREATE DATA lr_data TYPE HANDLE lo_struct_type. " Use this when you want same table structure
*ASSIGN lr_data->* TO <fs_struct>.

* dynamic select
SELECT *
  FROM (lv_tabname)
  INTO CORRESPONDING FIELDS OF TABLE <fs_tab>.

Он будет более общим. Он создаст динамическую внутреннюю таблицу с использованием lv_tabname. Итак, в операторе Select вы не получите дамп.

person divScorp    schedule 01.05.2018
comment
или более короткий код для создания ссылки на внутреннюю таблицу без использования какого-либо класса RTTS: CREATE DATA lr_data TYPE TABLE OF (lv_tabname). (вместо вашего кода TYPE HANDLE lo_tabtype) ... и на структуру, которая будет: CREATE DATA lr_data TYPE (lv_tabname). (вместо вашего кода TYPE HANDLE lo_struct_type) - person Sandra Rossi; 01.05.2018
comment
@SandraRossi Спасибо за информацию. Но я предпочитаю использовать класс RTTS, потому что, если lv_tabname содержит допустимое имя таблицы или нет. Я думаю, что в стандартных классах это исключение будет обрабатываться. - person divScorp; 01.05.2018
comment
Если lv_tabname недействительно, CREATE DATA возвращает CX_SY_CREATE_DATA_ERROR с атрибутом KERNEL_ERRID, равным константе CREATE_DATA_UNKNOWN_TYPE. Но да, я понимаю, что есть несколько причин использовать вместо этого RTTS. - person Sandra Rossi; 01.05.2018