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

Мне нужно вернуть строки некоторых таблиц через RFC, и имена этих таблиц не известны до выполнения.

У меня есть этот оператор, который выполняется в цикле:

  SELECT *
    up to iv_max_count rows
    into table <lt_result>
    FROM (iv_table_name) AS ltab
    WHERE (SQL_WHERE).

Как я могу объединить <lt_result> результаты в один список / таблицу и вернуть его через RFC?

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


person guettli    schedule 29.03.2019    source источник
comment
Вы можете подумать о редактировании заголовка - вы на самом деле не ищете здесь список таблиц, вы хотите вернуть несколько таблиц, которые неизвестны до времени выполнения.   -  person Bryan Cain    schedule 29.03.2019
comment
@BryanCain Я обновил заголовок. Соответствует ли это теме сейчас?   -  person guettli    schedule 29.03.2019
comment
Я считаю, что это лучше описывает то, что вы пытаетесь сделать, да.   -  person Bryan Cain    schedule 29.03.2019
comment
Почему бы просто не сериализовать строки в XML или JSON?   -  person Sandra Rossi    schedule 30.03.2019
comment
@SandraRossi, вот чем мы сейчас занимаемся. Но я думаю, двоичный RFC лучше, чем ascii (раздутый) JSON.   -  person guettli    schedule 30.03.2019
comment
да. Я предполагаю, что вы можете сжать XML или JSON, чтобы его было легче распаковать, если вы вызываете его из системы, отличной от SAP.   -  person Sandra Rossi    schedule 30.03.2019


Ответы (2)


Вы не можете вернуть произвольную структуру или структуры в RFC, они должны быть предопределены.

Лучший способ, который я могу придумать, - это имитировать то, как SAP обрабатывает idoc в базе данных. Для вашей таблицы потребуется как минимум два поля, первое будет полем дескриптора, сообщающим вызывающему, что такое структура таблицы, а второе поле будет полем очень длинного символьного типа со всеми данными, объединенными вместе, либо фиксированной ширины, либо с разделителями. . Таким образом, вы можете передавать данные из нескольких таблиц в одной и той же возвращаемой структуре.

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

person Bryan Cain    schedule 29.03.2019

Короче говоря, ABAP и функциональные модули работают не так.

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

Если сделать все это динамичным, все станет намного сложнее. В основном без надобности.

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

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

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

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

person futu    schedule 29.03.2019
comment
Я новичок в ABAP. Как определить переменную, которая содержит несколько таблиц? - person guettli; 29.03.2019
comment
Конечно, каждая таблица в цикле может иметь разную структуру. Создание одной большой таблицы, содержащей все строки, не помогает. - person guettli; 29.03.2019