Всем привет!

Сегодня я расскажу о том, как довольно легко сделать выгрузку файла из Web Dynpro приложения.

Предположим, что вы создали программу, которая выгружает документ Word или Excel в SAP GUI. Для выгрузки вы использовали инструмент ZWWW. Через некоторое время к вам поступает требование от бизнеса реализовать возможность выгрузки этих документов через личный кабинет руководителя. Личный кабинет построен на некогда популярной технологии Web Dynpro (сократим до WD).

Общая часть.

Для выгрузки из WD приложения создадим в нашем отчете новую подпрограмму execute_from_web.

FORM execute_from_web USING iv_pernr TYPE pernr_d
                            iv_date TYPE datum
                            iv_format TYPE char1.
  DATA: lv_filenm_pdf TYPE fpname.

  p_pernr = iv_pernr.
  p_date = iv_date.
  p_format = iv_format.

* Заполняем выходную структуру gs_outstruc и преобразовываем ее в таблицу gtd_values
  PERFORM get_data.

  CASE iv_format.
    WHEN 1.
      PERFORM print_file USING gc_invoice_word. " имя шаблона Word в smw0
    WHEN 2.
      PERFORM print_file USING gc_payment_order_excel. " имя шаблона Excel в smw0
    WHEN 3.
      PERFORM call_pdf USING gc_payment_order_pdf. " имя Pdf-формуляра в sfp .
    WHEN OTHERS.
  ENDCASE.

ENDFORM.

Эту подпрограмму будем вызывать в методе-обработчике событий WD приложения (будет рассмотрен ниже).

Word и Excel.

Инструмент ZWWW умеет выгружать документ через web. Поэтому, в данном случае, нам нет необходимости тем или иным способом получать xstring чтобы выгрузить файл. Это есть хорошо.

FORM print_file USING uv_form_name TYPE wwwdatatab-objid.

  CALL FUNCTION 'ZWWW_OPENFORM'
    EXPORTING
      form_name   = uv_form_name
      protect     = ''
    TABLES
      it_values   = gtd_values
    EXCEPTIONS
      printcancel = 1
      OTHERS      = 2.
  IF sy-subrc <> 0.
    MESSAGE ID 'ZHR_TEST' TYPE 'E' NUMBER 001.
  ENDIF.  " sy-subrc <> 0. 'ZWWW_OPENFORM'

ENDFORM. " print_file.

Таблица gtd_values в моем случае была заполнена в подпрограмме get_data.

PDF.

Для получение pdf-файла создадим форму call_pdf.

FORM call_pdf USING uv_filenm TYPE fpname.
  DATA: lv_fname        TYPE funcname,
        ls_outputparams TYPE sfpoutputparams,
        ls_formoutput   TYPE fpformoutput,
        lo_cx_fp_api    TYPE REF TO cx_fp_api,
        lv_msg          TYPE string.

  CHECK gs_outstruc IS NOT INITIAL.

  TRY.
      CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
        EXPORTING
          i_name     = uv_filenm
        IMPORTING
          e_funcname = lv_fname.
    CATCH cx_fp_api_internal
          cx_fp_api_repository
          cx_fp_api_usage
     INTO lo_cx_fp_api.

      lv_msg = lo_cx_fp_api->get_text( ).
      MESSAGE lv_msg TYPE wctpm_msgtyp-error.
  ENDTRY.

* Обратите внимание!
  ls_outputparams-nodialog = 'X'.
  ls_outputparams-getpdf = 'X'.

  CALL FUNCTION 'FP_JOB_OPEN'
    CHANGING
      ie_outputparams = ls_outputparams
    EXCEPTIONS
      usage_error     = 1
      system_error    = 2
      internal_error  = 3
      OTHERS          = 4.
  CHECK sy-subrc = 0.

  CALL FUNCTION lv_fname
    EXPORTING
      is_data            = gs_outstruc
    IMPORTING
      /1bcdwb/formoutput = ls_formoutput
    EXCEPTIONS
      usage_error        = 1
      system_error       = 2
      internal_error     = 3
      OTHERS             = 4.
  CHECK sy-subrc = 0.

  CALL FUNCTION 'FP_JOB_CLOSE'
    EXCEPTIONS
      usage_error    = 1
      system_error   = 2
      internal_error = 3
      OTHERS         = 4.
  CHECK sy-subrc = 0.

  cl_wd_runtime_services=>attach_file_to_response( i_filename  = |{ uv_filenm }_{ sy-timlo }.pdf'|
  i_content   = ls_formoutput-pdf
  i_mime_type = 'application/pdf' ) ##NO_TEXT.

ENDFORM. " call_pdf.

Самое интересное. 

В методе do_operations на событии «PRINT» вызываем подпрограмму печати документа execute_from_web, созданную нами выше.

METHOD if_hrasr00gen_service~do_operations.
  DATA: lo_fpm   TYPE REF TO cl_fpm,
        lv_event TYPE fpm_event_id,
        lv_pernr TYPE  pernr_d,
        lv_date   TYPE  dats,
        lv_format TYPE char1.

* Получаем параметры из полей в браузере
   lv_pernr  =  ctd_service_dataset[  fieldname  =  'PERNR'  ]-fieldvalue.
   lv_date  =  ctd_service_dataset[  fieldname  =  'DATE'  ]-fieldvalue.
   lv_format  =  ctd_service_dataset[  fieldname  =  'FORMAT'  ]-fieldvalue. "Формат файла(1-word,2-excel,3-pdf)

* Получаем событие
  lo_fpm ?= cl_fpm=>get_instance( ).
  IF lo_fpm IS BOUND.
    lv_event = lo_fpm->mo_current_event->mv_event_id.
    CASE lv_event.
      WHEN 'PRINT'.
        PERFORM  execute_from_web  IN  PROGRAM  zhr_test  USING  lv_pernr  lv_date lv_format. 
    ENDCASE.
  ENDIF.
ENDMETHOD.

Результат:

Ниже приведен скриншот выгрузки файла pdf.

Для Word и Excel файлов результат такой же.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.