如何将SAP WebClient UI的表格导出成PDF

简介: 如何将SAP WebClient UI的表格导出成PDF

In WebClient for configTable control there is a functionality to export the whole table content as an excel.image.pngOnly simple steps are necessary to support export with PDF format as well.

The achievement would be: a new button is added to table toolbar.



image.pngOnce pressed, a new PDF with all table records are displayed.image.pngRequired steps are briefly listed below.


(1) Create a new post exit on class CL_BTSRV_ADVSRL_CNTRL, method PREPARE_TOOLBAR, in order to add a new button for PDF export in table toolbar.


image.png

image.pngPost exit source code:image.pngCLASS lcl_zexport_button DEFINITION DEFERRED.

CLASS cl_btsrv_advsrl_cntrl DEFINITION LOCAL FRIENDS lcl_zexport_button.

CLASS lcl_zexport_button DEFINITION.

 PUBLIC SECTION.

   CLASS-DATA obj TYPE REF TO lcl_zexport_button.          "#EC NEEDED

   DATA core_object TYPE REF TO cl_btsrv_advsrl_cntrl .    "#EC NEEDED

INTERFACES  IPO_ZEXPORT_BUTTON.

   METHODS:

     constructor IMPORTING core_object

                             TYPE REF TO cl_btsrv_advsrl_cntrl OPTIONAL.

ENDCLASS.

CLASS lcl_zexport_button IMPLEMENTATION.

 METHOD constructor.

   me->core_object = core_object.

 ENDMETHOD.

 METHOD ipo_zexport_button~prepare_toolbar.

*"------------------------------------------------------------------------*

*" Declaration of POST-method, do not insert any comments here please!

*"

*"methods PREPARE_TOOLBAR .

*"------------------------------------------------------------------------*

   DATA: ls_button               TYPE crmt_thtmlb_button.

   ls_button-type     = cl_thtmlb_util=>gc_icon_accept.

   ls_button-on_click = 'EXPORT'.

   ls_button-text = 'Export to PDF'.

   ls_button-enabled  = abap_true.

   APPEND ls_button TO ME->CORE_OBJECT->gt_button.

 ENDMETHOD.

ENDCLASS.(2) add a new event EXPORT and implement the handler in the result viewimage.pngSource code of export implementation:method EH_ONEXPORT.

   cl_crm_order_2_pdf=>open_pdf( io_col_wrapper = me->typed_context->btqrsrvord->collection_wrapper

                                 io_window_manager = me->comp_controller->window_manager ).

 endmethod.

