Всем привет!
Сегодня я расскажу о том, как довольно легко сделать выгрузку файла из 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.
![](https://i0.wp.com/abapcode.ru/wp-content/uploads/2018/03/2018-03-29_0026.png?resize=427%2C275&ssl=1)
Для Word и Excel файлов результат такой же.