Меню

Загрузка файла в RCM-case с помощью Z-программы

|

RCM (record and case management – система управления записями) представляет собой функционал SAP ERP. В данной статье описано решение конкретной задачи: «Как загрузить файл к варианту (case) - с помощью Z-программы».

Введение

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

Большое спасибо за отличный и ценный материал!