Source code of method open_pdf:

 METHOD open_pdf.

   DATA: lv_query TYPE string.

   CHECK io_col_wrapper->size( ) > 0.

   DATA(iterator) = io_col_wrapper->get_iterator( ).

   DATA(bol) = iterator->get_current( ).

   WHILE bol IS NOT INITIAL.

     lv_query = lv_query && ',' && bol->get_property_as_string( 'GUID' ).

     bol = iterator->get_next( ).

   ENDWHILE.

   lv_query = 'uuid=' && lv_query.

   DATA(lv_url) = cl_crm_web_utility=>create_url( iv_path = '/sap/crm/order_print'

                                            iv_query = lv_query

                                            iv_in_same_session = 'X' ).

   DATA(lv_title) = 'Service Order PDF List'.

   DATA(lr_popup) =  io_window_manager->create_popup(  iv_interface_view_name = 'GSURLPOPUP/MainWindow'

                                                                   iv_usage_name          = 'CUGURLPopup'

                                                                   iv_title               = CONV #( lv_title ) ).

   DATA(lr_cn) = lr_popup->get_context_node( 'PARAMS' ).

   DATA(lr_obj) = lr_cn->collection_wrapper->get_current( ).

   DATA(ls_params) = VALUE crmt_gsurlpopup_params( url = lv_url height = '1000' ).

   lr_obj->set_properties( ls_params ).

   lr_popup->set_display_mode( if_bsp_wd_popup=>c_display_mode_plain ).

   lr_popup->set_window_width( 1000 ).

   lr_popup->set_window_height( 1000 ).

   lr_popup->open( ).

 ENDMETHOD.(3) Since in step 2 the reuse component GSURLPOPUP is utilized to hold rendered PDF as popup, so we need to declare it as component usage in the component of search result view:



image.png

\image.png(4) In step 2, the ICF service /sap/crm/order_print is declared but not implemented, so we have to create it in this step via tcode SICF.image.pngStill use CL_CRM_ORDER_2_PDF as handler class,image.pngand the main logic for PDF generation is done in method HANDLE_REQUEST of this handler class:method IF_HTTP_EXTENSION~HANDLE_REQUEST.

   CONSTANTS c_linelen TYPE i VALUE 255.

   DATA: wa_data(c_linelen) TYPE x,

         lt_data            LIKE TABLE OF wa_data.

   DATA: lv_pdf_length  TYPE i,

         lv_pdf_xstring TYPE xstring,

         ls_guid_str    TYPE string.

   DATA(lv_uuid) = server->request->get_form_field( 'uuid' ).

   CALL METHOD me->get_output_data

     EXPORTING

       iv_uuid   = lv_uuid

     IMPORTING

       fpcontent = lv_pdf_xstring.

   CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'

     EXPORTING

       buffer        = lv_pdf_xstring

     IMPORTING

       output_length = lv_pdf_length

     TABLES

       binary_tab    = lt_data.

   DATA(lv_contenttype) = 'application/pdf'.

   ls_guid_str = lv_uuid.

   CONCATENATE ls_guid_str '.pdf' INTO DATA(lv_filename).

   server->response->append_data(

                       data   = lv_pdf_xstring

                       length = lv_pdf_length ).

   CONCATENATE 'inline; filename=' lv_filename

     INTO DATA(lv_contentdisposition).

   CALL METHOD server->response->set_header_field

     EXPORTING

       name  = 'content-disposition'

       value = lv_contentdisposition.

   CALL METHOD server->response->set_header_field

     EXPORTING

       name  = 'content-type'

       value = CONV #( lv_contenttype ).

   CALL METHOD server->response->set_header_field

     EXPORTING

       name  = 'content-filename'

       value = lv_filename.

   server->response->delete_header_field(

            name = 'Cache-Control' ).

   server->response->delete_header_field(

            name = 'Expires' ).

 endmethod.(5) Develop an Adobe Form to display the table content.


The table in the Adobe Form must behave as so called “data-driven” way, which means the table content in the PDF must grow according to the actual data passed into the PDF rendering processor.

First create an ABAP interface for Adobe form via tcode SFP:


image.png

image.pngThe signature for this interface:image.pngOnce done, create a new Form template PF_CRM_ORDER_LIST via tcode SFP as well:image.pngKey steps which makes the table in the form template be able to automatically grow according to the feed data source:

(1) The body page must be flowed instead of positioned:


image.png

image.png(2) The table content row must be bound to a context node which has 0:n occurrence, and the “Repeat Row for Each Data Item” checkbox must be enabled.



image.png

image.pngAs in step 4, I use a SELECT * from CRMD_ORDERADM_H as the data source for this template, which means you can bind any field in ABAP structure CRMD_ORDERADM_H to the table cell in PDF, as illustrated below.



image.pngActivate both form interface and form template and the corresponding PDF would be generated now once export button is pressed.

You upload to your SFP workbench via command fb_xdp_up:



image.pngimage.png

相关文章
|
18天前
使用Itext导出PDF
使用Itext导出PDF
15 0
|
20天前
|
机器学习/深度学习 数据可视化 数据挖掘
【办公自动化】使用Python一键提取PDF中的表格到Excel
【办公自动化】使用Python一键提取PDF中的表格到Excel
22 0
|
21天前
|
Web App开发 JSON JavaScript
SAP UI5 应用程序小技巧 - 一键将 JSON 对象导出成本地 json 文件
SAP UI5 应用程序小技巧 - 一键将 JSON 对象导出成本地 json 文件
16 0
|
21天前
|
XML 持续交付 开发工具
SAPGUI 里 ABAP 代码导出成 PDF 格式的隐藏小技巧
SAPGUI 里 ABAP 代码导出成 PDF 格式的隐藏小技巧
13 0
|
21天前
关于 CRM WebClient UI 能够被 AET 工具扩展与否的讨论
关于 CRM WebClient UI 能够被 AET 工具扩展与否的讨论
18 0
|
21天前
|
测试技术 数据处理 Python
测试报告导出PDF和excel的方法
测试报告导出PDF和excel的方法
|
23天前
|
数据采集 数据安全/隐私保护 Python
Python 快速合并PDF表格转换输出CSV文件
Python 快速合并PDF表格转换输出CSV文件
31 0
Python 快速合并PDF表格转换输出CSV文件
|
1月前
element-ui 表格和 tooltip修改背景颜色和箭头颜色
element-ui 表格和 tooltip修改背景颜色和箭头颜色
|
1月前
|
搜索推荐 开发者 UED
关于 SAP Spartacus 层的 UI 设计
关于 SAP Spartacus 层的 UI 设计
25 0
|
2月前
|
JavaScript
vue中有关表格中的表格头中添加悬浮提示的ui问题
vue中有关表格中的表格头中添加悬浮提示的ui问题
28 0