*&---------------------------------------------------------------------* *& Report ZDEMO_EXCEL11 *& Export Organisation and Contact Persons using ABAP2XLSX *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zdemo_excel11. TYPE-POOLS: abap. DATA: central_search TYPE bapibus1006_central_search, addressdata_search TYPE bapibus1006_addr_search, others_search TYPE bapibus1006_other_data. DATA: searchresult TYPE TABLE OF bapibus1006_bp_addr, return TYPE TABLE OF bapiret2. DATA: lines TYPE i. FIELD-SYMBOLS: <searchresult_line> LIKE LINE OF searchresult. DATA: centraldata TYPE bapibus1006_central, centraldataperson TYPE bapibus1006_central_person, centraldataorganization TYPE bapibus1006_central_organ. DATA: addressdata TYPE bapibus1006_address. DATA: relationships TYPE TABLE OF bapibus1006_relations. FIELD-SYMBOLS: <relationship> LIKE LINE OF relationships. DATA: relationship_centraldata TYPE bapibus1006002_central. DATA: relationship_addresses TYPE TABLE OF bapibus1006002_addresses. FIELD-SYMBOLS: <relationship_address> LIKE LINE OF relationship_addresses. DATA: lt_download TYPE TABLE OF zexcel_s_org_rel. FIELD-SYMBOLS: <download> LIKE LINE OF lt_download. DATA: lv_full_path TYPE string, lv_workdir TYPE string, lv_file_separator TYPE c. CONSTANTS: lv_default_file_name TYPE string VALUE '11_Export_Org_and_Contact.xlsx'. PARAMETERS: p_path TYPE zexcel_export_dir. PARAMETERS: md TYPE flag RADIOBUTTON GROUP act. SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE a. PARAMETERS: partnerc TYPE bu_type DEFAULT 2, " Organizations postlcod TYPE ad_pstcd1 DEFAULT '8334*', country TYPE land1 DEFAULT 'DE', maxsel TYPE bu_maxsel DEFAULT 100. SELECTION-SCREEN END OF BLOCK a. PARAMETERS: rel TYPE flag RADIOBUTTON GROUP act DEFAULT 'X'. SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE b. PARAMETERS: reltyp TYPE bu_reltyp DEFAULT 'BUR011', partner TYPE bu_partner DEFAULT '191'. SELECTION-SCREEN END OF BLOCK b. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. lv_workdir = p_path. cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir CHANGING selected_folder = lv_workdir ). p_path = lv_workdir. INITIALIZATION. a = 'Select by master data'. b = 'Select by relationship'. cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). cl_gui_cfw=>flush( ). p_path = lv_workdir. START-OF-SELECTION. IF p_path IS INITIAL. p_path = lv_workdir. ENDIF. cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). CONCATENATE p_path lv_file_separator lv_default_file_name INTO lv_full_path. IF md = abap_true. " Read all Companies by Master Data central_search-partnercategory = partnerc. addressdata_search-postl_cod1 = postlcod. addressdata_search-country = country. others_search-maxsel = maxsel. others_search-no_search_for_contactperson = 'X'. CALL FUNCTION 'BAPI_BUPA_SEARCH_2' EXPORTING centraldata = central_search addressdata = addressdata_search OTHERS = others_search TABLES searchresult = searchresult return = return. SORT searchresult BY partner. DELETE ADJACENT DUPLICATES FROM searchresult COMPARING partner. ELSEIF rel = abap_true. " Read by Relationship SELECT but050~partner1 AS partner FROM but050 INNER JOIN but000 ON but000~partner = but050~partner1 AND but000~type = '2' INTO CORRESPONDING FIELDS OF TABLE searchresult WHERE but050~partner2 = partner AND but050~reltyp = reltyp. ENDIF. DESCRIBE TABLE searchresult LINES lines. WRITE: / 'Number of search results: ', lines. LOOP AT searchresult ASSIGNING <searchresult_line>. " Read Details of Organization CALL FUNCTION 'BAPI_BUPA_CENTRAL_GETDETAIL' EXPORTING businesspartner = <searchresult_line>-partner IMPORTING centraldataorganization = centraldataorganization. " Read Standard Address of Organization CALL FUNCTION 'BAPI_BUPA_ADDRESS_GETDETAIL' EXPORTING businesspartner = <searchresult_line>-partner IMPORTING addressdata = addressdata. " Add Organization to Download APPEND INITIAL LINE TO lt_download ASSIGNING <download>. " Fill Organization Partner Numbers CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' EXPORTING businesspartner = <searchresult_line>-partner IMPORTING businesspartnerout = <download>-org_number businesspartnerguidout = <download>-org_guid. MOVE-CORRESPONDING centraldataorganization TO <download>. MOVE-CORRESPONDING addressdata TO <download>. CLEAR: addressdata. " Read all Relationships CLEAR: relationships. CALL FUNCTION 'BAPI_BUPA_RELATIONSHIPS_GET' EXPORTING businesspartner = <searchresult_line>-partner TABLES relationships = relationships. DELETE relationships WHERE relationshipcategory <> 'BUR001'. LOOP AT relationships ASSIGNING <relationship>. " Read details of Contact person CALL FUNCTION 'BAPI_BUPA_CENTRAL_GETDETAIL' EXPORTING businesspartner = <relationship>-partner2 IMPORTING centraldata = centraldata centraldataperson = centraldataperson. " Read details of the Relationship CALL FUNCTION 'BAPI_BUPR_CONTP_GETDETAIL' EXPORTING businesspartner = <relationship>-partner1 contactperson = <relationship>-partner2 IMPORTING centraldata = relationship_centraldata. " Read relationship address CLEAR: relationship_addresses. CALL FUNCTION 'BAPI_BUPR_CONTP_ADDRESSES_GET' EXPORTING businesspartner = <relationship>-partner1 contactperson = <relationship>-partner2 TABLES addresses = relationship_addresses. READ TABLE relationship_addresses ASSIGNING <relationship_address> WITH KEY standardaddress = 'X'. IF <relationship_address> IS ASSIGNED. " Read Relationship Address CLEAR addressdata. CALL FUNCTION 'BAPI_BUPA_ADDRESS_GETDETAIL' EXPORTING businesspartner = <searchresult_line>-partner addressguid = <relationship_address>-addressguid IMPORTING addressdata = addressdata. APPEND INITIAL LINE TO lt_download ASSIGNING <download>. CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' EXPORTING businesspartner = <relationship>-partner1 IMPORTING businesspartnerout = <download>-org_number businesspartnerguidout = <download>-org_guid. CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' EXPORTING businesspartner = <relationship>-partner2 IMPORTING businesspartnerout = <download>-contpers_number businesspartnerguidout = <download>-contpers_guid. MOVE-CORRESPONDING centraldataorganization TO <download>. MOVE-CORRESPONDING addressdata TO <download>. MOVE-CORRESPONDING centraldataperson TO <download>. MOVE-CORRESPONDING relationship_centraldata TO <download>. WRITE: / <relationship>-partner1, <relationship>-partner2. WRITE: centraldataorganization-name1(20), centraldataorganization-name2(10). WRITE: centraldataperson-firstname(15), centraldataperson-lastname(15). WRITE: addressdata-street(25), addressdata-house_no, addressdata-postl_cod1, addressdata-city(25). ENDIF. ENDLOOP. ENDLOOP. DATA: lo_excel TYPE REF TO zcl_excel, lo_excel_writer TYPE REF TO zif_excel_writer, lo_worksheet TYPE REF TO zcl_excel_worksheet, lo_style_body TYPE REF TO zcl_excel_style, lo_border_dark TYPE REF TO zcl_excel_style_border, column_dimension TYPE REF TO zcl_excel_worksheet_columndime, row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. DATA: lv_style_body_even_guid TYPE zexcel_cell_style, lv_style_body_green TYPE zexcel_cell_style. DATA: row TYPE zexcel_cell_row. DATA: lv_file TYPE xstring, lv_bytecount TYPE i, lt_file_tab TYPE solix_tab. DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, ls_table_settings TYPE zexcel_s_table_settings. DATA: column TYPE zexcel_cell_column, column_alpha TYPE zexcel_cell_column_alpha, value TYPE zexcel_cell_value. FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. " Creates active sheet CREATE OBJECT lo_excel. " Create border object CREATE OBJECT lo_border_dark. lo_border_dark->border_color = zcl_excel_style_color=>c_black. lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. "Create style with border even lo_style_body = lo_excel->add_new_style( ). lo_style_body->fill->fgcolor = zcl_excel_style_color=>c_yellow. lo_style_body->borders->allborders = lo_border_dark. lv_style_body_even_guid = lo_style_body->get_guid( ). "Create style with border and green fill lo_style_body = lo_excel->add_new_style( ). lo_style_body->fill->fgcolor = zcl_excel_style_color=>c_green. lo_style_body->borders->allborders = lo_border_dark. lv_style_body_green = lo_style_body->get_guid( ). " Get active sheet lo_worksheet = lo_excel->get_active_worksheet( ). lo_worksheet->set_title( 'Internal table' ). lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_download ). LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. CASE <fs_field_catalog>-fieldname. WHEN 'ORG_NUMBER'. <fs_field_catalog>-position = 1. <fs_field_catalog>-dynpfld = abap_true. WHEN 'CONTPERS_NUMBER'. <fs_field_catalog>-position = 2. <fs_field_catalog>-dynpfld = abap_true. WHEN 'NAME1'. <fs_field_catalog>-position = 3. <fs_field_catalog>-dynpfld = abap_true. WHEN 'NAME2'. <fs_field_catalog>-position = 4. <fs_field_catalog>-dynpfld = abap_true. WHEN 'STREET'. <fs_field_catalog>-position = 5. <fs_field_catalog>-dynpfld = abap_true. WHEN 'HOUSE_NO'. <fs_field_catalog>-position = 6. <fs_field_catalog>-dynpfld = abap_true. WHEN 'POSTL_COD1'. <fs_field_catalog>-position = 7. <fs_field_catalog>-dynpfld = abap_true. WHEN 'CITY'. <fs_field_catalog>-position = 8. <fs_field_catalog>-dynpfld = abap_true. WHEN 'COUNTRYISO'. <fs_field_catalog>-position = 9. <fs_field_catalog>-dynpfld = abap_true. WHEN 'FIRSTNAME'. <fs_field_catalog>-position = 10. <fs_field_catalog>-dynpfld = abap_true. WHEN 'LASTNAME'. <fs_field_catalog>-position = 11. <fs_field_catalog>-dynpfld = abap_true. WHEN 'FUNCTIONNAME'. <fs_field_catalog>-position = 12. <fs_field_catalog>-dynpfld = abap_true. WHEN 'DEPARTMENTNAME'. <fs_field_catalog>-position = 13. <fs_field_catalog>-dynpfld = abap_true. WHEN 'TEL1_NUMBR'. <fs_field_catalog>-position = 14. <fs_field_catalog>-dynpfld = abap_true. WHEN 'TEL1_EXT'. <fs_field_catalog>-position = 15. <fs_field_catalog>-dynpfld = abap_true. WHEN 'FAX_NUMBER'. <fs_field_catalog>-position = 16. <fs_field_catalog>-dynpfld = abap_true. WHEN 'FAX_EXTENS'. <fs_field_catalog>-position = 17. <fs_field_catalog>-dynpfld = abap_true. WHEN 'E_MAIL'. <fs_field_catalog>-position = 18. <fs_field_catalog>-dynpfld = abap_true. WHEN OTHERS. <fs_field_catalog>-dynpfld = abap_false. ENDCASE. ENDLOOP. ls_table_settings-top_left_column = 'A'. ls_table_settings-top_left_row = '2'. ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium5. lo_worksheet->bind_table( ip_table = lt_download is_table_settings = ls_table_settings it_field_catalog = lt_field_catalog ). LOOP AT lt_download ASSIGNING <download>. row = sy-tabix + 2. IF NOT <download>-org_number IS INITIAL AND <download>-contpers_number IS INITIAL. " Mark fields of Organization which can be changed green lo_worksheet->set_cell_style( ip_column = 'C' ip_row = row ip_style = lv_style_body_green ). lo_worksheet->set_cell_style( ip_column = 'D' ip_row = row ip_style = lv_style_body_green ). * CATCH zcx_excel. " Exceptions for ABAP2XLSX ELSEIF NOT <download>-org_number IS INITIAL AND NOT <download>-contpers_number IS INITIAL. " Mark fields of Relationship which can be changed green lo_worksheet->set_cell_style( ip_column = 'L' ip_row = row ip_style = lv_style_body_green ). lo_worksheet->set_cell_style( ip_column = 'M' ip_row = row ip_style = lv_style_body_green ). lo_worksheet->set_cell_style( ip_column = 'N' ip_row = row ip_style = lv_style_body_green ). lo_worksheet->set_cell_style( ip_column = 'O' ip_row = row ip_style = lv_style_body_green ). lo_worksheet->set_cell_style( ip_column = 'P' ip_row = row ip_style = lv_style_body_green ). lo_worksheet->set_cell_style( ip_column = 'Q' ip_row = row ip_style = lv_style_body_green ). lo_worksheet->set_cell_style( ip_column = 'R' ip_row = row ip_style = lv_style_body_green ). ENDIF. ENDLOOP. " Add Fieldnames in first row and hide the row LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog> WHERE position <> '' AND dynpfld = abap_true. column = <fs_field_catalog>-position. column_alpha = zcl_excel_common=>convert_column2alpha( column ). value = <fs_field_catalog>-fieldname. lo_worksheet->set_cell( ip_column = column_alpha ip_row = 1 ip_value = value ip_style = lv_style_body_even_guid ). ENDLOOP. " Hide first row row_dimension = lo_worksheet->get_row_dimension( 1 ). row_dimension->set_visible( abap_false ). DATA: highest_column TYPE zexcel_cell_column, count TYPE int4, col_alpha TYPE zexcel_cell_column_alpha. highest_column = lo_worksheet->get_highest_column( ). count = 1. WHILE count <= highest_column. col_alpha = zcl_excel_common=>convert_column2alpha( ip_column = count ). column_dimension = lo_worksheet->get_column_dimension( ip_column = col_alpha ). column_dimension->set_auto_size( ip_auto_size = abap_true ). count = count + 1. ENDWHILE. * " Set Column width manuall * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'A' ). * column_dimension->set_width( ip_width = 11 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'B' ). * column_dimension->set_width( ip_width = 11 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'C' ). * column_dimension->set_width( ip_width = 35 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'E' ). * column_dimension->set_width( ip_width = 18 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'F' ). * column_dimension->set_width( ip_width = 5 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'G' ). * column_dimension->set_width( ip_width = 6 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'H' ). * column_dimension->set_width( ip_width = 12 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'I' ). * column_dimension->set_width( ip_width = 3 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'J' ). * column_dimension->set_width( ip_width = 13 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'K' ). * column_dimension->set_width( ip_width = 13 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'L' ). * column_dimension->set_width( ip_width = 13 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'M' ). * column_dimension->set_width( ip_width = 13 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'N' ). * column_dimension->set_width( ip_width = 12 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'O' ). * column_dimension->set_width( ip_width = 9 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'P' ). * column_dimension->set_width( ip_width = 12 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'Q' ). * column_dimension->set_width( ip_width = 9 ). * column_dimension = lo_worksheet->get_column_dimension( ip_column = 'R' ). * column_dimension->set_width( ip_width = 40 ). CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. lv_file = lo_excel_writer->write_file( lo_excel ). " Convert to binary CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_file IMPORTING output_length = lv_bytecount TABLES binary_tab = lt_file_tab. * " This method is only available on AS ABAP > 6.40 * lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). * lv_bytecount = xstrlen( lv_file ). " Save the file cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount filename = lv_full_path filetype = 'BIN' CHANGING data_tab = lt_file_tab ).