*&---------------------------------------------------------------------* *& Report SAPRDEMOWORD97INTEGRATION * *&---------------------------------------------------------------------* INCLUDE rdemoword97integrationtop. DATA: factory TYPE REF TO i_oi_document_factory. DATA: document TYPE REF TO i_oi_document_proxy. DATA: link_server TYPE REF TO i_oi_link_server. DATA: bds_instance TYPE REF TO cl_bds_document_set. DATA: retcode TYPE t_oi_ret_string, document_type(80) VALUE soi_doctype_word97_document, document_format(80) TYPE c. DATA: documents TYPE document_list. DATA: descr TYPE document_descr. DATA: data_table TYPE sbdst_content, data_size TYPE i, doc_url TYPE t_url, has_changed TYPE i, delimiter(1) TYPE c VALUE'/', data_type(64) TYPE c, data_subtype(64) TYPE c, document_mimetype TYPE bapicompon-mimetype. DATA: first_open VALUE '1'. DATA: BEGIN OF point_data, proposal(40), lastname(30), comment(128), END OF point_data. DATA: points LIKE point_data OCCURS 0 WITH HEADER LINE. CLASS c_event_handler DEFINITION. PUBLIC SECTION. CLASS-METHODS: close_event_handler FOR EVENT on_close_document OF i_oi_document_proxy IMPORTING document_proxy has_changed. CLASS-METHODS: custom_event_handler FOR EVENT on_custom_event OF i_oi_document_proxy IMPORTING document_proxy event_name param_count param1 param2 param3. ENDCLASS. CLASS c_event_handler IMPLEMENTATION. METHOD close_event_handler. * FOR EVENT on_close_document OF c_oi_container_control * IMPORTING document_proxy has_changed. DATA: answer. * if has_changed eq 1. PERFORM save_document TABLES data_table USING 'X' 'X' CHANGING data_size document_proxy retcode. open_document = false. * endif. ENDMETHOD. METHOD custom_event_handler. * FOR EVENT on_custom_event OF i_oi_document_proxy * IMPORTING document_proxy event_name param_count * param1 param2 param3. DATA: text(80). CONCATENATE 'Word:' event_name 'fired with parameter:' param1 INTO text SEPARATED BY space. "#EC NOTEXT CALL FUNCTION 'POPUP_TO_INFORM' EXPORTING titel = 'Word 97 Integration Demo'(002) txt1 = text txt2 = space. ENDMETHOD. ENDCLASS. *&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT *&---------------------------------------------------------------------* MODULE status_0100 OUTPUT. DATA: o1 TYPE REF TO c_event_handler. CREATE OBJECT o1. SET PF-STATUS 'MAIN0100'. SET TITLEBAR '001'. retcode = c_oi_errors=>ret_ok. IF bds_instance is initial. CREATE OBJECT bds_instance. ENDIF. IF factory is initial. CALL METHOD c_oi_factory_creator=>get_document_factory IMPORTING factory = factory retcode = retcode. IF retcode ne c_oi_errors=>ret_ok. EXIT. ENDIF. CALL METHOD factory->start_factory EXPORTING r3_application_name = 'SAP Basis' "#EC NOTEXT register_on_close_event = 'X' register_on_custom_event = 'X' IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. CALL METHOD factory->get_link_server IMPORTING link_server = link_server retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. CALL METHOD link_server->start_link_server IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. CALL METHOD factory->get_document_proxy EXPORTING document_type = document_type IMPORTING document_proxy = document retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. SET HANDLER c_event_handler=>close_event_handler FOR document. SET HANDLER c_event_handler=>custom_event_handler FOR document. * dynpro fields default template = 'DEMOWORD97TEMPLATE'. user = 'Ehre'. "#EC NOTEXT company = 'SAP'. "#EC NOTEXT macro = 'swap_color'. "#EC NOTEXT event = 'event2'. "#EC NOTEXT menubar = 'SAP Menu Bar'. "#EC NOTEXT menu = 'SAP Menu'. "#EC NOTEXT menuitem = 'Fire R/3 event'. "#EC NOTEXT proposal = 'First Proposal'. "#EC NOTEXT author = 'Ehre'. "#EC NOTEXT comment = 'This is a comment'. "#EC NOTEXT PERFORM refresh_links. ENDIF. ENDMODULE. " STATUS_0100 OUTPUT *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* MODULE user_command_0100 INPUT. CALL METHOD cl_gui_cfw=>dispatch. CASE fcode. WHEN 'EXIT'. "Zurück IF not document is initial. PERFORM save_document TABLES data_table USING 'X' 'X' CHANGING data_size document retcode. FREE document. ENDIF. IF not link_server is initial. CALL METHOD link_server->stop_link_server IMPORTING retcode = retcode. FREE link_server. ENDIF. IF not factory is initial. CALL METHOD factory->stop_factory IMPORTING retcode = retcode. FREE factory. ENDIF. IF not bds_instance is initial. FREE bds_instance. ENDIF. LEAVE TO SCREEN 0. WHEN 'SELECT'. IF not document is initial. PERFORM save_document TABLES data_table USING 'X' 'X' CHANGING data_size document retcode. ENDIF. IF not factory is initial. REFRESH documents. descr-document_name = 'Office Integration Description'(do1). descr-document_id = 'DEMOWORD97DOC'. APPEND descr TO documents. descr-document_name = 'Demo Document'(do2). descr-document_id = 'DEMOWORD97DOC2'. APPEND descr TO documents. descr-document_name = 'Demo Document XP'(do3). descr-document_id = 'DEMOWORDXPDOC2'. APPEND descr TO documents. CLEAR doc_url. PERFORM select_and_load_document TABLES documents USING 'Select Document'(sdo) CHANGING document_type document_format doc_url. IF not doc_url is initial. CALL METHOD document->open_document EXPORTING document_url = doc_url IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. * Document shall also be available in ITAB for respective operations: CALL METHOD document->save_document_to_table IMPORTING retcode = retcode CHANGING document_table = data_table document_size = data_size. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. first_open = false. open_document = true. CALL METHOD document->execute_macro EXPORTING macro_string = 'R3UpdateTables' "#EC NOTEXT IMPORTING retcode = retcode. ELSE. MESSAGE e010. ENDIF. ENDIF. WHEN 'OPEN'. IF first_open = true. first_open = false. REFRESH documents. descr-document_name = 'Office Integration Description'(do1). descr-document_id = 'DEMOWORD97DOC'. APPEND descr TO documents. PERFORM select_and_load_document TABLES documents USING 'Select Document'(sdo) CHANGING document_type document_format doc_url. CALL METHOD document->open_document EXPORTING document_url = doc_url IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. * Document shall also be available in ITAB for respective operations: CALL METHOD document->save_document_to_table IMPORTING retcode = retcode CHANGING document_table = data_table document_size = data_size. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. ELSE. * open document stored in internal table data_table DATA: is_closed TYPE i. CALL METHOD document->is_destroyed IMPORTING ret_value = is_closed. IF is_closed is initial. CALL METHOD document->close_document EXPORTING do_save = 'X' IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. CALL METHOD document->save_document_to_table IMPORTING retcode = retcode CHANGING document_table = data_table[] document_size = data_size. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. ENDIF. CALL METHOD document->release_document IMPORTING retcode = retcode. CALL METHOD document->open_document_from_table EXPORTING document_table = data_table[] document_size = data_size IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. ENDIF. open_document = true. CALL METHOD document->execute_macro EXPORTING macro_string = 'R3UpdateTables' "#EC NOTEXT IMPORTING retcode = retcode. WHEN 'REFRESH'. IF not link_server is initial. PERFORM refresh_links. CALL METHOD document->execute_macro EXPORTING macro_string = 'R3UpdateTables' "#EC NOTEXT IMPORTING retcode = retcode. ELSE. MESSAGE e004. ENDIF. WHEN 'SAVEAS'. CALL METHOD document->save_as EXPORTING file_name = '' prompt_user = 'X' IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. WHEN 'CLOSE'. PERFORM save_document TABLES data_table USING ' ' 'X' CHANGING data_size document retcode. open_document = false. WHEN 'COPYLINK'. IF not link_server is initial. PERFORM refresh_links. CALL METHOD link_server->execute_copy_link_dialog IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. ELSE. MESSAGE e004. ENDIF. WHEN 'INSTALL'. DATA: wp_ref TYPE REF TO i_oi_word_processor_document. CHECK not document is initial and open_document = true. CALL METHOD document->get_wordprocessor_interface IMPORTING wp_interface = wp_ref retcode = retcode. IF retcode eq c_oi_errors=>ret_ok. CLEAR item_url. CLEAR descr. descr-document_id = template. PERFORM select_document CHANGING descr-document_id document_format doc_url document_mimetype. item_url = doc_url. CALL METHOD wp_ref->install_template EXPORTING template_name = template url = item_url IMPORTING retcode = retcode. FREE wp_ref. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. ELSE. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. ENDIF. WHEN 'EXECT'. CHECK not document is initial and open_document = true. CALL METHOD document->get_wordprocessor_interface IMPORTING wp_interface = wp_ref retcode = retcode. IF retcode eq c_oi_errors=>ret_ok. CALL METHOD wp_ref->set_template EXPORTING template_name = template IMPORTING retcode = retcode. FREE wp_ref. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. ELSE. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. ENDIF. WHEN 'EXECS'. CHECK not document is initial and open_document = true. * straight ole automation DATA: document_cntl_handle TYPE cntl_handle. INCLUDE ole2incl. DATA: ocharacters TYPE ole2_object, orange TYPE ole2_object, oreplacement TYPE ole2_object, ofind TYPE ole2_object, ofont TYPE ole2_object. DATA: char_count TYPE i, char_position TYPE i, old_search_string LIKE search, string_found TYPE i, color_index TYPE i. CALL METHOD document->get_document_handle IMPORTING handle = document_cntl_handle retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. IF old_search_string ne search. * get number of document characters. GET PROPERTY OF document_cntl_handle-obj 'characters' = ocharacters. GET PROPERTY OF ocharacters 'count' = char_count. char_position = 0. old_search_string = search. ENDIF. * set range now IF char_position >= char_count. char_position = 0. ENDIF. CALL METHOD OF document_cntl_handle-obj 'Range' = orange EXPORTING #1 = char_position #2 = char_count. * search now GET PROPERTY OF orange 'Find' = ofind. * set property of ofind 'Text' = search. * set property of ofind 'Forward' = true. * call method of ofind 'ClearFormatting'. * IF NOT REPLACE IS INITIAL. * GET PROPERTY OF OFIND 'Replacement' = OREPLACEMENT. * SET PROPERTY OF OREPLACEMENT 'Text' = REPLACE. * CALL METHOD OF OREPLACEMENT 'ClearFormatting'. * ENDIF. IF not replace is initial. * replace * CALL METHOD OF ofind 'Execute' * EXPORTING #1 = search "FindText * #2 = false "MatchCase * #3 = false "MatchWholeWord * #4 = false "MatchWildCards * #5 = false "MatchSoundsLike * #6 = true "MatchAllWordForms * #7 = true "Forward * #8 = '1' "Wrap * #9 = true * #91 = replace * #92 = '2'. * char_position = 0. *BEGIN - Japaneese characters get garbled refer note 878178. DATA: is_available type i. CALL METHOD document->has_wordprocessor_interface IMPORTING is_available = is_available retcode = retcode. IF is_available = 1 . CALL METHOD document->get_wordprocessor_interface IMPORTING wp_interface = wp_ref retcode = retcode. IF RETCODE EQ C_OI_ERRORS=>RET_OK. CALL METHOD wp_ref->replace EXPORTING replace_string = replace search_string = search pos = 'GLOBAL' flag = 'ALL'. ENDIF. ENDIF. *END - Japaneese characters get garbled refer note 878178. ELSE. *search CALL METHOD OF ofind 'Execute' EXPORTING #1 = search "FindText #2 = false "MatchCase #3 = false "MatchWholeWord #4 = false "MatchWildCards #5 = false "MatchSoundsLike #6 = true "MatchAllWordForms #7 = true "Forward #8 = '1' "Wrap #9 = true. GET PROPERTY OF ofind 'Found' = string_found. IF string_found > 0. GET PROPERTY OF orange 'Font' = ofont. GET PROPERTY OF ofont 'ColorIndex' = color_index. IF color_index ne 6. color_index = 6. ELSE. color_index = 11. ENDIF. SET PROPERTY OF ofont 'ColorIndex' = color_index. ENDIF. GET PROPERTY OF orange 'End' = char_position. ENDIF. * CALL METHOD DOCUMENT->GET_WORDPROCESSOR_INTERFACE * IMPORTING WP_INTERFACE = WP_REF * RETCODE = RETCODE. * IF RETCODE EQ C_OI_ERRORS=>RET_OK. * IF REPLACE IS INITIAL. * CALL METHOD WP_REF->SEARCH * EXPORTING SEARCH_STRING = SEARCH * POS = '1' * FLAG = SPACE * importing RETCODE = RETCODE. * ELSE. * CALL METHOD WP_REF->REPLACE * EXPORTING SEARCH_STRING = SEARCH * POS = '1' * FLAG = SPACE * REPLACE_STRING = REPLACE * importing RETCODE = RETCODE. * ENDIF. * CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE EXPORTING TYPE = 'E'. * FREE WP_REF. * ELSE. * CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE EXPORTING TYPE = 'E'. * ENDIF. WHEN 'EXECM'. CHECK not document is initial and open_document = true. CALL METHOD document->execute_macro EXPORTING macro_string = macro IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. WHEN 'CHANGE'. CALL METHOD link_server->add_string_item EXPORTING item_name = 'user' item_value = user IMPORTING retcode = retcode. CALL METHOD link_server->add_string_item EXPORTING item_name = 'company' item_value = company IMPORTING retcode = retcode. WHEN 'ADDMBAR'. CHECK not document is initial and open_document = true. CALL METHOD document->add_menu_bar EXPORTING name = menubar IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. WHEN 'ADDMENU'. CHECK not document is initial and open_document = true. CALL METHOD document->add_menu_popup EXPORTING name = menu menu_bar_name = menubar insert_before_popup = 1 IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. WHEN 'ADDITEM'. DATA: position(256). CHECK not document is initial. CALL METHOD document->add_menu_item EXPORTING item_name = menuitem menu_bar_name = menubar menu_popup_name = menu insert_before_item = 0 item_macro = event IMPORTING retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. * just for straight ole automation * data: document_cntl_handle type cntl_handle. * include ole2incl. * CALL METHOD DOCUMENT->GET_DOCUMENT_HANDLE * IMPORTING HANDLE = DOCUMENT_CNTL_HANDLE * RETCODE = RETCODE. * CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE EXPORTING TYPE = 'E'. * CALL METHOD OF DOCUMENT_CNTL_HANDLE-OBJ .... ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT *---------------------------------------------------------------------* * FORM REFRESH_LINKS * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* FORM refresh_links. IF not link_server is initial. CALL METHOD link_server->add_string_item EXPORTING item_name = 'Project Name' "#EC NOTEXT item_value = project_name no_flush = 'X' IMPORTING retcode = retcode. CALL METHOD link_server->add_string_item EXPORTING item_name = 'Topic' "#EC NOTEXT item_value = project_topic no_flush = 'X' IMPORTING retcode = retcode. CALL METHOD link_server->add_string_item EXPORTING item_name = 'Department' "#EC NOTEXT item_value = department no_flush = 'X' IMPORTING retcode = retcode. CALL METHOD link_server->add_string_item EXPORTING item_name = 'Author' "#EC NOTEXT item_value = author no_flush = 'X' IMPORTING retcode = retcode. CALL METHOD link_server->add_string_item EXPORTING item_name = 'Distribution List' "#EC NOTEXT item_value = distr_list no_flush = 'X' IMPORTING retcode = retcode. CALL METHOD link_server->add_string_item EXPORTING item_name = 'User' "#EC NOTEXT item_value = user no_flush = 'X' IMPORTING retcode = retcode. CALL METHOD link_server->add_string_item EXPORTING item_name = 'Company' "#EC NOTEXT item_value = company no_flush = 'X' IMPORTING retcode = retcode. DATA: int TYPE i VALUE 100. CALL METHOD link_server->add_string_item EXPORTING item_name = 'Number' "#EC NOTEXT item_value = int no_flush = 'X' IMPORTING retcode = retcode. DATA: date TYPE d VALUE '19961231'. CALL METHOD link_server->add_string_item EXPORTING item_name = 'Date' "#EC NOTEXT item_value = date no_flush = ' ' IMPORTING retcode = retcode. REFRESH points. points-proposal = proposal. points-lastname = author. points-comment = comment. APPEND points. points-proposal = 'Second Proposal'. points-lastname = 'Neuendorf'. "#EC NOTEXT points-comment = '017299'. APPEND points. points-proposal = 'Third Proposal'. points-lastname = 'Kolb'. "#EC NOTEXT points-comment = '004711'. APPEND points. points-proposal = 'Conclusion'. points-lastname = 'Kretschmer'. "#EC NOTEXT points-comment = '000001'. APPEND points. CALL METHOD link_server->add_table_item2 EXPORTING item_name = 'Agenda' "#EC NOTEXT IMPORTING retcode = retcode CHANGING data_table = points[]. CLEAR item_url. CLEAR descr. descr-document_name = 'RTF Logo'. "#EC NOTEXT descr-document_id = 'DEMOWORD97RTF1'. "#EC NOTEXT PERFORM select_document CHANGING descr-document_id document_format doc_url document_mimetype. item_url = doc_url. SPLIT document_mimetype AT delimiter INTO data_type data_subtype. CALL METHOD link_server->add_binary_item EXPORTING item_name = 'RTF Item' "#EC NOTEXT table_url = item_url data_type = soi_type_application data_subtype = soi_subtype_rtf IMPORTING retcode = retcode. CLEAR: item_url. CLEAR descr. descr-document_name = 'SAP LOGO'. descr-document_id = 'DEMOWORD97SAPLOGO'. PERFORM select_document CHANGING descr-document_id document_format doc_url document_mimetype. item_url = doc_url. SPLIT document_mimetype AT delimiter INTO data_type data_subtype. CALL METHOD link_server->add_binary_item EXPORTING item_name = 'SAPLogo' item_title = 'SAP Logo' "#EC NOTEXT table_url = item_url data_type = soi_type_image data_subtype = soi_subtype_gif IMPORTING retcode = retcode. ENDIF. ENDFORM. *---------------------------------------------------------------------* * FORM SAVE_DOCUMENT * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* * --> DOC_TABLE * * --> DO_ASK * * --> DO_RELEASE * * --> DOC_SIZE * * --> DOCUMENT * * --> TO * * --> I_OI_DOCUMENT_PROXY * * --> RETCODE * *---------------------------------------------------------------------* FORM save_document TABLES doc_table TYPE table USING do_ask TYPE c do_release TYPE c CHANGING doc_size TYPE i document TYPE REF TO i_oi_document_proxy retcode TYPE t_oi_ret_string. DATA: is_closed TYPE i, answer TYPE c, has_changed TYPE i. CALL METHOD document->is_destroyed IMPORTING ret_value = is_closed. IF is_closed is initial. CALL METHOD document->close_document EXPORTING do_save = 'X' IMPORTING has_changed = has_changed retcode = retcode. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. ENDIF. IF not has_changed is initial. IF not do_ask is initial. CALL FUNCTION 'POPUP_TO_CONFIRM' EXPORTING titlebar = 'Office Integration Demo'(oid) text_question = 'Save Document?'(sav) display_cancel_button = ' ' IMPORTING answer = answer. ELSE. answer = '1'. ENDIF. IF answer eq '1'. CALL METHOD document->save_document_to_table IMPORTING retcode = retcode CHANGING document_table = doc_table[] document_size = doc_size. CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'. ENDIF. ENDIF. IF not do_release is initial. CALL METHOD document->release_document IMPORTING retcode = retcode. ENDIF. ENDFORM. *======================================================================= *======================================================================= FORM select_document CHANGING document_id TYPE c document_format TYPE c doc_url TYPE t_url document_mimetype TYPE bapicompon-mimetype. * Tables and WAs: DATA: doc_signature TYPE sbdst_signature, wa_doc_signature LIKE LINE OF doc_signature, doc_components TYPE sbdst_components, wa_doc_components LIKE LINE OF doc_components, doc_uris TYPE sbdst_uri, wa_doc_uris LIKE LINE OF doc_uris. * IDs: DATA: doc_classname TYPE sbdst_classname VALUE 'SOFFICEINTEGRATION', doc_classtype TYPE sbdst_classtype VALUE 'OT', doc_object_key TYPE sbdst_object_key VALUE 'SOFFICEINTEGRATION', doc_mimetype LIKE bapicompon-mimetype. *----------------------------------------------------------------------- CLEAR: wa_doc_signature, wa_doc_components, wa_doc_uris. REFRESH: doc_signature, doc_components, doc_uris. wa_doc_signature-prop_name = 'DESCRIPTION'. wa_doc_signature-prop_value = descr-document_id. APPEND wa_doc_signature TO doc_signature. CALL METHOD bds_instance->get_info EXPORTING classname = doc_classname classtype = doc_classtype object_key = doc_object_key CHANGING components = doc_components signature = doc_signature EXCEPTIONS nothing_found = 1 error_kpro = 2 internal_error = 3 parameter_error = 4 not_authorized = 5 not_allowed = 6. IF sy-subrc ne 0 and sy-subrc ne 1. MESSAGE e016. ENDIF. IF sy-subrc = 1. MESSAGE e017. ENDIF. CALL METHOD bds_instance->get_with_url EXPORTING classname = doc_classname classtype = doc_classtype object_key = doc_object_key CHANGING uris = doc_uris signature = doc_signature EXCEPTIONS nothing_found = 1 error_kpro = 2 internal_error = 3 parameter_error = 4 not_authorized = 5 not_allowed = 6. IF sy-subrc ne 0 and sy-subrc ne 1. MESSAGE e016. ENDIF. IF sy-subrc = 1. MESSAGE e017. ENDIF. READ TABLE doc_components INTO wa_doc_components INDEX 1. READ TABLE doc_uris INTO wa_doc_uris INDEX 1. doc_mimetype = wa_doc_components-mimetype. doc_url = wa_doc_uris-uri. CASE doc_mimetype. WHEN 'application/x-rtf' OR 'text/rtf'. document_format = soi_docformat_rtf. WHEN 'application/x-oleobject'. document_format = soi_docformat_compound. WHEN 'text/plain'. document_format = soi_docformat_text. WHEN OTHERS. document_format = soi_docformat_native. ENDCASE. ENDFORM. *======================================================================= *======================================================================= FORM select_and_load_document TABLES documents USING dialog_title TYPE c CHANGING document_type TYPE c document_format TYPE c doc_url TYPE t_url. * Tables and WAs: DATA: doc_signature TYPE sbdst_signature, wa_doc_signature LIKE LINE OF doc_signature, doc_components TYPE sbdst_components, wa_doc_components LIKE LINE OF doc_components, doc_properties TYPE sbdst_properties, wa_doc_properties LIKE LINE OF doc_properties, doc_uris TYPE sbdst_uri, wa_doc_uris LIKE LINE OF doc_uris. * IDs: DATA: doc_classname TYPE sbdst_classname VALUE 'SOFFICEINTEGRATION', doc_classtype TYPE sbdst_classtype VALUE 'OT', doc_object_key TYPE sbdst_object_key VALUE 'SOFFICEINTEGRATION', doc_mimetype LIKE bapicompon-mimetype. *----------------------------------------------------------------------- DATA: field_desc LIKE rsvbfidesc OCCURS 1 WITH HEADER LINE. DATA: l_nr LIKE sy-tabix. REFRESH field_desc. field_desc-fieldnum = 1. field_desc-display = 'X'. APPEND field_desc. l_nr = 0. CALL FUNCTION 'RS_VALUES_BOX' EXPORTING left_upper_col = 5 left_upper_row = 5 pagesize = 10 title = dialog_title IMPORTING linenumber = l_nr TABLES field_desc = field_desc value_tab = documents EXCEPTIONS OTHERS = 1. IF sy-subrc eq 0 and l_nr ne 0. READ TABLE documents INDEX l_nr INTO descr. IF sy-subrc eq 0. CLEAR: wa_doc_signature, wa_doc_components, wa_doc_uris. REFRESH: doc_signature, doc_components, doc_uris. wa_doc_signature-prop_name = 'DESCRIPTION'. wa_doc_signature-prop_value = descr-document_id. APPEND wa_doc_signature TO doc_signature. CALL METHOD bds_instance->get_info EXPORTING classname = doc_classname classtype = doc_classtype object_key = doc_object_key CHANGING components = doc_components signature = doc_signature EXCEPTIONS nothing_found = 1 error_kpro = 2 internal_error = 3 parameter_error = 4 not_authorized = 5 not_allowed = 6. IF sy-subrc ne 0 and sy-subrc ne 1. MESSAGE e016. ENDIF. IF sy-subrc = 1. MESSAGE e017. ENDIF. CALL METHOD bds_instance->get_with_url EXPORTING classname = doc_classname classtype = doc_classtype object_key = doc_object_key CHANGING uris = doc_uris signature = doc_signature EXCEPTIONS nothing_found = 1 error_kpro = 2 internal_error = 3 parameter_error = 4 not_authorized = 5 not_allowed = 6. IF sy-subrc ne 0 and sy-subrc ne 1. MESSAGE e016. ENDIF. IF sy-subrc = 1. MESSAGE e017. ENDIF. READ TABLE doc_components INTO wa_doc_components INDEX 1. READ TABLE doc_uris INTO wa_doc_uris INDEX 1. doc_mimetype = wa_doc_components-mimetype. document_mimetype = doc_mimetype. doc_url = wa_doc_uris-uri. CASE doc_mimetype. WHEN 'application/x-rtf' OR 'text/rtf'. document_format = soi_docformat_rtf. WHEN 'application/x-oleobject'. document_format = soi_docformat_compound. WHEN 'text/plain'. document_format = soi_docformat_text. WHEN OTHERS. document_format = soi_docformat_native. ENDCASE. ENDIF. ENDIF. ENDFORM. *=======================================================================
*----------------------------------------------------------------------* * INCLUDE RDEMOWORD97INTEGRATIONTOP * *----------------------------------------------------------------------* REPORT SAPRDEMOWORD97INTEGRATION MESSAGE-ID DEMOOFFICEINTEGRATIO. CONSTANTS: TRUE VALUE 1, FALSE VALUE 0. TYPES: BEGIN OF DOCUMENT_DESCR, DOCUMENT_NAME(40), DOCUMENT_ID(64), END OF DOCUMENT_DESCR. TYPES: DOCUMENT_LIST TYPE DOCUMENT_DESCR OCCURS 0. TYPES: T_URL LIKE BAPIURI-URI. * dynpro 100 fields: DATA: TEMPLATE(30),SEARCH(19), USER(19), COMPANY(19), MACRO(19), MENU(19), MENUITEM(19),MENUBAR(19), EVENT(19). DATA: REPLACE LIKE SEARCH. DATA: CURRENTMENUBAR LIKE MENUBAR, CURRENTMENU LIKE MENU, OPEN_DOCUMENT(1). DATA: ITEM_URL TYPE T_URL. DATA: PROJECT_NAME(80) VALUE 'Office Integration', "#EC NOTEXT PROJECT_TOPIC(80) VALUE 'Word97 Integration', "#EC NOTEXT DEPARTMENT(40) VALUE 'SAP AG', "#EC NOTEXT AUTHOR(30) VALUE 'Ehre', "#EC NOTEXT DISTR_LIST(30) VALUE 'SAP01', PROPOSAL(40), COMMENT(128). SET SCREEN 100. TYPE-POOLS: SBDST. INCLUDE OFFICEINTEGRATIONINCLUDE. DATA: FCODE LIKE SY-UCOMM.
*----------------------------------------------------------------------* * INCLUDE OFFICEINTEGRATIONINCLUDE * *----------------------------------------------------------------------* TYPE-POOLS: SOI. TYPE-POOLS: CNDP. CLASS C_OI_ERRORS DEFINITION LOAD. CLASS CL_GUI_CFW DEFINITION LOAD. INCLUDE OFFICEINTEGRATIONINTERFACES. INCLUDE OFFICEINTEGRATIONOLECREATOR. INCLUDE OFFICEINTEGRATIONOLECLASSESIMP.
*----------------------------------------------------------------------* * INCLUDE OFFICEINTEGRATIONINTERFACES * *----------------------------------------------------------------------* TYPES: T_OI_RET_STRING TYPE SOI_RET_STRING, T_OI_CUSTOM_PARAM TYPE SOI_CUSTOM_PARAM. TYPES: T_OI_MESSAGE_PARAM(50) TYPE C. TYPES: T_OI_PROXY_ERROR_CODE TYPE I. TYPES: T_OI_FIELDS_TABLE TYPE STANDARD TABLE OF RFC_FIELDS. TYPES: T_OI_PROPERTIES_TABLE TYPE STANDARD TABLE OF DPPROPS. CLASS CL_GUI_CFW DEFINITION LOAD. INTERFACE I_OI_DOCUMENT_FACTORY. CONSTANTS: DOCUMENT_FORMAT_COMPOUND(3) TYPE C VALUE 'OLE', DOCUMENT_FORMAT_NATIVE(6) TYPE C VALUE 'NATIVE', DOCUMENT_FORMAT_RTF(3) TYPE C VALUE 'RTF', DOCUMENT_FORMAT_TEXT(4) TYPE C VALUE 'TEXT'. METHODS: START_FACTORY IMPORTING R3_APPLICATION_NAME TYPE C VALUE(REP_ID) TYPE SY-REPID DEFAULT SY-REPID VALUE(DYNPRO_NR) TYPE SY-DYNNR DEFAULT SY-DYNNR REGISTER_ON_CLOSE_EVENT TYPE C DEFAULT ' ' REGISTER_ON_CUSTOM_EVENT TYPE C DEFAULT ' ' VALUE(NO_FLUSH) TYPE C DEFAULT ' ' EXPORTING RETCODE TYPE SOI_RET_STRING ERROR TYPE REF TO I_OI_ERROR. METHODS: STOP_FACTORY IMPORTING EXIT_CONTROL_MANAGER TYPE C DEFAULT ' ' VALUE(NO_FLUSH) TYPE C DEFAULT ' ' EXPORTING RETCODE TYPE SOI_RET_STRING ERROR TYPE REF TO I_OI_ERROR. METHODS: LINK_FACTORY IMPORTING VALUE(REP_ID) TYPE SY-REPID VALUE(DYNPRO_NR) TYPE SY-DYNNR VALUE(NO_FLUSH) TYPE C DEFAULT ' ' EXPORTING RETCODE TYPE SOI_RET_STRING ERROR TYPE REF TO I_OI_ERROR. METHODS: GET_DOCUMENT_PROXY IMPORTING DOCUMENT_TYPE TYPE C DOCUMENT_FORMAT TYPE C DEFAULT 'NATIVE' REGISTER_CONTAINER TYPE C DEFAULT ' ' VALUE(NO_FLUSH) TYPE C DEFAULT ' ' EXPORTING DOCUMENT_PROXY TYPE REF TO I_OI_DOCUMENT_PROXY RETCODE TYPE SOI_RET_STRING ERROR TYPE REF TO I_OI_ERROR. METHODS: GET_LINK_SERVER IMPORTING SERVER_TYPE TYPE C DEFAULT ' ' VALUE(NO_FLUSH) TYPE C DEFAULT ' ' EXPORTING LINK_SERVER TYPE REF TO I_OI_LINK_SERVER RETCODE TYPE SOI_RET_STRING ERROR TYPE REF TO I_OI_ERROR. METHODS: GET_TABLE_COLLECTION IMPORTING VALUE(NO_FLUSH) TYPE C DEFAULT ' ' EXPORTING TABLE_COLLECTION TYPE REF TO I_OI_TABLE_COLLECTION RETCODE TYPE SOI_RET_STRING ERROR TYPE REF TO I_OI_ERROR. METHODS: GET_REGISTERED_DOC_TYPES IMPORTING INTERFACE_TYPE TYPE C DEFAULT ' ' VALUE(NO_FLUSH) TYPE C DEFAULT ' ' EXPORTING DESCR_LIST TYPE SOI_DOCUMENT_TYPE_DESCR_LIST RETCODE TYPE SOI_RET_STRING ERROR TYPE REF TO I_OI_ERROR. METHODS: CHECK_REGISTERED_DOC_TYPES IMPORTING VALUE(NO_FLUSH) TYPE C DEFAULT ' ' EXPORTING ERROR TYPE REF TO I_OI_ERROR CHANGING DESCR_LIST TYPE SOI_DOCUMENT_TYPE_DESCR_LIST RETCODE TYPE SOI_RET_STRING. ENDINTERFACE.
*----------------------------------------------------------------------* CLASS C_OI_OLE_CONTROL_CREATOR DEFINITION. PUBLIC SECTION. CLASS-METHODS: GET_OLE_CONTAINER_CONTROL EXPORTING CONTROL TYPE REF TO I_OI_OLE_CONTAINER_CONTROL RETCODE TYPE SOI_RET_STRING ERROR TYPE REF TO I_OI_ERROR. ENDCLASS. CLASS C_OI_FACTORY_CREATOR DEFINITION. PUBLIC SECTION. CONSTANTS: FACTORY_TYPE_OLE(3) TYPE C VALUE 'OLE', FACTORY_TYPE_PORTABLE(8) TYPE C VALUE 'PORTABLE'. CLASS-METHODS: GET_DOCUMENT_FACTORY IMPORTING FACTORY_TYPE TYPE C DEFAULT 'PORTABLE' EXPORTING FACTORY TYPE REF TO I_OI_DOCUMENT_FACTORY RETCODE TYPE SOI_RET_STRING ERROR TYPE REF TO I_OI_ERROR. ENDCLASS. CLASS C_OI_OLE_DOCUMENT_FACTORY DEFINITION. PUBLIC SECTION. INTERFACES: I_OI_DOCUMENT_FACTORY. PRIVATE SECTION. DATA: CONTAINER_CONTROL TYPE REF TO I_OI_OLE_CONTAINER_CONTROL. ENDCLASS.
*----------------------------------------------------------------------* * INCLUDE OFFICEINTEGRATIONIMPL * *----------------------------------------------------------------------* CLASS c_oi_factory_creator IMPLEMENTATION. METHOD get_document_factory. * IMPORTING factory_type TYPE c * EXPORTING factory TYPE REF TO i_oi_document_factory * retcode TYPE c. DATA: olefactoryobj TYPE REF TO c_oi_ole_document_factory. DATA: has_activex,has_javabean. * DATA: WINSYS TYPE OLELOAD-WINSYS. * determine window system * CALL FUNCTION 'WS_QUERY' * EXPORTING QUERY = 'WS' * IMPORTING RETURN = WINSYS. * CASE WINSYS. * WHEN 'WN32'. * CREATE OBJECT OLEFACTORYOBJ. * FACTORY = OLEFACTORYOBJ. * RETCODE = C_OI_ERRORS=>RET_OK. * WHEN 'JAVA'. * CREATE OBJECT OLEFACTORYOBJ. * FACTORY = OLEFACTORYOBJ. * RETCODE = C_OI_ERRORS=>RET_OK. * WHEN 'PLAT'. * CREATE OBJECT OLEFACTORYOBJ. * FACTORY = OLEFACTORYOBJ. * RETCODE = C_OI_ERRORS=>RET_OK. * WHEN OTHERS. * RETCODE = C_OI_ERRORS=>RET_ERROR. * ENDCASE. CALL FUNCTION 'GUI_HAS_ACTIVEX' IMPORTING return = has_activex. CALL FUNCTION 'GUI_HAS_JAVABEANS' IMPORTING return = has_javabean. IF ( NOT has_activex IS INITIAL ) OR ( NOT has_javabean IS INITIAL ). CREATE OBJECT olefactoryobj. factory = olefactoryobj. retcode = c_oi_errors=>ret_ok. ELSE. retcode = c_oi_errors=>ret_error. ENDIF. CALL METHOD c_oi_errors=>create_error_for_retcode EXPORTING retcode = retcode no_flush = ' ' IMPORTING error = error. ENDMETHOD. ENDCLASS. CLASS c_oi_ole_control_creator IMPLEMENTATION. METHOD get_ole_container_control. * EXPORTING control TYPE REF TO i_oi_container_control * retcode TYPE t_oi_ret_string. DATA: l_control TYPE REF TO i_oi_container_control. CALL METHOD c_oi_container_control_creator=>get_container_control IMPORTING control = l_control retcode = retcode error = error. control ?= l_control. ENDMETHOD. ENDCLASS. CLASS c_oi_ole_document_factory IMPLEMENTATION. METHOD i_oi_document_factory~start_factory. * IMPORTING r3_application_name TYPE c * value(rep_id) type sy-repid default sy-repid * value(dynpro_nr) type sy-dynnr * default sy-dynnr * register_on_close_event type c default ' ' * register_on_custom_event type c default ' ' * RETURNING value(retcode) TYPE c. IF container_control IS INITIAL. CALL METHOD c_oi_ole_control_creator=>get_ole_container_control IMPORTING control = container_control retcode = retcode. IF retcode EQ c_oi_errors=>ret_ok. CALL METHOD container_control->init_control EXPORTING r3_application_name = r3_application_name inplace_mode = 0 rep_id = rep_id shell_style = cl_gui_control=>ws_child dynpro_nr = dynpro_nr parent = cl_gui_container=>default_screen register_on_close_event = register_on_close_event register_on_custom_event = register_on_custom_event no_flush = no_flush IMPORTING retcode = retcode error = error. ELSE. CALL METHOD c_oi_errors=>create_error_for_retcode EXPORTING retcode = retcode no_flush = no_flush IMPORTING error = error. ENDIF. ELSE. " already created retcode = c_oi_errors=>ret_ok. CALL METHOD c_oi_errors=>create_error_for_retcode EXPORTING retcode = retcode no_flush = no_flush IMPORTING error = error. ENDIF. ENDMETHOD. METHOD i_oi_document_factory~stop_factory. * IMPORTING exit_control_manager TYPE c DEFAULT 'X' * RETURNING value(retcode) TYPE c. IF NOT container_control IS INITIAL. CALL METHOD container_control->destroy_control EXPORTING no_flush = no_flush IMPORTING retcode = retcode error = error. ELSE. " already destroyed retcode = c_oi_errors=>ret_ok. CALL METHOD c_oi_errors=>create_error_for_retcode EXPORTING retcode = retcode no_flush = no_flush IMPORTING error = error. ENDIF. ENDMETHOD. METHOD i_oi_document_factory~link_factory. * IMPORTING value(rep_id) LIKE sy-repid * value(dynpro_nr) LIKE sy-dynnr * RETURNING value(retcode) TYPE t_oi_ret_string. IF NOT container_control IS INITIAL. CALL METHOD container_control->link_control EXPORTING rep_id = rep_id dynpro_nr = dynpro_nr no_flush = no_flush IMPORTING retcode = retcode error = error. ELSE. retcode = c_oi_errors=>ret_object_not_initialized. CALL METHOD c_oi_errors=>create_error_for_retcode EXPORTING retcode = retcode no_flush = no_flush IMPORTING error = error. ENDIF. ENDMETHOD. METHOD i_oi_document_factory~get_document_proxy. * IMPORTING document_type TYPE c * EXPORTING document_proxy TYPE * REF TO i_oi_document_proxy * retcode TYPE c. IF NOT container_control IS INITIAL. CALL METHOD container_control->get_document_proxy EXPORTING document_type = document_type document_format = document_format register_container = register_container no_flush = no_flush IMPORTING document_proxy = document_proxy retcode = retcode error = error. ELSE. retcode = c_oi_errors=>ret_object_not_initialized. CALL METHOD c_oi_errors=>create_error_for_retcode EXPORTING retcode = retcode no_flush = no_flush IMPORTING error = error. ENDIF. ENDMETHOD. METHOD i_oi_document_factory~get_link_server. * IMPORTING server_type TYPE c DEFAULT ' ' * EXPORTING link_server TYPE REF TO i_oi_link_server * retcode TYPE t_oi_ret_string. IF NOT container_control IS INITIAL. CALL METHOD container_control->get_link_server EXPORTING server_type = server_type no_flush = no_flush IMPORTING link_server = link_server retcode = retcode error = error. ELSE. retcode = c_oi_errors=>ret_object_not_initialized. CALL METHOD c_oi_errors=>create_error_for_retcode EXPORTING retcode = retcode no_flush = no_flush IMPORTING error = error. ENDIF. ENDMETHOD. METHOD i_oi_document_factory~get_table_collection. * EXPORTING table_collection TYPE * REF TO i_oi_table_collection * retcode TYPE t_oi_ret_string. IF NOT container_control IS INITIAL. CALL METHOD container_control->get_table_collection EXPORTING no_flush = no_flush IMPORTING table_collection = table_collection retcode = retcode error = error. ELSE. retcode = c_oi_errors=>ret_object_not_initialized. CALL METHOD c_oi_errors=>create_error_for_retcode EXPORTING retcode = retcode no_flush = no_flush IMPORTING error = error. ENDIF. ENDMETHOD. METHOD i_oi_document_factory~get_registered_doc_types. * IMPORTING interface_type TYPE c DEFAULT ' ' * EXPORTING descr_list TYPE t_oi_interface_descr_list * retcode TYPE t_oi_ret_string. IF NOT container_control IS INITIAL. CALL METHOD container_control->get_registered_doc_types EXPORTING interface_type = interface_type no_flush = no_flush IMPORTING descr_list = descr_list retcode = retcode error = error. ELSE. retcode = c_oi_errors=>ret_object_not_initialized. CALL METHOD c_oi_errors=>create_error_for_retcode EXPORTING retcode = retcode no_flush = no_flush IMPORTING error = error. ENDIF. ENDMETHOD. METHOD i_oi_document_factory~check_registered_doc_types. * CHANGING descr_list TYPE t_oi_interface_descr_list * retcode TYPE t_oi_ret_string. IF NOT container_control IS INITIAL. CALL METHOD container_control->check_registered_doc_types EXPORTING no_flush = no_flush IMPORTING error = error CHANGING descr_list = descr_list retcode = retcode. ELSE. retcode = c_oi_errors=>ret_object_not_initialized. CALL METHOD c_oi_errors=>create_error_for_retcode EXPORTING retcode = retcode no_flush = no_flush IMPORTING error = error. ENDIF. ENDMETHOD. ENDCLASS.
***INCLUDE OLE2INCL. TYPE-POOLS OLE2 .