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

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

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

Я не понимаю - чего вы пытаетесь достичь? Зачем вам работать с оператором REPLACE? Введите REPLACE в SE80 и нажмите F1 ...

dotchuZ 30.04.2018 14:58

что бы вы предпочли? Я хочу, чтобы мой раскрывающийся список работал, чтобы я мог выбирать из разных таблиц.

Sanakoyan 30.04.2018 15:00

Бесполезен из-за разных типов таблиц ...

dotchuZ 30.04.2018 18:13

Один пример: KNA1 и LFA1 (и связанные структуры) действительно похожи и могут иметь идентичную обработку для получения некоторых данных. Однако практическая польза от этого редко бывает полезной из-за объема дополнительной работы. Обычно проще сделать 2 выбора или использовать if,elseif.. для разветвления логики процесса. С учетом сказанного, некоторый контекст того, чего вы пытаетесь достичь, определенно поможет нам дать вам ответ. Само по себе динамическое выделение вам не очень поможет, потому что вам также нужна динамическая обработка данных.

Zero 16.05.2018 15:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
7 470
2
Перейти к ответу Данный вопрос помечен как решенный

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

Если нужен более общий доступ, проверьте это ссылка для предотвращения атак с использованием SQL-инъекций.

Sandra Rossi 01.05.2018 09:02

В ответе 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)

Sandra Rossi 01.05.2018 13:46

@SandraRossi Спасибо за информацию. Но я предпочитаю использовать класс RTTS, потому что, если lv_tabname содержит допустимое имя таблицы или нет. Я думаю, что в стандартных классах это исключение будет обрабатываться.

divScorp 01.05.2018 14:10

Если lv_tabname недействителен, CREATE DATA возвращает CX_SY_CREATE_DATA_ERROR с атрибутом KERNEL_ERRID, равным константе CREATE_DATA_UNKNOWN_TYPE. Но да, я понимаю, что есть несколько причин использовать вместо этого RTTS.

Sandra Rossi 01.05.2018 14:50

Другие вопросы по теме