#abap #saprfc #opensql #function-module
#abap #saprfc #opensql #функция-модуль
Вопрос:
Мне нужно вернуть строки некоторых таблиц через RFC, и имена этих таблиц неизвестны до выполнения.
У меня есть этот оператор, который выполняется в цикле:
SELECT *
up to iv_max_count rows
into table <lt_result>
FROM (iv_table_name) AS ltab
WHERE (SQL_WHERE).
Как я могу объединить <lt_result>
результаты в один список / таблицу и вернуть это через RFC?
Конечно, все таблицы могут иметь разные структуры. Создание одной большой таблицы, которая содержит все строки, не помогает.
Комментарии:
1. Вы могли бы рассмотреть возможность редактирования заголовка — на самом деле вы не ищете здесь список таблиц, вы хотите передать несколько таблиц обратно, которые неизвестны до выполнения.
2. @BryanCain Я обновил заголовок. Соответствует ли это теме сейчас?
3. Я считаю, что это лучше описывает то, что вы пытаетесь сделать, да.
4. Почему бы просто не сериализовать строки в XML или JSON?
5. @SandraRossi именно этим мы сейчас и занимаемся. Но я думаю, что двоичный RFC лучше, чем ascii (раздутый) JSON.
Ответ №1:
Вы не можете вернуть произвольную структуру или структуры в RFC, они должны быть предопределены.
Лучший способ, который я могу придумать для этого, — имитировать способ, которым SAP обрабатывает idoc в базе данных. Вашей таблице потребуется минимум два поля, первое будет полем дескриптора, сообщающим вызывающему объекту, какова структура таблицы, а второе поле будет очень длинным полем символьного типа со всеми данными, объединенными вместе, либо фиксированной шириной, либо с разделителями. Таким образом, вы могли бы передавать данные из нескольких таблиц в одной и той же возвращаемой структуре.
Если ваша вызывающая программа действительно ничего не знает о наборах данных SAP, вам, вероятно, также потребуется захватить метаданные из таблицы DD02l.
Ответ №2:
Короче говоря, ABAP и функциональные модули работают не так.
Вы должны точно определить, каковы ваши входные данные и как выглядит ваша структура вывода / таблица. Вы можете вернуть одну структуру, содержащую несколько глубоко вложенных таблиц, чтобы иметь только одну возвращаемую структуру, но не динамически!
Динамическое выполнение всего этого значительно усложняет задачу. В основном без необходимости.
Один из возможных способов:
- вы должны проанализировать входные данные и построить динамические структуры и таблицы для каждого результата входной таблицы
- создайте структуру переноса, состоящую из всех вложенных таблиц
- возвращать объект ссылки на ДАННЫЕ, поскольку вы не можете возвращать общие типы данных
- в вашей принимающей программе должны быть определены те же структуры данных, это означает, что она должна точно знать, что она получает обратно, чтобы отложить данные.
Другой способ: использовать функциональный модуль RFC_READ_TABLE
в цикле в вызывающей программе
Динамическое чтение нескольких отдельных таблиц в цикле без объединения не похоже на программирование ABAP, скорее похоже на «мне нужны данные из SAP в стороннем инструменте».
Комментарии:
1. Я новичок в ABAP. Как определить переменную, которая содержит несколько таблиц?
2. Конечно, каждая таблица в цикле может иметь разную структуру. Создание одной большой таблицы, которая содержит все строки, не помогает.