Комментарии по теме

«Опти­ми­за­ция орга­ни­за­ци­о­нной эффе­кти­вно­сти с помощью 10 функций упра­вле­ния до­ку­ме­нта­ми в SAP-си­сте­ме»
Сергей Софронов:
Документационная поддержка бизнес-процессов, безусловно, является одним из важных вопросов, возникающих при внедрении ERP-системы. Практически на каждом проекте внедрения мы сталкиваемся с этой...
«Опти­ми­за­ция орга­ни­за­ци­о­нной эффе­кти­вно­сти с помощью 10 функций упра­вле­ния до­ку­ме­нта­ми в SAP-си­сте­ме»
Андрей Емельянов:
Всем привет! Спасибо за статьи. По ходу прочтения у меня возникли мысли о том как избежать проблем согласования документов на распределённых и гетерогенных платформах, а так же о том как не...

База знаний

Методика создания DMS-документа посредством BAPI

639

Оглавление

Введение

Создание прототипа

Создание нового вида документа

Создание прототипа DMS-документа

Работа над ошибками и проверка корректности процесса

Работа с оригиналами документа

Прикрепление файла расположенного на стороне клиента

Прикрепление файла расположенного на сервере

Удаление оригинала документа

Получение содержимого оригинала документа

Введение

В SAP ERP можно найти такой компонент, как DMS (Document Management System или Система управления документами). DMS позволяет избежать избыточности данных и минимизировать рабочую нагрузку при обновлении и обмене данными. Система управления документами, предназначенная для создания, хранения, изменения и просмотра документов доступна через транзакции: CV01N, CV02N, CV03N.

В статье рассмотрим на примере методику автоматического создания прототипа DMS-документа и прикрепления оригинала к нему.

Создание прототипа

Создание нового вида документа

Если требуется создать новый вид документа - заходим в SPRO и в строке поиска вводим:

"Определение видов документов" (в англ. варианте "Define Document Type") (Рисунок 1).

Рисунок 1 – Поиск в структуре

В списке совпадений находим "Система управления документами" (или "Document management system") (Рисунок 2):

Рисунок 2 – Окно списка совпадений

После чего произойдет позиционирование на нашем элементе (Рисунок 3):

Рисунок 3 – IMG-операция «Определение видов документов» в структуре

Затем кликаем на иконку с часами и попадаем на экран определения видов документов.

Инструмент также доступен из транзакции DC10, но запуск через SPRO предпочтителен, потому как в этом случае будет автоматически создан настроечный запрос с записью IMG-операции.

Рисунок 4 – «Определение видов документов»

Рисунок 5 – Создание нового вида документа

В открывшемся окне (Рисунок 4) в строке инструментов нажимаем на «Новые записи» (Рисунок 5).

Далее, кликаем на подпункт "Описание зависящих от языка видов документов", где указываем требуемые данные для языка (Рисунок 6).

Рисунок 6 Описание вида документа для языка.

Создание прототипа DMS-документа

Для создания прототипа DMS-документа будем использовать BAPI_DOCUMENT_CREATE2. Пример:

    DATA:

          ls_document      TYPE bapi_doc_aux,

          ls_return        TYPE bapiret2,

          ls_document_in   TYPE bapi_doc_draw2.

    ls_document_in-documenttype = 'ZTS'.

    ls_document_in-description = 'Документ для теста'.

    ls_document_in-username = sy-uname.

    CALL FUNCTION 'BAPI_DOCUMENT_CREATE2'

      EXPORTING

        documentdata    = ls_document_in

      IMPORTING

        documenttype    = ls_document-doctype

        documentnumber  = ls_document-docnumber

        documentpart    = ls_document-docpart

        documentversion = ls_document-docversion

        return          = ls_return.

На вход ФМ «BAPI_DOCUMENT_CREATE2» подается:

  • documentdata - структура типа bapi_doc_draw2, где требуется заполнение минимум одного поля - типа документа – documenttype.
  • pf_ftp_dest - логический адрес назначения, ставим константу 'SAPFTPA' (опционально).
  • pf_http_dest - передаем константу 'SAPHTTP' (опционально).

