Mime репозиторий - как верный помощник консультанта

Стоит правда оговориться, что не только консультанта, но и программиста, который будет работать с консультантом.

О чем вообще тут пойдет речь?

Mime репозиторий - стандартное хранилище различного типа файлов, предназначенное под разные нужды.

См. MIME Repository MIME Repository Purpose The MIME Repository serves as storage for all MIME objects (for example, PDF files, images, ZIP files and so on) in a SAP system. The MIME objects are stored as development objects in the SAP database and are represented in the MIME Repository as a hierarchy of items and folders.

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

См. MIME Repository
Features For each Web Dynpro ABAP or BSP application, the system automatically creates an identically-named folder in the MIME Repository, which stores only application-specific MIME objects. The folder /SAP/PUBLIC contains MIME objects that can be used by multiple software components:

  • MIME objects accessible to all BSP applications are available at /SAP/BC/BSP/[namespace]/PUBLIC.
  • MIME objects accessible to all Web Dynpro applications are available at /SAP/BC/WebDynpro/[namespace]/PUBLIC.

Помимо различных изображений и документов, в репозитории можно хранить и исполняемые файлы (application/octet-stream)

См. Supported MIME Types

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

1. Создание утилиты

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

Рисунок 1.

2. Загрузка в MIME репозиторий

Доступ в MIME репозиторий можно получить из транзакции SE80, выбрав одноименный раздел

Рисунок 2.

Выберите директорию, где будут лежать нужные вам файлы

См. Creating Folders

Я буду использовать следующий путь SAP -> PUBLIC -> zdemo. Кликните правой кнопкой мыши по только что созданной папке и выберите в контекстном меню Import MIME Objects

Рисунок 3.

Выберите файл для импорта и сохраните его в системе (в моем случае также необходимо согласиться с тем, что используемый мной тип файла несколько отличается от удобоваримых для SAP)

Рисунок 4.

3. Абапим

Ничего комментировать здесь не буду. Допустим


REPORT zmime_demo.
 
CONSTANTS:
  c_filename TYPE string VALUE 'test.py',
  mim_value  TYPE string VALUE 'zdemo'.
 
DATA:
  lo_api      TYPE REF TO if_mr_api,
  lv_mime     TYPE string,
  lv_xdata    TYPE xstring,
  lv_path     TYPE string,
  lv_fpath    TYPE string,
  lv_length   TYPE i,
  lt_file_tab TYPE solix_tab,
  iv_file     TYPE xstring.
 
PARAMETERS: p_run TYPE c1.
 
CASE p_run.
 
  WHEN 'Y'.
    CONCATENATE 'SAP/PUBLIC/zdemo/' c_filename INTO lv_mime.
    lv_path = 'C:\Temp'.
    CONCATENATE lv_path '\' mim_value '\' c_filename INTO lv_path.
 
    IF cl_gui_control=>gui_is_running IS INITIAL.
      " some message here...
      RETURN.
    ENDIF.
 
    lo_api = cl_mime_repository_api=>if_mr_api~get_api( ).
 
    CALL METHOD lo_api->get
      EXPORTING
        i_check_authority  = abap_false
        i_url              = lv_mime
      IMPORTING
        e_content          = lv_xdata
      EXCEPTIONS
        parameter_missing  = 1
        error_occured      = 2
        not_found          = 3
        permission_failure = 4
        OTHERS             = 5.
    IF sy-subrc <> 0.
      " message
      RETURN.
    ENDIF.
 
    iv_file = lv_xdata.
 
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer        = iv_file
      IMPORTING
        output_length = lv_length
      TABLES
        binary_tab    = lt_file_tab.
    IF lt_file_tab IS INITIAL OR lv_length <= 0.
      RETURN.
    ENDIF.
 
    CALL METHOD cl_gui_frontend_services=>gui_download
      EXPORTING
        filename                = lv_path
        filetype                = 'BIN'
        bin_filesize            = lv_length
      CHANGING
        data_tab                = lt_file_tab
      EXCEPTIONS
        file_write_error        = 1
        no_batch                = 2
        gui_refuse_filetransfer = 3
        invalid_type            = 4
        no_authority            = 5
        unknown_error           = 6
        header_not_allowed      = 7
        separator_not_allowed   = 8
        filesize_not_allowed    = 9
        header_too_long         = 10
        dp_error_create         = 11
        dp_error_send           = 12
        dp_error_write          = 13
        unknown_dp_error        = 14
        access_denied           = 15
        dp_out_of_memory        = 16
        disk_full               = 17
        dp_timeout              = 18
        file_not_found          = 19
        dataprovider_exception  = 20
        control_flush_error     = 21
        not_supported_by_gui    = 22
        error_no_gui            = 23
        OTHERS                  = 24.
    IF sy-subrc <> 0.
      RETURN.
    ENDIF.
 
    CALL METHOD cl_gui_frontend_services=>execute
      EXPORTING
        document               = lv_path
      EXCEPTIONS
        cntl_error             = 1
        error_no_gui           = 2
        bad_parameter          = 3
        file_not_found         = 4
        path_not_found         = 5
        file_extension_unknown = 6
        error_execute_failed   = 7
        synchronous_failed     = 8
        not_supported_by_gui   = 9
        OTHERS                 = 10.
    IF sy-subrc <> 0.
      RETURN.
    ENDIF.
  WHEN 'N'.
    WRITE:/ 'No external scripts here'.
 
ENDCASE.


    

4. Тестируем

Тест будет проходить в несколько этапов:

  • Проверяю, что директория, куда должен выгрузиться файл пустая;
  • Запускаю ABAP-программу с параметром, при котором не будет выгружен скрипт. Проверяю, что данные условия выполнены;
  • Запускаю ABAP-программу с параметром, при котором будет выгружен и запущен скрипт. Проверяю, что данные условия выполнены;

Как всегда, с любовью. Обнимаю, ignatov.