Динамический выбор данных из нескольких таблиц в ABAP - PullRequest
0 голосов
/ 30 апреля 2018

В моей программе есть выпадающий список, в котором я ввел имена разных таблиц. Поэтому я работал с 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.

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

Ответы [ 2 ]

0 голосов
/ 01 мая 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 вы не получите дамп.

0 голосов
/ 30 апреля 2018

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

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) Все зависит от ваших конкретных потребностей.

...