TYPES: BEGIN OF xml_line_type, data(256) TYPE x, END OF xml_line_type, xml_tab_type TYPE TABLE OF xml_line_type, xml_element TYPE REF TO if_ixml_element. DATA:unicodelg LIKE x030l-unicodelg, temp_fore_filename TYPE string, curr_object_type TYPE i, percentage TYPE p DECIMALS 2, obj_perc TYPE p DECIMALS 2, temp_back_filename LIKE rlgrap-filename, g_iref_root_elem TYPE REF TO if_ixml_element, g_iref_pixml TYPE REF TO if_ixml, g_iref_pdocument TYPE REF TO if_ixml_document, g_iref_pstreamfactory TYPE REF TO if_ixml_stream_factory, gt_converted_data TYPE xml_tab_type, g_ostream TYPE REF TO if_ixml_ostream, g_buffer_itab TYPE xml_tab_type, g_strx TYPE xstring, gv_tabix TYPE sy-tabix, g_file_append_mode TYPE char01 VALUE space. DATA:p_fore TYPE char128 VALUE 'C:Userswangz94Desktopxmlxml.xml', p_back TYPE rlgrap-filename, r_fore TYPE c VALUE 'X', r_back TYPE c VALUE '', no_usage TYPE c, popup_ok TYPE c VALUE 'X', new_line TYPE string. CONSTANTS: encoding(10) TYPE c VALUE 'UTF-8', num_object_types TYPE i VALUE 48, * Test mode definiton - do not change panaya_test_mode TYPE c VALUE space, show_servers_name TYPE c VALUE 'X', skip_empty_tags TYPE c VALUE 'X', buffer_max_size TYPE i VALUE 10000000, general_part_ver(15) TYPE c VALUE '2.36', rel_specific_ver(15) TYPE c VALUE '10_2005', root_element_name(30) TYPE c VALUE 'ROOT_ELEMENT'. temp_fore_filename = p_fore. * Create the main factory and the initial document PERFORM create_xml_document. * Create the root element of the XML PERFORM xml_header USING g_iref_pdocument root_element_name CHANGING g_iref_root_elem. PERFORM open_xml_file. * Add data to the XML PERFORM add_data_to_xml. PERFORM close_xml_file. FORM add_data_to_xml. PERFORM add_document_header. ENDFORM. *---------------------------------------------------------------------* * FORM create_xml_document 创建XML文件 * *---------------------------------------------------------------------* FORM create_xml_document. DATA: l_encoding TYPE string, i_encoding TYPE REF TO if_ixml_encoding. * create the main factory g_iref_pixml = cl_ixml=>create( ). * create the initial document g_iref_pdocument = g_iref_pixml->create_document( ). l_encoding = encoding. i_encoding = g_iref_pixml->create_encoding( character_set = l_encoding byte_order = '0' ). CALL METHOD g_iref_pdocument->set_encoding( encoding = i_encoding ). ENDFORM. " create_xml_document *---------------------------------------------------------------------* * FORM xml_header(XML 头部信息) * *---------------------------------------------------------------------* FORM xml_header USING VALUE(pi_pdocument) TYPE REF TO if_ixml_document VALUE(pi_xml_root) TYPE c CHANGING VALUE(pc_elem) TYPE REF TO if_ixml_element. DATA: l_simple_elem TYPE REF TO if_ixml_element, l_elem TYPE REF TO if_ixml_element, l_result TYPE i, l_name TYPE string. l_name = pi_xml_root . l_elem = pi_pdocument->create_element( name = l_name ). l_result = pi_pdocument->append_child( l_elem ). pc_elem = l_elem. ENDFORM. " xml_header *---------------------------------------------------------------------* * FORM add_attribute_to_node (XML节点属性) * *---------------------------------------------------------------------* FORM add_attribute_to_node USING VALUE(pi_elem) TYPE REF TO if_ixml_element VALUE(pi_attr_name) TYPE string VALUE(pi_value) TYPE any. DATA: l_value TYPE string. l_value = pi_value. IF l_value IS INITIAL AND NOT skip_empty_tags IS INITIAL. EXIT. ENDIF. CALL METHOD pi_elem->set_attribute EXPORTING name = pi_attr_name value = l_value. ENDFORM. "add_attribute_to_node *&---------------------------------------------------------------------* *& Form add_document_header *&---------------------------------------------------------------------* FORM add_document_header. DATA: header_node TYPE xml_element. DATA: code_version(15) TYPE c. DATA: lv_text TYPE char10, lv_license TYPE char10, lv_mode TYPE char10, lv_logsys TYPE logsys, lv_rfc_sysid TYPE sy-sysid, lv_rfc_mandt TYPE sy-mandt. DATA: k_release TYPE sysaprl, k_patch TYPE sychar05. DATA: host TYPE string. * Create a child node for the Header node PERFORM create_xml_node USING g_iref_pdocument g_iref_root_elem 'HEADER' CHANGING header_node. * Set Date lv_text = sy-datum. PERFORM add_attribute_to_node USING header_node 'DATE' lv_text. * Set Time lv_text = sy-uzeit. PERFORM add_attribute_to_node USING header_node 'TIME' lv_text. * Set Application Server IF show_servers_name IS INITIAL. host = 'XXX'. ELSE. host = sy-host. ENDIF. PERFORM add_attribute_to_node USING header_node 'APPLICATION_SERVER' host. * Set System ID name PERFORM add_attribute_to_node USING header_node 'SYSTEM_ID' sy-sysid. * Set Client number PERFORM add_attribute_to_node USING header_node 'CLIENT' sy-mandt. * Set Operating System PERFORM add_attribute_to_node USING header_node 'OPERATING_SYSTEM' sy-opsys. * Set SAP System Release PERFORM add_attribute_to_node USING header_node 'SYSTEM_RELEASE' sy-saprl. * Set Installation number CALL FUNCTION 'SLIC_GET_LICENCE_NUMBER' IMPORTING license_number = lv_license. PERFORM add_attribute_to_node USING header_node 'INSTALLATION_NUMBER' lv_license. * Set User name PERFORM add_attribute_to_node USING header_node 'USER_NAME' sy-uname. * Set Export Tool Version CONCATENATE general_part_ver rel_specific_ver INTO code_version SEPARATED BY '.'. PERFORM add_attribute_to_node USING header_node 'EXPORT_TOOL_VERSION' code_version. * Set Target System PERFORM add_attribute_to_node USING header_node 'TARGET_SYSTEM' 'DR1'. * Set Target System Id ( production system id ) PERFORM add_attribute_to_node USING header_node 'TARGET_SYSTEM_ID' 'rfc_sysid'. * Set Target system release PERFORM add_attribute_to_node USING header_node 'TARGET_SYSTEM_REL' 'rfc_saprl'. * Set ETL vanilla extraction flag PERFORM add_attribute_to_node USING header_node 'VANILLA_EXTRACTION' 'X'. * Set SM Target System PERFORM add_attribute_to_node USING header_node 'SM_SYSTEM' 'p_sm_rfc'. * Set SM System Id PERFORM add_attribute_to_node USING header_node 'SM_SYSTEM_ID' 'sm_sysid'. * Set SM system release PERFORM add_attribute_to_node USING header_node 'SM_SYSTEM_REL' 'sm_saprl'. * Set execution mode IF r_back IS INITIAL. lv_mode = 'FOREGROUND'. ELSE. lv_mode = 'BACKGROUND'. ENDIF. PERFORM add_attribute_to_node USING header_node 'MODE' lv_mode. PERFORM add_attribute_to_node USING header_node 'PRD_LOGSYS' 'gv_logsys'. CALL FUNCTION 'PARTNER_LOGICAL_SYSTEM_GET' IMPORTING p_logsys = lv_logsys EXCEPTIONS own_logical_system_not_defined = 1 OTHERS = 2. IF sy-subrc <> 0. lv_logsys = 'UNDEFINED'. ENDIF. PERFORM add_attribute_to_node USING header_node 'LOCAL_LOGSYS' lv_logsys. * Add unicode length of the current system PERFORM add_attribute_to_node USING header_node 'UCLEN' unicodelg. * Add active industry solution when applicable PERFORM add_attribute_to_node USING header_node 'ACTIVE_INDUSTRY_SOLUTION' 'active_industry_solution'. * Add usage only PERFORM add_attribute_to_node USING header_node 'USAGE_ONLY' 'usageonl'. PERFORM add_attribute_to_node USING header_node 'IA_DATA_ONLY' 'ia_data_only'. PERFORM add_attribute_to_node USING header_node 'REQUIRE_SOLMAN_RFC' 'require_solman_rfc'. PERFORM add_attribute_to_node USING header_node 'TESTING_DATA_ONLY' 'testing_data_only'. PERFORM add_attribute_to_node USING header_node 'NO_SUET_DATA' 'no_suet_data'. PERFORM add_attribute_to_node USING header_node 'EXTRACT_DEBUG' 'extract_debug'. PERFORM add_attribute_to_node USING header_node 'EXTRACT_FULL_USAGE' 'extract_full_usage'. PERFORM add_attribute_to_node USING header_node 'EXTRACT_WORKFLOW_DATA' 'extract_workflow_data'. PERFORM add_attribute_to_node USING header_node 'GET_AGR_USERS' 'get_agr_users'. * Add version specific header attributes * PERFORM version_specific_header_attrib USING header_node. PERFORM add_attribute_to_node USING header_node 'MINI_VERSION' 'HEADER_MINI_VERSION'. * Add kernel data PERFORM get_kernel_data CHANGING k_release k_patch. PERFORM add_attribute_to_node USING header_node 'KERNEL_RELEASE' k_release. PERFORM add_attribute_to_node USING header_node 'KERNEL_PATCH' k_patch. PERFORM add_attribute_to_node USING header_node 'EXTRACT_USER_DATA' 'extract_user_data'. PERFORM add_attribute_to_node USING header_node 'SM_SYSTEM' 'p_sm_rfc'. * Set SM System Id PERFORM add_attribute_to_node USING header_node 'SM_SYSTEM_ID' 'sm_sysid'. * Set SM system release PERFORM add_attribute_to_node USING header_node 'SM_SYSTEM_REL' 'sm_saprl'. * Set bw extraction system data * BW system PERFORM add_attribute_to_node USING header_node 'BW_DESTINATION' 'p_bw_rfc'. * CALL FUNCTION 'SCT2_GET_T000_ENTRY_RFC' DESTINATION p_bw_rfc * IMPORTING * ev_sysid = lv_rfc_sysid * ev_mandt = lv_rfc_mandt * EXCEPTIONS * system_failure = 1 * communication_failure = 2. * Set BW System ID PERFORM add_attribute_to_node USING header_node 'BW_SYSID' 'lv_rfc_sysid'. * Set BW Client PERFORM add_attribute_to_node USING header_node 'BW_CLIENT' 'lv_rfc_mandt'. * Set the local system and target system's types PERFORM add_system_types_to_header USING header_node. PERFORM append_xml_element_to_file USING header_node 'X'. ENDFORM. " add_document_header *&---------------------------------------------------------------------* *& Form ADD_SYSTEM_TYPES_TO_HEADER *&---------------------------------------------------------------------* * ........ * *----------------------------------------------------------------------* FORM add_system_types_to_header USING iv_header_node TYPE REF TO if_ixml_element. DATA: ls_local_system TYPE t000, ls_target_system TYPE t000, ls_rfcdes TYPE rfcdes, ls_rfcdisplay TYPE rfcdisplay. DATA: lv_prefix TYPE string, lv_suffix TYPE string, lv_target_mandt TYPE mandt. DATA: options TYPE TABLE OF rfc_db_opt, fields TYPE TABLE OF rfc_db_fld, t000_itab TYPE TABLE OF t000. * Local system's type SELECT SINGLE * FROM t000 INTO CORRESPONDING FIELDS OF ls_local_system WHERE mandt EQ sy-mandt. IF sy-subrc IS INITIAL. PERFORM add_attribute_to_node USING iv_header_node 'LOCAL_SYSTEM_TYPE' ls_local_system-cccategory. MESSAGE s000(conv) WITH 'LOCAL_SYSTEM_TYPE =' ls_local_system-cccategory. ENDIF. * Target system's type SELECT SINGLE * FROM rfcdes BYPASSING BUFFER INTO CORRESPONDING FIELDS OF ls_rfcdes WHERE rfcdest EQ 'DR1'. IF sy-subrc IS INITIAL. SPLIT ls_rfcdes-rfcoptions AT ',M=' INTO lv_prefix lv_suffix. IF sy-subrc IS INITIAL AND NOT lv_suffix IS INITIAL. lv_target_mandt = lv_suffix(3). ENDIF. ENDIF. * Get target system T000 table CALL FUNCTION 'RFC_READ_TABLE' DESTINATION 'DR1' EXPORTING query_table = 'T000' delimiter = space no_data = space rowskips = 0 rowcount = 0 TABLES options = options fields = fields data = t000_itab EXCEPTIONS table_not_available = 1 table_without_data = 2 option_not_valid = 3 field_not_valid = 4 not_authorized = 5 data_buffer_exceeded = 6 OTHERS = 7. IF sy-subrc IS INITIAL AND NOT t000_itab IS INITIAL. IF NOT lv_target_mandt IS INITIAL. * Read target T000 with mandt READ TABLE t000_itab INTO ls_target_system WITH KEY mandt = lv_target_mandt. IF NOT sy-subrc IS INITIAL. * Fallback: Mandt not found Read target T000 with cccategory = 'P' * CONCATENATE * 'No results in target system T000 table' * 'for target MANDT found:' lv_target_mandt * 'Reading T000 with cccategory = P' * INTO gt_etl_message-message SEPARATED BY space. * PERFORM add_message USING gt_etl_message-message abap_false. READ TABLE t000_itab INTO ls_target_system WITH KEY cccategory = 'P'. ENDIF. ELSE. * Fallback: No mandt: Read target T000 with cccategory = 'P' * CONCATENATE * 'Failed to get MANDT, Reading target system T000' * 'table with cccategory = P' * INTO gt_etl_message-message SEPARATED BY space. * PERFORM add_message USING gt_etl_message-message abap_false. READ TABLE t000_itab INTO ls_target_system WITH KEY cccategory = 'P'. ENDIF. ENDIF. IF NOT ls_target_system IS INITIAL. PERFORM add_attribute_to_node USING iv_header_node 'TARGET_SYSTEM_TYPE' ls_target_system-cccategory. ENDIF. ENDFORM. " ADD_SYSTEM_TYPES_TO_HEADER *---------------------------------------------------------------------* * FORM GET_KERNEL_DATA * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* * --> EV_KRELEASE * * --> EV_KLEVEL * *---------------------------------------------------------------------* FORM get_kernel_data CHANGING ev_krelease ev_klevel. TYPES: BEGIN OF t_kernel_version, key(21) TYPE c, data(69) TYPE c, END OF t_kernel_version. DATA: lt_kernel_version TYPE TABLE OF t_kernel_version WITH HEADER LINE, ls_kernel_version TYPE t_kernel_version. CALL 'SAPCORE' ID 'ID' FIELD 'VERSION' ID 'TABLE' FIELD lt_kernel_version-*sys*. READ TABLE lt_kernel_version INTO ls_kernel_version INDEX 12. ev_krelease = ls_kernel_version-data. READ TABLE lt_kernel_version INTO ls_kernel_version INDEX 15. ev_klevel = ls_kernel_version-data. ENDFORM. "GET_KERNEL_DATA *---------------------------------------------------------------------* * FORM create_xml_node(创建XML 节点) * *---------------------------------------------------------------------* FORM create_xml_node USING VALUE(pi_pdocument) TYPE REF TO if_ixml_document VALUE(parent_element) TYPE REF TO if_ixml_element VALUE(pi_xml_node) TYPE string CHANGING VALUE(pc_elem) TYPE REF TO if_ixml_element. pc_elem = pi_pdocument->create_simple_element( name = pi_xml_node parent = parent_element ). ENDFORM. " create_xml_node *---------------------------------------------------------------------* * FORM create_xml_node_value_cdata * *---------------------------------------------------------------------* FORM create_xml_node_value_cdata USING VALUE(pi_pdocument) TYPE REF TO if_ixml_document VALUE(parent_element) TYPE REF TO if_ixml_element VALUE(pi_xml_node) TYPE string VALUE(pi_value) TYPE any VALUE(pi_with_cdata) TYPE c CHANGING VALUE(pc_elem) TYPE REF TO if_ixml_element. DATA: l_value TYPE string. IF pi_with_cdata = 'X'. DATA: rval TYPE REF TO if_ixml_cdata_section. l_value = pi_value. CALL METHOD pi_pdocument->create_cdata_section EXPORTING cdata = l_value RECEIVING rval = rval. pc_elem = pi_pdocument->create_simple_element( name = pi_xml_node * value = l_value parent = parent_element ). CALL METHOD pc_elem->append_child EXPORTING new_child = rval. ELSE. l_value = pi_value. pc_elem = pi_pdocument->create_simple_element( name = pi_xml_node value = l_value parent = parent_element ). ENDIF. ENDFORM. " create_xml_node_value *---------------------------------------------------------------------* * FORM close_xml_file * *---------------------------------------------------------------------* FORM close_xml_file. DATA: stream_size TYPE i, msg_line1(70) TYPE c, msg_line2(70) TYPE c, msg_line3(70) TYPE c. PERFORM append_string_to_file USING '</ROOT_ELEMENT>'. * flush the buffered data to the file - last time stream_size = g_ostream->get_num_written_raw( ). PERFORM append_itab_to_file USING stream_size g_buffer_itab. * Write the file to original location PERFORM move_file USING temp_fore_filename temp_back_filename p_fore p_back r_fore. * Display finish message IF panaya_test_mode IS INITIAL. msg_line1 = 'The data extraction was finished successfully.'. IF no_usage = 'X'. msg_line2 = 'Please note: No usage statistics were found.'. msg_line3 = 'Contact Panaya support for assistance.'. IF popup_ok = 'X'. CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT_LO' EXPORTING titel = 'Panaya' textline1 = msg_line1 textline2 = msg_line2 textline3 = msg_line3 start_column = 15 start_row = 6. ELSE. WRITE:/ msg_line1. WRITE:/ msg_line2. WRITE:/ msg_line3. ENDIF. ELSE. IF popup_ok = 'X'. CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT_LO' EXPORTING titel = 'Panaya' textline1 = msg_line1 start_column = 15 start_row = 6. ELSE. WRITE:/ msg_line1. WRITE:/ msg_line2. WRITE:/ msg_line3. ENDIF. ENDIF. ENDIF. ENDFORM. "close_xml_file *---------------------------------------------------------------------* * FORM append_string_to_file * *---------------------------------------------------------------------* FORM append_string_to_file USING str TYPE string. CALL METHOD g_ostream->write_string EXPORTING string = new_line. CALL METHOD g_ostream->write_string EXPORTING string = str. CALL METHOD g_ostream->write_string EXPORTING string = new_line. ENDFORM. "append_string_to_file *---------------------------------------------------------------------* * FORM append_itab_to_file * *---------------------------------------------------------------------* FORM append_itab_to_file USING i_stream_size TYPE i i_tab_converted_data TYPE xml_tab_type. DATA: l_oref TYPE REF TO cx_root, text TYPE string. DATA: l_file TYPE string. DATA: ls_file TYPE xml_line_type. DATA: l_remaining_size TYPE i. DATA: l_recsize TYPE i. IF NOT r_fore IS INITIAL. l_file = temp_fore_filename. CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = i_stream_size filename = l_file filetype = 'BIN' append = g_file_append_mode CHANGING data_tab = i_tab_converted_data EXCEPTIONS file_write_error = 1 no_batch = 2 gui_refuse_filetransfer = 3 invalid_type = 4 no_authority = 5 unknown_error = 6 header_not_allowed = 7 separator_not_allowed = 8 filesize_not_allowed = 9 header_too_long = 10 dp_error_create = 11 dp_error_send = 12 dp_error_write = 13 unknown_dp_error = 14 access_denied = 15 dp_out_of_memory = 16 disk_full = 17 dp_timeout = 18 file_not_found = 19 dataprovider_exception = 20 control_flush_error = 21 not_supported_by_gui = 22 error_no_gui = 23 OTHERS = 24. IF sy-subrc <> 0. DATA: explan TYPE string. IF sy-subrc = 17. explan = 'Disk is full'. ELSE. explan = sy-subrc. ENDIF. MESSAGE e000(conv) WITH 'Problem writing to file: ' explan. ENDIF. ENDIF. * Server file IF NOT r_back IS INITIAL. * Open file IF g_file_append_mode IS INITIAL. OPEN DATASET temp_back_filename FOR OUTPUT IN BINARY MODE. ELSE. OPEN DATASET temp_back_filename FOR APPENDING IN BINARY MODE. ENDIF. * Write file l_remaining_size = i_stream_size. LOOP AT i_tab_converted_data INTO ls_file. IF l_remaining_size < 256. l_recsize = l_remaining_size. ELSE. l_recsize = 256. ENDIF. TRANSFER ls_file TO temp_back_filename LENGTH l_recsize. SUBTRACT l_recsize FROM l_remaining_size. ENDLOOP. * Close file CLOSE DATASET temp_back_filename . IF sy-subrc IS INITIAL. * MESSAGE s171(26) WITH p_back. * File & created ELSE. * MESSAGE e005(ps). * Cannot close output file ENDIF. ENDIF. * The first time we write the file in overwrite mode, then we switch * to append mode IF g_file_append_mode IS INITIAL. g_file_append_mode = 'X'. ENDIF. ENDFORM. "append_itab_to_file *&---------------------------------------------------------------------* *& Form MOVE_FILE *&---------------------------------------------------------------------* * Move file from initial location to the location specified by * user *----------------------------------------------------------------------* FORM move_file USING p_temp_fore_file p_temp_back_file p_orig_fore_file p_orig_back_file p_is_fore. DATA: explan TYPE string, error_msg TYPE string, curr_line_len TYPE i, data(256) TYPE c, filename1 TYPE string, filename2 TYPE string. DATA: l_oref TYPE REF TO cx_root, text TYPE string, text_len TYPE i, param1(50) TYPE c, param2(50) TYPE c, param3(50) TYPE c, param4(50) TYPE c. IF NOT p_is_fore IS INITIAL. * Copy the file to original location filename1 = p_temp_fore_file. filename2 = p_orig_fore_file. CALL METHOD cl_gui_frontend_services=>file_copy EXPORTING source = filename1 destination = filename2 overwrite = 'X' EXCEPTIONS cntl_error = 1 error_no_gui = 2 wrong_parameter = 3 disk_full = 4 access_denied = 5 file_not_found = 6 destination_exists = 7 unknown_error = 8 path_not_found = 9 disk_write_protect = 10 drive_not_ready = 11 OTHERS = 12. IF sy-subrc <> 0. IF sy-subrc = 4. explan = 'Disk is full'. ELSE. explan = sy-subrc. ENDIF. MESSAGE e001(00) WITH 'Problem writing to file: ' p_orig_fore_file explan. ENDIF. * Delete the temporary file * DATA: rc TYPE i. * CALL METHOD cl_gui_frontend_services=>file_delete * EXPORTING * filename = p_temp_fore_file * CHANGING * rc = rc * EXCEPTIONS * file_delete_failed = 1 * cntl_error = 2 * error_no_gui = 3 * file_not_found = 4 * access_denied = 5 * unknown_error = 6 * OTHERS = 7. * IF sy-subrc <> 0. * explan = sy-subrc. * MESSAGE e001(00) WITH 'Problem deleting file: ' p_temp_fore_file * ' return code (RC) = ' rc. * ENDIF. ELSE. * Open the temp file OPEN DATASET p_temp_back_file FOR INPUT IN BINARY MODE MESSAGE error_msg. OPEN DATASET p_orig_back_file FOR OUTPUT IN BINARY MODE MESSAGE error_msg. * Transfer the data to destination file DO. READ DATASET p_temp_back_file INTO data LENGTH curr_line_len. IF sy-subrc <> 0. TRANSFER data TO p_orig_back_file LENGTH curr_line_len. EXIT. ENDIF. TRANSFER data TO p_orig_back_file LENGTH curr_line_len. ENDDO. * Close both files CLOSE DATASET p_temp_back_file. CLOSE DATASET p_orig_back_file. * Delete the file from current directory DELETE DATASET p_temp_back_file. IF sy-subrc <> 0. MESSAGE e001(00) WITH 'Problem deleting file: ' p_temp_back_file ' SUBC: ' sy-subrc. EXIT. ENDIF. ENDIF. ENDFORM. " MOVE_FILE *---------------------------------------------------------------------* * FORM append_xml_element_to_file * *---------------------------------------------------------------------* FORM append_xml_element_to_file USING i_element TYPE REF TO if_ixml_element i_remove_node TYPE c. DATA: stream_size TYPE i. stream_size = g_ostream->get_num_written_raw( ). IF ( stream_size > buffer_max_size ). PERFORM append_itab_to_file USING stream_size g_buffer_itab. g_ostream = g_iref_pstreamfactory->create_ostream_itable( table = g_buffer_itab ). CALL METHOD g_ostream->set_pretty_print EXPORTING pretty_print = 'X'. CLEAR g_buffer_itab. ENDIF. CALL METHOD g_ostream->write_string EXPORTING string = new_line. CALL METHOD i_element->render( ostream = g_ostream ). IF i_remove_node = 'X'. CALL METHOD i_element->remove_node. CLEAR i_element. ENDIF. ENDFORM. "append_xml_element_to_file *---------------------------------------------------------------------* * FORM open_xml_file * *---------------------------------------------------------------------* FORM open_xml_file. DATA: header_string TYPE string. * Initialize stream factory g_iref_pstreamfactory = g_iref_pixml->create_stream_factory( ). g_ostream = g_iref_pstreamfactory->create_ostream_itable( table = g_buffer_itab ). CALL METHOD g_ostream->set_pretty_print EXPORTING pretty_print = 'X'. CONCATENATE '<?xml version="1.0" encoding="' encoding '"?>' INTO header_string. CALL METHOD g_ostream->write_string EXPORTING string = header_string. PERFORM append_string_to_file USING '<ROOT_ELEMENT>'. ENDFORM. "open_xml_file *&---------------------------------------------------------------------* *& Form add_used_memory_to_log *&---------------------------------------------------------------------* FORM add_used_memory_to_log. DATA: mem_size TYPE abap_msize, mem(25) TYPE c, mem_text(50) TYPE c. IF sy-batch = 'X'. * Used memory log message CALL METHOD cl_abap_memory_utilities=>get_total_used_size IMPORTING size = mem_size. mem = mem_size. CONCATENATE 'Used memory:' mem INTO mem_text SEPARATED BY space. * MESSAGE s000(conv) WITH mem_text. * PERFORM add_message USING mem_text abap_true. ENDIF. ENDFORM. " add_used_memory_to_log *---------------------------------------------------------------------* * FORM update_progress * *---------------------------------------------------------------------* FORM update_progress USING text. DATA: batch_text(50) TYPE c, curr_step(2) TYPE c, total_steps(2) TYPE c, steps_text(50) TYPE c, progress_text(512) TYPE c. curr_object_type = curr_object_type + 1. percentage = percentage + obj_perc. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING percentage = percentage text = text. IF sy-batch = 'X'. curr_step = curr_object_type. total_steps = num_object_types. CONCATENATE '(' curr_step '/' total_steps ')' INTO steps_text. CONCATENATE text steps_text INTO progress_text SEPARATED BY space. * PERFORM ADD_MESSAGE USING PROGRESS_TEXT ABAP_TRUE. PERFORM add_used_memory_to_log. ENDIF. ENDFORM. "update_progress