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)
Допускаем, что перед вами стоит задача интеграции системы SAP с каким-нибудь внешним устройством, подключенным к локальной рабочей машине пользователя, либо к сетевому ресурсу. Необходимо "забрать" какую-то информацию с этого устройства и сохранить в системе. Сделать это напрямую из SAP не представляется возможным, но возможно выполнить с помощью сторонней утилиты, которая, после того как будет выгружена на локальную машину пользователя, работающего в системе SAP, выполнит свое предназначение и затем самоустранится. Ну или как-то так. Ниже представлено описание нескольких пунктов в качестве возможной реализации данного сценария.
1. Создание утилиты
В примере для этой заметки я воспользуюсь примитивным скриптом, скажем, на Python, следующего содержания:
2. Загрузка в MIME репозиторий
Доступ в MIME репозиторий можно получить из транзакции SE80, выбрав одноименный раздел
Выберите директорию, где будут лежать нужные вам файлы
См. Creating Folders
Я буду использовать следующий путь SAP -> PUBLIC -> zdemo. Кликните правой кнопкой мыши по только что созданной папке и выберите в контекстном меню Import MIME Objects
Выберите файл для импорта и сохраните его в системе (в моем случае также необходимо согласиться с тем, что используемый мной тип файла несколько отличается от удобоваримых для SAP)
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.