Работа над ошибками и проверка корректности процесса

ФМ должен вернуть информацию о созданном документе в структуре LS_DOCUMENT или информацию об ошибке в LS_RETURN, если что-то пошло не так.

Если ошибки нет (LS_RETURN-TYPE <> 'E'), выполняем COMMIT, чтобы изменения вступили в силу или, в противном случае, откатываем изменения. Пример:

IF ls_return-type NE 'E'.

  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

    EXPORTING

      wait = 'X'.

ELSE.

  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .

ENDIF.

После COMMIT проверяем успешность создания через транзакцию CV02N, с указанием типа LS_DOCUMENT-DOCTYPE и номера LS_DOCUMENT-DOCNUMBER документа. Где можем убедиться, что документ создан (Рисунок 7).

Рисунок 7 – Просмотр созданного документа

Может так случиться, что LS_RETURN вернет ошибку(E 26 068): «Сетевой адрес DEFAULT вашей ЭВМ не определен» (англ. "Network address DEFAULT of your computer is not maintained").

В этом случае, требуется задать тип носителя данных в транзакции DC20, например, как показано на следующей серии рисунков (Рисунок 8, Рисунок 9, Рисунок 10).

Рисунок 8 – Определение типа носителя данных для внешнего интерфейса

Рисунок 9 – Указание носителя данных

Рисунок 10 – Идентификация компьютеров внешнего интерфейса

Прикрепление оригинала к прототипу

Прикрепление файла, расположенного на стороне клиента

Далее приступим к прикреплению оригинала к созданному прототипу документа. Для этого, используем ФМ BAPI_DOCUMENT_CHANGE2.

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

Перед вызовом BAPI_DOCUMENT_CHANGE2 для загрузки оригинала можно проверить наличие документа, тип и номер которого следует передать на вход ФМ. Для этого следует использовать BAPI_DOCUMENT_GETDETAIL2. Пример:

DATA: lt_files         TYPE TABLE OF bapi_doc_files2.

CALL FUNCTION 'BAPI_DOCUMENT_GETDETAIL2'

  EXPORTING

    documenttype    = ls_document-doctype

    documentnumber  = ls_document-docnumber

    documentpart    = ls_document-docpart

    documentversion = ls_document-docversion

    getdocfiles     = 'X'

  IMPORTING

    documentdata    = ls_document_in

    return          = ls_return

  TABLES

    documentfiles   = lt_files.

На вход подаются поля типа документа DOCUMENTTYPE и его номера DOCUMENTNUMBER из структуры LS_DOCUMENT, полученной на выходе BAPI_DOCUMENT_CREATE2, при создании DMS. Выставление флага GETDOCFILES, дает возможность увидеть в таблице LT_FILES уже имеющиеся оригиналы в документе.

В случае успеха, BAPI вернет пустую структуру LS_RETURN и структуру LS_DOCUMENT_IN с заполненными данными документа.

Если файл, требующий загрузки, находится на стороне клиента. Загрузка оригинала так, как показано ниже.

DATA:

  lt_file_table TYPE filetable,

  lv_filename   TYPE string,

  lv_rc         TYPE i.

CALL METHOD cl_gui_frontend_services=>file_open_dialog

  EXPORTING

    window_title            = 'Выбор файла'

    default_extension       = '*.txt'

  CHANGING

    file_table              = lt_file_table

    rc                      = lv_rc

  EXCEPTIONS

    file_open_dialog_failed = 1

    cntl_error              = 2

    error_no_gui            = 3

    not_supported_by_gui    = 4

    OTHERS                  = 5.

IF sy-subrc <> 0.

"Обработка ошибки...

ENDIF.

IF lv_rc EQ 0.

"Обработка ошибки...

ENDIF.

"Возьмем путь до первого выбранного файла

