Возвращать строки таблиц, известные во время выполнения только через RFC - PullRequest
3 голосов
/ 29 марта 2019

Мне нужно вернуть строки некоторых таблиц через RFC.

Имена таблиц не известны до выполнения.

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 29 марта 2019

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

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

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

1 голос
/ 29 марта 2019
APPENDING [CORRESPONDING FIELDS OF] TABLE

вместо INSERT TABLE

РЕДАКТИРОВАТЬ относительно вашего редактирования:

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

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

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

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

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

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

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

...