ABAP Program To Build Internal Table Into XML File
ABAP Program To Build Internal Table Into XML File
SDIXML_DATA_TO_DOM *& FM: SDIXML_DOM_TO_XML *& *& Downloads XML file to "C:\" drive *& *&---------------------------------------------------------------------* REPORT zzmil_xml_sample_001.
*<< Types and Tables Decl. TABLES: vbak, vbap. TYPES: BEGIN OF ty_so_data, vbeln posnr auart matnr matkl pstyv kwmeng END OF ty_so_data, ty_t_so_data *>>
*<< Selection Screen SELECTION-SCREEN BEGIN OF BLOCK block-0 WITH FRAME TITLE text-001. SELECT-OPTIONS: s_vbeln FOR vbak-vbeln. PARAMETERS: p_auart TYPE auart OBLIGATORY. SELECT-OPTIONS: s_vkorg FOR vbak-vkorg, s_vtweg FOR vbak-vtweg, s_matnr FOR vbap-matnr, s_pstyv FOR vbap-pstyv. SELECTION-SCREEN END OF BLOCK block-0. *>> *----------------------------------------------------------------------* * CLASS cl_so_xml DEFINITION *----------------------------------------------------------------------* CLASS cl_so_xml DEFINITION CREATE PUBLIC. PUBLIC SECTION. METHODS: get_so_data. PRIVATE SECTION. METHODS: prepare_so_xml, download_so_xml. DATA: lt_so_data lt_xml DATA:
TYPE i.
TYPE string VALUE 'entity-data', TYPE string VALUE 'so_item'. "cl_so_xml DEFINITION
*----------------------------------------------------------------------* * CLASS cl_execute DEFINITION *----------------------------------------------------------------------* CLASS cl_execute DEFINITION CREATE PUBLIC. PUBLIC SECTION. CLASS-METHODS: execute_report. ENDCLASS. "cl_execute DEFINITION
*----------------------------------------------------------------------* * CLASS cl_so_xml IMPLEMENTATION *----------------------------------------------------------------------* CLASS cl_so_xml IMPLEMENTATION. *<< Get sales order data METHOD get_so_data. SELECT k~vbeln p~posnr k~auart p~matnr p~matkl p~pstyv p~kwmeng FROM vbak AS k INNER JOIN vbap AS p ON p~vbeln = k~vbeln INTO TABLE lt_so_data WHERE k~vbeln IN s_vbeln AND k~auart EQ p_auart AND k~vkorg IN s_vkorg AND k~vtweg IN s_vtweg. "AND * * p~matnr IN p~pstyv IN IF sy-subrc = 0. DELETE lt_so_data WHERE matnr NOT DELETE lt_so_data WHERE pstyv NOT s_matnr AND s_pstyv. IN s_matnr. IN s_pstyv.
SORT lt_so_data BY vbeln posnr. CALL METHOD me->prepare_so_xml. ELSE. MESSAGE 'No data to fetch' TYPE 'S'. ENDIF. ENDMETHOD. *>> *<< Prepare XML data METHOD prepare_so_xml. TYPES: BEGIN OF ty_so_item_data, "get_so_data
posnr matnr matkl pstyv kwmeng END OF ty_so_item_data. DATA: lr_ixml lr_xmldoc lr_root lr_elem_head lr_elem lr_text lr_elem_item lr_nodes lr_child DATA: li_rval li_cnt li_rc li_idx DATA: lc_so DATA: lx_string DATA: lt_so_item_data DATA: ls_so_item_data ls_control FIELD-SYMBOLS: <fs_so_data> * Create the xml document CLASS cl_ixml DEFINITION LOAD. lr_ixml = cl_ixml=>create( ). CHECK NOT lr_ixml IS INITIAL.
TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE
TO TO TO TO TO TO TO TO TO
TYPE string. TYPE xstring. TYPE STANDARD TABLE OF ty_so_item_data. TYPE ty_so_item_data, TYPE dcxmlsercl. TYPE ty_so_data.
lr_xmldoc = lr_ixml->create_document( ). CHECK NOT lr_xmldoc IS INITIAL. * Create the root element lr_root = lr_xmldoc->create_simple_element( name = cc_tag_root parent = lr_xmldoc ). LOOP AT lt_so_data ASSIGNING <fs_so_data>. AT NEW vbeln. REFRESH lt_so_item_data. Create element for every new sales order lr_elem_head = lr_xmldoc->create_simple_element( name = 'Sales_Order' parent = lr_root ). MOVE <fs_so_data>-vbeln TO lc_so. lr_elem = lr_xmldoc->create_element( name = 'VBELN' ). lr_text = lr_xmldoc->create_text( lc_so ). li_rval = lr_elem->append_child( new_child = lr_text ). li_rval = lr_elem_head->append_child( new_child = lr_elem ).
MOVE <fs_so_data>-auart TO lc_so. lr_elem = lr_xmldoc->create_element( name = 'AUART' ). lr_text = lr_xmldoc->create_text( lc_so ). li_rval = lr_elem->append_child( new_child = lr_text ). li_rval = lr_elem_head->append_child( new_child = lr_elem ). ENDAT. MOVE-CORRESPONDING <fs_so_data> TO ls_so_item_data. APPEND ls_so_item_data TO lt_so_item_data. AT END OF vbeln. * Create subtree for all SO items CALL FUNCTION 'SDIXML_DATA_TO_DOM' EXPORTING name = 'Order_Items' dataobject = lt_so_item_data control = ls_control IMPORTING data_as_dom = lr_elem_item CHANGING document = lr_xmldoc EXCEPTIONS illegal_name = 1 OTHERS = 2. Change tag name of node lr_nodes = lr_elem_item->get_children( ). li_cnt = lr_nodes->get_length( ). li_idx = 0. WHILE li_idx < l_cnt. lr_child = lr_nodes->get_item( li_idx ). li_rc = lr_child->set_name( name = cc_order_items_row ). li_idx = li_idx + 1. ENDWHILE. Add subtree for all SO items li_rval = lr_elem_head->append_child( new_child = lr_elem_item ). ENDAT. ENDLOOP. * Serialization CALL FUNCTION 'SDIXML_DOM_TO_XML' EXPORTING document = lr_xmldoc IMPORTING xml_as_string = lx_string size = li_size TABLES xml_as_table = lt_xml EXCEPTIONS no_document = 1 OTHERS = 2. IF lt_xml IS NOT INITIAL. CALL METHOD me->download_so_xml. ENDIF. ENDMETHOD. *>> "get_so_data
* * * * * * * * * *
CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = li_size filename = 'C:\SO_DATA_XML.XML' filetype = 'BIN' CHANGING data_tab = lt_xml 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. ENDIF. ENDMETHOD. *>> ENDCLASS. "download_so_xml "cl_so_xml IMPLEMENTATION
*----------------------------------------------------------------------* * CLASS cl_execute IMPLEMENTATION *----------------------------------------------------------------------* CLASS cl_execute IMPLEMENTATION. METHOD execute_report. DATA: or_so_xml TYPE REF TO cl_so_xml. CREATE OBJECT or_so_xml. CALL METHOD or_so_xml->get_so_data. ENDMETHOD. ENDCLASS. "execute "cl_execute_report IMPLEMENTATION