Создание отчетных форм на DOI

Приведем пример, того как можно позволять пользователям заполнять отчетные формы и, например, затем отправлять заполненные формы своим коллегам для печати и подписи.

 Для этого будем использовать технологию DOI(Document office integration).

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

Рис.1

Рис.2     .

Рис.3

Рис.4

Рис.5

В свойствах также должен быть создан параметр.

Загрузим формуляр в SMW0 под именем ZDOI_TEST.

Теперь создаем в системе тестовую программу.

*&---------------------------------------------------------------------*
*& Report  ZDOI_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zdoi_test.

TYPE-POOLS: cndp.

DATA: gv_tmpid     TYPE         char40 VALUE 'ZDOI_TEST',
      gv_url       TYPE         cndp_url,
      gt_field     TYPE         soi_form_list,
      gs_field     LIKE LINE OF gt_field,
      go_container TYPE REF TO  cl_gui_custom_container,
      go_control   TYPE REF TO  i_oi_container_control,
      go_document  TYPE REF TO  i_oi_document_proxy,
      go_form      TYPE REF TO  i_oi_form,
      gv_code      TYPE         syucomm.

INCLUDE zdoi_test_status_9001o01.

START-OF-SELECTION.

  CALL FUNCTION 'DP_PUBLISH_WWW_URL'
    EXPORTING
      objid    = gv_tmpid
      lifetime = cndp_lifetime_transaction
    IMPORTING
      url      = gv_url
    EXCEPTIONS
      OTHERS   = 4.

  gs_field-type = 'T'.
  gs_field-name = 'p1'.
  gs_field-number = '1'.
  gs_field-value = 'Value from ABAP'.
  APPEND gs_field TO gt_field.

  CALL SCREEN 9001.

  READ TABLE gt_field INTO gs_field INDEX 1.
  WRITE: 'This is new value: ', gs_field-value.

 

На 9001 экране расположим контейнер для отображения DOI.

В PBO/PAI напишем следующий код:

PROCESS BEFORE OUTPUT.
  MODULE status_9001.
*
PROCESS AFTER INPUT.
  MODULE user_command_9001.

*&---------------------------------------------------------------------*
*&      Module  STATUS_9001  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
  DATA: lv_str   TYPE         string,
        ls_field LIKE LINE OF gt_field.

  SET PF-STATUS '9001'.

  CHECK go_control IS NOT BOUND.

  CALL METHOD c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = go_control.

  CREATE OBJECT go_container
    EXPORTING
      container_name = 'DOI_CONTAINER'.

  CALL METHOD go_control->init_control
    EXPORTING
      inplace_enabled          = 'X'
      inplace_scroll_documents = 'X'
      inplace_show_toolbars    = space
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      r3_application_name      = 'DOI'
      parent                   = go_container
      no_flush                 = 'X'
    EXCEPTIONS
      OTHERS                   = 2.

  CALL METHOD go_control->get_document_proxy
    EXPORTING
      document_type      = space
      register_container = 'X'
      no_flush           = 'X'
    IMPORTING
      document_proxy     = go_document.

  CALL METHOD go_document->open_document
    EXPORTING
      open_inplace = 'X'
      document_url = gv_url
      no_flush     = 'X'.

  CALL METHOD go_document->get_form_interface
    EXPORTING
      no_flush    = 'X'
    IMPORTING
      f_interface = go_form.

  IF gt_field IS NOT INITIAL.
    CALL METHOD go_form->set_data
      EXPORTING
        fields   = gt_field
        clear    = space
        no_flush = 'X'.
  ENDIF.

  CALL METHOD go_form->protect
    EXPORTING
      protect  = 'X'
      no_flush = 'X'.

  cl_gui_cfw=>flush( ).
ENDMODULE.                 " STATUS_9001  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9001 INPUT.
  CALL METHOD go_form->get_data
    EXPORTING
      all    = 'X'
    IMPORTING
      fields = gt_field.

  CASE gv_code.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
  ENDCASE.

  " close document
  CALL METHOD go_document->close_document( ).
  CALL METHOD go_control->destroy_control( ).
  CALL METHOD go_container->free( ).
  CLEAR: go_form, go_document, go_control, go_container.

ENDMODULE.                 " USER_COMMAND_9001  INPUT

               В двух словах логика заключается в создании контейнера DOI и отображения формуляра. По умолчанию на экран в переменную P1 выводится слово 'Value from ABAP'. Затем вводя любое слово в отчетной форме и выходе из неё функционал считывает эту переменную и выводит её значение на экран.

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

Рис.6

Рис.7

Полезные ссылки по теме:

ПРОДВИНУТЫЕ ТЕХНОЛОГИИ ВЫВОДА В WORD И EXCEL

https://blogs.sap.com/2012/09/27/ole-programming-for-excel-and-word/

https://archive.sap.com/discussions/thread/3783206

Оцените статью:

5/5 - 2 оценок
doi
Связаться с нами