READ TABLE lt_file_table INTO lv_filename INDEX 1.

* Данные файла

ls_documentdata-wsapplication2  = 'TXT'.

ls_documentdatax-wsapplication2 = 'X'.

ls_documentdata-docfile2        = lv_filename.

ls_documentdatax-docfile2       = 'X'.

"Прикрепление файла

APPEND INITIAL LINE TO lt_files ASSIGNING <fs_file2>.

<fs_file2>-documenttype       = ls_document-doctype.       " Вид документа

<fs_file2>-documentnumber     = ls_document-docnumber.       " Номер документа

<fs_file2>-documentpart       = ls_document-docpart.       " Поддокумент

<fs_file2>-documentversion    = ls_document-docversion.       " Версия документа

<fs_file2>-originaltype       = '1'.    " Номер оригинала

<fs_file2>-sourcedatacarrier  = 'PC'.           " Имя носителя данных

<fs_file2>-storagecategory    = 'DMS_C1_ST'.  " Категория хранения для файлов оригиналов

<fs_file2>-wsapplication      = 'TXT'.   " Приложение рабочей станции (TDWP)

<fs_file2>-docfile            = lv_filename.            " Оригинал документа

<fs_file2>-description        = 'Файл для теста загрузки оригинала'.  " Краткое описание оригинала

<fs_file2>-language           = sy-langu.               " Код языка

<fs_file2>-created_by         = sy-uname.               " Имя ответственного исполнителя

<fs_file2>-changed_by         = sy-uname.               " Имя ответственного исполнителя

CALL FUNCTION 'BAPI_DOCUMENT_CHANGE2'

  EXPORTING

    documenttype    = ls_document-doctype

    documentnumber  = ls_document-docnumber

    documentpart    = ls_document-docpart

    documentversion = ls_document-docversion

    documentdata    = ls_documentdata

    documentdatax   = ls_documentdatax

  IMPORTING

    return          = ls_return

  TABLES

    documentfiles   = lt_files.

IF ls_return-type EQ 'E'.

  "Обработка ошибки и откат изменения

  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

  RETURN.

ELSE.

  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

    EXPORTING

      wait = 'X'.

ENDIF.

Выше в качестве приложения рабочей станции указан WSAPPLICATION = ‘TXT’, хотя наиболее вероятно, что потребуется иметь дело с файлами другого типа, например PDF. В этом случае стоит свериться с таблицей TDWP, чтобы выбрать подходящее приложение рабочей станции TDWP–DAPPL.

Прикрепление файла, расположенного на сервере

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

Далее, будет показано сохранение файла на сервер посредством ABAP-программы. Для поиска каталога, в который можно произвести сохранение следует обратиться к транзакции AL11. В моем случае, это /tmp/ каталог. Ниже код самой ABAP-программа для сохранения файла на стороне сервера.

DATA: lt_data    TYPE TABLE OF x255,

      lv_filename   TYPE string,

      lt_file_table TYPE filetable,

      lv_rc         TYPE i.

CALL METHOD cl_gui_frontend_services=>file_open_dialog

  EXPORTING

    window_title            = CONV #( 'Выбор файла'(001) )

    default_extension       = '*.txt'

  CHANGING

    file_table              = lt_file_table

    rc                      = lv_rc

  EXCEPTIONS

    file_open_dialog_failed = 1

    cntl_error              = 2

    error_no_gui            = 3

    not_supported_by_gui    = 4

    OTHERS                  = 5.

IF sy-subrc <> 0.

  "Обработка ошибки...

ENDIF.

"Возьмем путь до первого выбранного файла

READ TABLE lt_file_table INTO lv_filename INDEX 1.

"Загрузка файла в lt_data

CALL METHOD cl_gui_frontend_services=>gui_upload

 

Ограниченный доступ

Для прочтения полной версии статьи необходимо зайти как зарегистрированный пользователь.


Любое воспроизведение запрещено.
Копирайт © «Издательство ООО «Эксперт РП»