..3 Возможности по расширению просмотрщика
Используя IMPORTING-параметры IV_VIEWER_CALLBACK_PROG и IV_VIEWER_CALLBACK_FORM, Вы можете указать CALLBACK-подпрограмму, которая будет вызываться при наступлении некоторых событий просмотрщика:
BEFORE_OLE_INITIALIZATION – наступает в PBO-логике экрана, непосредственно до создания OLE-объектов и отображения формы посредством приложения Excel . Здесь вы можете использовать сторонний инструментарий для внесения изменений в документ, передаваемый в changing-параметре cv_rawdata как HEX-последовательность .
AFTER_OLE_INITIALIZATION – наступает в PBO-логике экрана, непосредственно после создания OLE-объектов и отображения формы посредством приложения Excel . Здесь вы можете использовать OLE или DOI-технологии для каких-либо манипуляций с готовой формой. Для получения DOI-объекта актуальной формы, следует использовать подпрограмму VIEWER_GET_DOI_OBJECT.
CONTROLS_INIT – наступает в PBO-логике экрана, один раз – при инициализации контролов: контейнеров и тулбара. В этот момент Вы можете добавить дополнительные кнопки в тулбар, передаваемый в changing-параметре cr_toolbar .
FUNCTION_CODE – наступает при нажатии пользователем добавленных им кнопок.
REDRAW – наступает при переходе на новую книгу в “связке”.
Пример использования CALLBACK-подпрограммы:
CALL FUNCTION 'ZXLWB_CALLFORM'
EXPORTING
iv_formname = 'SHIPPING_LABELS'
iv_context_ref = gt_context[]
iv_viewer_callback_prog = sy-cprog
iv_viewer_callback_form = 'CALLBACK_FORM'
EXCEPTIONS
OTHERS = 2.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
ENDIF .
*&---------------------------------------------------------------------*
*& Form CALLBACK_FORM
*&---------------------------------------------------------------------*
FORM callback_form
USING pv_event TYPE char50
CHANGING cv_fcode TYPE ui_func
cr_toolbar TYPE REF TO cl_gui_toolbar
cv_rawdata TYPE xstring . " -->> excel document as hex-string
CASE pv_event .
*=======================================================================
WHEN 'BEFORE_OLE_INITIALIZATION' . " here you can bring some changes to the CV_RAWDATA
* (excel document as HEX-string)
*=======================================================================
*=======================================================================
WHEN 'AFTER_OLE_INITIALIZATION' . " here you can use OLE or DOI
* to post-processing the excel document
*=======================================================================
* get DOI object
DATA:
lo_container_control TYPE REF TO i_oi_container_control ,
lo_document_proxy TYPE REF TO i_oi_document_proxy ,
lo_spreadsheet TYPE REF TO i_oi_spreadsheet .
PERFORM viewer_get_doi_object
IN PROGRAM saplzxlwb
CHANGING lo_container_control
lo_document_proxy
lo_spreadsheet .
CHECK lo_spreadsheet IS BOUND .
* CASE 1: print out an actual worksheet without print-dialog
lo_spreadsheet->print( name = 'Sheet1' ) .
* CASE 2: show print-dialog via DOI
lo_document_proxy->print_document(
EXPORTING prompt_user = abap_on
no_flush = abap_off ) .
* CASE 3: show print-dialog via OLE
DATA:
ls_handle TYPE cntl_handle ,
ls_application TYPE ole2_object ,
ls_activeworkbook TYPE ole2_object ,
ls_dialogs TYPE ole2_object ,
ls_item TYPE ole2_object .
lo_document_proxy->get_document_handle( IMPORTING handle = ls_handle ) .
CALL METHOD OF:
ls_handle-obj 'Application' = ls_application,
ls_application 'Dialogs' = ls_dialogs,
ls_dialogs 'Item' = ls_item EXPORTING #1 = '8',
ls_item 'Show'.
* CASE 4: save with protecting worksheet
GET PROPERTY OF ls_application 'ActiveWorkbook' = ls_activeworkbook .
CALL METHOD OF
ls_activeworkbook 'SaveAs'
EXPORTING
#1 = 'C:\protected.xlsx'
#2 = 51 " -->> FileFormat:=xlOpenXMLWorkbook
#3 = 'password'.
FREE OBJECT ls_item . CLEAR ls_item .
FREE OBJECT ls_dialogs . CLEAR ls_dialogs .
FREE OBJECT ls_activeworkbook . CLEAR ls_activeworkbook .
FREE OBJECT ls_application . CLEAR ls_application .
*=======================================================================
WHEN 'CONTROLS_INIT' . " here you can add custom buttons to the toolbar
*=======================================================================
TYPE-POOLS: cntb , icon .
cr_toolbar->add_button( fcode = 'NEW_BUTTON'
text = 'Show my message'
icon = icon_message_warning_small
butn_type = cntb_btype_button ) .
*=======================================================================
WHEN 'FUNCTION_CODE' . " here you can process function codes
*=======================================================================
CASE cv_fcode .
WHEN 'NEW_BUTTON' .
MESSAGE 'My message' TYPE 'I' .
WHEN OTHERS .
ENDCASE .
*=======================================================================
WHEN 'REDRAW' . " here you can process a jump
* to a next workbook in the bundle.
*=======================================================================
ENDCASE .
ENDFORM . "CALLBACK_FORM