Возвращать динамически типизированные строки таблицы через RFC?

#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 и функциональные модули работают не так.

Вы должны точно определить, каковы ваши входные данные и как выглядит ваша структура вывода / таблица. Вы можете вернуть одну структуру, содержащую несколько глубоко вложенных таблиц, чтобы иметь только одну возвращаемую структуру, но не динамически!

Динамическое выполнение всего этого значительно усложняет задачу. В основном без необходимости.

Один из возможных способов:

  1. вы должны проанализировать входные данные и построить динамические структуры и таблицы для каждого результата входной таблицы
  2. создайте структуру переноса, состоящую из всех вложенных таблиц
  3. возвращать объект ссылки на ДАННЫЕ, поскольку вы не можете возвращать общие типы данных
  4. в вашей принимающей программе должны быть определены те же структуры данных, это означает, что она должна точно знать, что она получает обратно, чтобы отложить данные.

Другой способ: использовать функциональный модуль RFC_READ_TABLE в цикле в вызывающей программе

Динамическое чтение нескольких отдельных таблиц в цикле без объединения не похоже на программирование ABAP, скорее похоже на «мне нужны данные из SAP в стороннем инструменте».

Комментарии:

1. Я новичок в ABAP. Как определить переменную, которая содержит несколько таблиц?

2. Конечно, каждая таблица в цикле может иметь разную структуру. Создание одной большой таблицы, которая содержит все строки, не помогает.