Как нам удалось сохранить файл локально в фоне? | ABAP

Бизнес задача

Каждый день, утром сформировывать заполненный Excel файл и предоставлять его менеджерам компании.

Условия

Компания работает 24 часа в сутки, менеджерам компании некогда заходить в программу и нажимать на кнопку “Выгрузить файл”.

Решение

Настроить запуск программы на определенное время в фоновом режиме и на ежедневной основе отправлять менеджерам на почту сформированный файл. После того, как в тести столкнулись с ограничениями на размер вложения письма, сначала от SAP (что решилось настройкой) следом от Outlook-а. Было принято решение отойти от писем.

В компании уже была настроена общая сетевая папка для менеджеров, поэтому осталось понять, как соединить формирование файла и выгрузка его с фоновым режимом. Если с формирование файла проблем нет, то выгрузка файла на фронт не работала с фоновым режимом. Но по названию понятно, что нам удалось это сделать, вот так:

  • Формирование файла с помощью ZXLWB_WORKBENCH
  • Сохранение файла на Application Server с помощью OPEN/CLOSE DATASET
  • Копирование файла с Application Server-а в локальную общую папку при помощи вызова внешней команды COPY в SXPG_COMMAND_EXECUTE

Формирование файла

Открываем транзакцию ZXLWB_WORKBENCH, создаем или импортируем готовый шаблон файла Excel, подробную инструкцию по работе с данной транзакцией можно посмотреть здесь: XLSX Workbench

" Вызываем ФМ для получения нашего заполненного шаблона CALL FUNCTION 'ZXLWB_CALLFORM' EXPORTING iv_formname = 'Название_файла' iv_context_ref = lt_data iv_viewer_suppress = 'X' " Без превью файла IMPORTING ev_document_rawdata = lv_document_rawdata " BCOM: поток данных MIME EXCEPTIONS process_terminated = 1 OTHERS = 2. IF sy-subrc <> 0. * MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno * WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.

Сохранение файла на Application Server

Используем конструкцию OPEN/CLOSE DATASET. Которая позволит наш сформированный файл сохранить на апликейшен сервере.

TRY. DATA(lv_path) = 'C:\Путь_из_апликейшена\'. DATA(lv_fullpath) = |{ lv_path }{ 'Название_файла.type' }|. OPEN DATASET lv_fullpath FOR APPENDING IN BINARY MODE. TRANSFER iv_document_rawdata TO lv_fullpath. " iv_document_rawdata это наш файл CLOSE DATASET lv_fullpath. CATCH cx_sy_file_open INTO DATA(lo_file_open). CLOSE DATASET lv_path. MESSAGE lo_file_open->get_text( ) TYPE 'E' DISPLAY LIKE 'I'. CATCH cx_sy_codepage_converter_init INTO DATA(lo_converter_init). CLOSE DATASET lv_path. MESSAGE lo_converter_init->get_text( ) TYPE 'E' DISPLAY LIKE 'I'. CATCH cx_sy_conversion_codepage INTO DATA(lo_codepage). CLOSE DATASET lv_path. MESSAGE lo_codepage->get_text( ) TYPE 'E' DISPLAY LIKE 'I'. CATCH cx_sy_too_many_files INTO DATA(lo_many_files). CLOSE DATASET lv_path. MESSAGE lo_many_files->get_text( ) TYPE 'E' DISPLAY LIKE 'I'. ENDTRY.

Где путь из апликейшена можно посмотреть по транзакции AL11.

Копирование файла с Application Server-а в локальную общую папку

Для того, чтобы использовать команду из вне, нужно её создать в транзакции SM69. Указываем команду CMD /c copy.

Теперь, что бы вызваться нашу команду программно, вызываем ФМ ‘SXPG_COMMAND_EXECUTE’.
Теперь, что бы вызваться нашу команду программно, вызываем ФМ ‘SXPG_COMMAND_EXECUTE’.
lv_param = 'C:\путь_из_апликейшена\Название_файла.type D:\локальная_папка' CALL FUNCTION 'SXPG_COMMAND_EXECUTE' EXPORTING commandname = 'ZCOPY_DOCUMENT' " Name of External Command additional_parameters = lv_param " Arguments for the External Command IMPORTING status = lv_status " Status exitcode = lv_exitcode " Exitcode of External Program TABLES exec_protocol = lt_protocol EXCEPTIONS no_permission = 1 command_not_found = 2 parameters_too_long = 3 security_risk = 4 wrong_check_call_interface = 5 program_start_error = 6 program_termination_error = 7 x_error = 8 parameter_expected = 9 too_many_parameters = 10 illegal_command = 11 wrong_asynchronous_parameters = 12 cant_enq_tbtco_entry = 13 jobcount_generation_error = 14 OTHERS = 15.

Теперь наша программа готова, к тому, чтобы её запускать в фоне и файл будет формироваться в общей папке.

P.S. В моём случае файл из апликейшена после копирования надо удалять, это уже можно сделать с помощью DELETE DATASET или с помощью ФМ ‘EPS_DELETE_FILE’.

11
3 комментария

Удивительно прочитать пост об ABAP на VC!:) Круто, чо.

1
Ответить

Пост мог бы быть и на Хабре, если бы не странные критерии отбора

Ответить

Спасибо, очень круто.

1
Ответить