Введение
RCM (record and case management – система управления записями) представляет собой функционал SAP ERP.
Ключевыми объектами, с которыми работает пользователь, являются запись (record) и вариант (case). О том, что такое RCM, описано в статьях разработчиков этого модуля. Один из переводов доступен по ссылке: http://sapland.ru/articles/spj/2014/1/obedinite-vse-vashi-sap-i-nesap-dokumenti-tranzaktsii-rabochie-potoki-i-dannie-s.html .
В упомянутых статьях пояснены базовые термины этого модуля, поэтому мы не будем на них останавливаться; в своей статье я покажу решение конкретной задачи: «Как загрузить файл к варианту (case) - с помощью Z-программы».
Показ ручного присоединения файла к карточке варианта (case)
Пусть у нас имеется настроенный вид варианта с присвоенной моделью, куда предполагается прикрепление файлов.
Для ручного прикрепления файлов нам необходимо зайти в вариант (случай) с помощью транзакции SCASE, открыть его в режиме изменения и перейти к компоненту «Соединённые объекты» (Рис.1).
Рис.1 Компонент "Соединённые объекты" тестового варианты (случая)
Для ручного добавления нам нужно щёлкнуть мышью по «серому» общему элементу «Элем.рабочего списка», затем выбрать вид элемента, назначенный сервис-провайдеру SCMG_SP_DOCUMENT (этот сервис-провайдер отвечает за приложения к варианту в модели варианта). В моем примере вид элемента называется «Документы SCM» (Рис.2).
Рис.2 Выбор вида элемента, соответствующего сервис-провайдеру SCMF_SP_DOCUMENT
После выбора элемента система откроет следующий экран, где мы можем указать тип нашего приложения. Для загрузки, например, pdf-документов следует выбирать пункт «Из файла».
Рис.3 Выбор типа приложения для загрузки pdf-документа к варианту (случаю)
Затем мы указываем путь к файлу на компьютере, система открывает ещё один экран, где мы можем задать атрибуты файла; после заполнения обязательных (краткое описание и название), нажимаем ENTER (also known as “зелёная галочка”) и система прикрепляет файл к варианту (случаю).
Рис.4 Окно "Создание атрибутов" при загрузке файла к варианту/case
Система откроет файл в режиме просмотра и предоставит полный перечень возможностей интерфейса SCASE по работе с ним[приложенным файлом].
Рис.5 Просмотр pdf-документа в карточке случая
Рис.6 Загруженный файл к случаю
Однако меня заинтересовал вопрос: можно ли создать Z-программу, в которой указать путь к файлу на ПК и GUID-случая; и по нажатию кнопки «выполнить» получить приложенный файл к варианту (случаю)?
Ответ положительный, но возникает другой вопрос: как эта программа должна выглядеть?
Написание Z-программы для загрузки файла к варианту (случаю)
Во-первых, стоит отметить, что документации «howto» по RCM, по сравнению, например, с WDA-разработкой, документацией к модулю SD, относительно мало. Имеется курс BIT640, в котором объект CASE не описывается, а указывается, что CASE есть частный случай объекта RECORD; этого недостаточно. Более того, книга по RCM, выпущенная издательством SAP-PRESS, больше не продаётся с официального сайта. В итоге имеем три основных источника: статьи разработчиков (которые я указал), знания «из уст в уста», отладчик/анализ кода.
Анализируя код, приходим к выводу, что у нас несколько пакетов, объекты которых могут нам помочь: SCMG (со всеми вложенными пакетами), FINB_DISPUTE_MANAGEMENT (со всеми вложенными субпакетами), SRM_BAPI_DOCUMENT (и вообще весь пакет SRM).
Также в репозитарии бизнес-объектов (транзакция SWO1) имеется 2 объекта: RECORD и CASE.
В конечном счёте, выходим на 4 ФМ:
1) SRM_DOCUMENT_CREATE,
2) SRM_DOCUMENT_CHECKIN_VIA_TAB,
3) BAPI_CASE_ADDELEMENTS,
4) UDM_BD_CREATE_ATTACHMENT (наиболее общий, объединяется два 1ых).
Наиболее обобщённым ФМ (для которого нужно минимум дополнительного кода) представляется ФМ UDM_BD_CREATE_ATTACHMENT).
При первой попытке использовать стандартный ФМ UDM_BD_CREATE_ATTACHMENT система генерит Runtime Error. Анализ его кода показал мне, по крайней мере, два «странных» момента:
Момент первый: почему система должна переопределять тип приложения, если она его определила на шаге выше?
Выдержка кода из ФМ UDM_BD_CREATE_ATTACHMENT (стр. 173 - 184)
|
SELECT * FROM toadd INTO TABLE i_toadd
WHERE mimetype = ls_components-mimetype.
IF sy-subrc ne 0.
l_mime = ls_components-mimetype.
ELSE.
l_mime = 'text/x-doctype'. "#EC NOTEXT
ENDIF.
|
Момент второй: поле Anchor/Якорь при создании модели является свободно заполняемым, а в этом ФМ для выбора Якоря указан hard-code, который может не совпадать с моим Anchor в модели случая.
Выдержка кода из ФМ UDM_BD_CREATE_ATTACHMENT (стр. 278 - 290)
|
try.
CALL METHOD lref_rec->element_add_by_anchor
EXPORTING
anchor = 'BDATT'
element = lref_element.
catch CX_SRM_SP_RECORD.
CALL METHOD lref_rec->element_add_by_anchor
EXPORTING
anchor = '#INITIAL#'
element = lref_element.
endtry
|
Вывод: в целом ФМ выглядит работоспособным, однако лучше создать свою группу функций на основе UDM_ATTACHMENTS (она небольшая). После этого исправим код для наших нужд.
Программа по загрузки файла к случаю RCM
|
REPORT Z_TEST3.
types: BEGIN OF t_component ,
comp_count TYPE bapipos,
comp_id TYPE bapidocid,
mimetype TYPE bapimimetype,
comp_size TYPE bapipos,
binary_flag TYPE bapigsbool,
comp_num TYPE bapipos,
END OF t_component.
data: lv_doc_guid TYPE SCMG_CASE_GUID
, lv_doc_id TYPE string
, gt_elem_id TYPE STANDARD TABLE OF BAPIPROPME
, gt_elem_insert TYPE STANDARD TABLE OF BAPIDOCINS
, gs_elem_id TYPE BAPIPROPME
, gs_elem_insert TYPE BAPIDOCINS
, gt_return TYPE STANDARD TABLE OF BAPIRET2
, gs_return TYPE BAPIRET2
, g_encode TYPE ABAP_ENCODING
, rv_failed TYPE C LENGTH 1
.
DATA : l_file TYPE string,
lv_xstring TYPE xstring,
l_return TYPE bapiret2,
l_filecontent TYPE bapiconten,
i_case TYPE REF TO if_scmg_case_api,
l_initial_dir TYPE string,
l_window_title TYPE string,
l_filename_disp TYPE string,
l_filename_string TYPE string,
l_user_action TYPE i,
l_rc TYPE i,
l_v_lines TYPE i,
l_mime TYPE skwf_mime,
l_filelength TYPE i,
l_component TYPE bapidoccomp,
l_skwf_filnm TYPE skwf_filnm,
li_file_tab TYPE filetable,
lwa_file_tab TYPE file_table,
li_bin_content TYPE STANDARD TABLE OF bapiconten,
l_v_size TYPE i.
data: i_component TYPE STANDARD TABLE OF t_component.
DATA: lo_case_api TYPE REF TO cl_scmg_case_api,
lo_case_api_intf TYPE REF TO if_scmg_case_api.
DATA: l_if_case_api TYPE REF TO if_scmg_case_api.
l_if_case_api ?= lo_case_api.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
PARAMETER : l_fname TYPE char255
, p_case TYPE SCMG_CASE_GUID
, p_name TYPE C LENGTH 40 OBLIGATORY
.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR l_fname.
l_window_title = 'Upload Document'(001).
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = l_window_title
initial_directory = l_initial_dir
WITH_ENCODING = abap_true
CHANGING
file_table = li_file_tab
rc = l_rc
user_action = l_user_action
FILE_ENCODING = g_encode
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc = 0.
READ TABLE li_file_tab INTO lwa_file_tab INDEX 1.
IF sy-subrc = 0.
l_file = lwa_file_tab-filename.
l_fname = lwa_file_tab-filename.
ENDIF.
ENDIF.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
START-OF-SELECTION.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = l_file
FILETYPE = 'BIN'
IMPORTING
FILELENGTH = l_v_size
TABLES
data_tab = li_bin_content
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
l_skwf_filnm = l_file.
CALL FUNCTION 'SKWF_MIMETYPE_OF_FILE_GET'
EXPORTING
filename = l_skwf_filnm
" X_USE_LOCAL_REGISTRY =
IMPORTING
mimetype = l_mime.
l_component-comp_count = 1.
l_component-comp_id = l_fname.
l_component-mimetype = l_mime.
l_component-comp_size = l_v_size.
l_component-binary_flag = 'X'.
l_component-comp_num = 1.
APPEND l_component TO i_component.
CALL METHOD cl_scmg_case_api=>if_scmg_case_api~open_case
EXPORTING
im_case_guid = p_case
im_enqueue = 'X'
RECEIVING
re_case = lo_case_api_intf
EXCEPTIONS
failed = 1
enqueue_failed = 2
invalid_guid = 3
cx_srm_gsp_back = 4
OTHERS = 5.
lo_case_api ?= lo_case_api_intf.
*
*
CALL METHOD cl_scmg_case_api=>IF_SCMG_CASE_API~OPEN_CASE
EXPORTING
im_case_guid = p_case
RECEIVING
re_case = l_if_case_api
EXCEPTIONS
failed = 1
enqueue_failed = 2
invalid_guid = 3
cx_srm_gsp_back = 4
no_authority = 5
OTHERS = 6.
CALL FUNCTION 'Z_BD_CREATE_ATTACHMENT' " вместо UDM_BD_CREATE_ATTACHMENT
EXPORTING
i_guid = p_case
i_case = lo_case_api
i_testrun = space
IMPORTING
E_GUID_DOC = lv_doc_guid
E_DIC_ID = lv_doc_id
TABLES
bin_content = li_bin_content
components = i_component
CHANGING
es_return = l_return.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
CALL FUNCTION 'DEQUEUE_ALL'.
IF 1 = 1. " для двойного прикрепления файла – в квази стандратном функцию вставки элемента принудительно отключил – не по нраву пришлась реализация
CLEAR: gt_elem_id, gt_elem_insert, gs_elem_id, gs_elem_insert, gt_return.
gs_elem_id-elem_no = 1.
gs_elem_id-name = 'VERSION'.
gs_elem_id-value = '0'.
APPEND gs_elem_id to gt_elem_id.
gs_elem_id-elem_no = 1.
gs_elem_id-name = 'VARIANT'.
gs_elem_id-value = '0'.
APPEND gs_elem_id to gt_elem_id.
gs_elem_id-elem_no = 1.
gs_elem_id-name = 'DOC_ID'.
gs_elem_id-value = lv_doc_id.
APPEND gs_elem_id to gt_elem_id.
"%SPS_ID%
gs_elem_id-elem_no = 1.
gs_elem_id-name = '%SPS_ID%'.
gs_elem_id-value = 'Z_SPS_DOCUMENT'. " имя вида элемента
APPEND gs_elem_id to gt_elem_id.
gs_elem_insert-elem_no = 1.
gs_elem_insert-anchor = '*'.
gs_elem_insert-description = p_name.
IF gs_elem_insert-description is INITIAL.
gs_elem_insert-description = 'test_pdf'.
ENDIF.
APPEND gs_elem_insert to gt_elem_insert.
CALL FUNCTION 'BAPI_CASE_ADDELEMENTS'
EXPORTING
GUID = p_case
* SKIP_ERRORS =
* NEW_VERSION =
TABLES
ELEMENT_IDENTIFICATION = gt_elem_id
|
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
Зарегистрироваться
У вас уже есть учетная запись?
Войти
Обсуждения 1
Комментарий от
Пётр Ромащенко
| 11 мая 2017, 15:18