У меня есть выпадающий список в моей программе, в который я ввел названия разных таблиц. Итак, я работал с 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.
Каков синтаксис замены имен таблиц? Я знаю, что операторы замены работают только со строками, но есть ли способ обойтись?
что бы вы предпочли? Я хочу, чтобы мой раскрывающийся список работал, чтобы я мог выбирать из разных таблиц.
Бесполезен из-за разных типов таблиц ...
Один пример: KNA1 и LFA1 (и связанные структуры) действительно похожи и могут иметь идентичную обработку для получения некоторых данных. Однако практическая польза от этого редко бывает полезной из-за объема дополнительной работы. Обычно проще сделать 2 выбора или использовать if,elseif..
для разветвления логики процесса. С учетом сказанного, некоторый контекст того, чего вы пытаетесь достичь, определенно поможет нам дать вам ответ. Само по себе динамическое выделение вам не очень поможет, потому что вам также нужна динамическая обработка данных.
Вы можете динамически выбирать из таблицы:
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)
Все зависит от ваших конкретных потребностей.
Если нужен более общий доступ, проверьте это ссылка для предотвращения атак с использованием SQL-инъекций.
В ответе 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 вы не получите дамп.
или более короткий код для создания ссылки на внутреннюю таблицу без использования какого-либо класса 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)
@SandraRossi Спасибо за информацию. Но я предпочитаю использовать класс RTTS, потому что, если lv_tabname
содержит допустимое имя таблицы или нет. Я думаю, что в стандартных классах это исключение будет обрабатываться.
Если lv_tabname недействителен, CREATE DATA возвращает CX_SY_CREATE_DATA_ERROR с атрибутом KERNEL_ERRID, равным константе CREATE_DATA_UNKNOWN_TYPE. Но да, я понимаю, что есть несколько причин использовать вместо этого RTTS.
Я не понимаю - чего вы пытаетесь достичь? Зачем вам работать с оператором REPLACE? Введите REPLACE в SE80 и нажмите F1 ...