Перегрузка содержимого таблиц между SAP системами по RFC

Зачастую при разработке возникает проблема формирования тестовых примеров. Эта статья поможет легко и быстро перекидывать данные из продуктивной системы в тестовую или в разработку и обратно, если между системами настроен RFC.

Принципы работы

Принцип работы очень простой. Соединение RFC позволяет вызвать ФМ, который находится в другой системе и получить от него результаты работы. Все что необходимо это придумать способ разбиения данных на пакеты(если данных слишком много, то можно словить дамп по нехватке памяти) и воспользоваться возможностями динамического программирования для унифицированного решения.

Реализация функционального модуля для вызова по RFC

Начнем с ФМ, полный код представлен ниже

Функциональный модуль на вход получает

  • Название таблицы из которой нужно взять данные — TAB_NAME
  • Номер пакета (необходимо для больших сетов данных) — PACKAGE_NUMBER
  • Количество забираемых записей в одном пакете — PACK_SIZE
  • Условия выборки — WHERE_STATEMENT

Соответственно возвращает 2 параметра

  • Результат в формате json — JSON_RESULT
  • статус считывания — STATUS

Алгоритм работы следующий

  1. Динамически создается таблица
  2. Считывается константа — всего количество строк для выбранного условия (WHERE_STATEMENT).
  3. Считываются данные. Тут нужно отметить, что на считывание влияют параметры пакета и размера пакета. К сожалению ABAP не позволяется асинхронно возвращать данные. В любом случаи, например при обратном вызове RFC модуля, произойдет не явный коммит. По этому придется мериться с тем, что при очень больших сетах данных для поиска нужного пакета данных, нам придется перебрать все предыдущие пакеты т.е. по новой их считывать. Однако если Вам не нужно перекидывать сотни миллионов записей таким способом, то проблем с быстродействием возникнуть не должно. При переборе пакетов, нужный пакет вычисляется при помощи итератора (number), он должен совпадать с тем, что было передано в ФМ. Так как изначально нам никогда не известно сколько записей мы будем перекидывать между системами. Последний пакет мы будем высчитывать по формуле.
  4. Конвертируем внутреннюю таблицу в json строку, для этого используем стандартные методы.

Так же стоит отметить, что параметр STATUS должен быть пустым либо до тех пор пока не будет передан последний пакет, либо до поимки какой-то ошибки в качестве исключения.

Итак, мы написали ФМ для передачи данных в формате json. Но этот вариант не самый оптимальный. Так как мы передаем строку, то есть более экономный формат — CSV.

К сожалению стандартных способов конвертирования в CSV, когда писал этот алгоритм, я не нашел. По этому написал свой метод.

Вариант с CSV

Данный вариант работает точно так же, только преобразование производится в CSV. И раз уж речь зашла об оптимизации размера передаваемых данных, в конце производится архивирование строки. Обратите внимание в этом варианте обратно передается не строка, а XSTRING, байтовые данные.

Вызов модуля

Далее нам нужно написать программу для вызова этих модулей.

Селекционный экран

Алгоритм работы простой. По данным с селекционного экрана запускается выбранный функциональный модуль. Модуль запускается по RFC в другой системе. Пришедшие данные преобразовываются и ложатся во внутреннюю таблицу, затем сохраняются в базу данных.

ФМ вызывается до тех пор, пока статус не вернет что-то, while status is initial.

В текущем решении я бы рекомендовал использовать максимальный размер одного пакета, который сможет выдержать Ваш сервер приложения. Так же, функцию «с удалением» я бы тоже рекомендовал использовать с осторожностью.

В заключении

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *