* __ __ ______ _______ __ __ _______ __ _ __ _ _______ ___ _______ * | | | | _ | | | | | | _ | | | | | | | | | | | * | |_| | | || | | |_| | |_| | |_| | |_| | ___| | | _____| * | | |_||_ | | | | | | |___| | | |_____ * | | __ | | _| | | _ | _ | ___| |___|_____ | * | _ | | | | | |_| _ | _ | | | | | | | |___| |_____| | * |__| |__|___| |_| |_______|__| |__|__| |__|_| |__|_| |__|_______|_______|_______| * platform voor Nederlandstalige HR SAP software componenten www.HRchannels.nl * *------------------------------------------------------------------------------------------- * program : ZHRCHANNELS_DOWNLOAD_TOOL * title : Table contents download to XLS * functional area : Cross modules * environment : 4.7 * program Function : This report allows the end user to specify tables * that are selected and presented in XLS form, for * X-system comparisons. * Documentation : HRchannels.nl * Previous version : This is the initial version * Developer name : Wim Maasdam * Development date : 04/08/2014 * Version : 0.3 *--------------------------------------------------------------------- * Change list: * Date Description * 04/08/2014 Initial release * 22/08/2014 Series of test results, first official release (0.2) * 23/09/2014 Series of test results, second official release (0.3) * *--------------------------------------------------------------------- REPORT ZHRCHANNELS_DOWNLOAD_TOOL NO STANDARD PAGE HEADING LINE-SIZE 650. TYPE-POOLS: vrm, abap. TABLES: sscrfields,dd02l, dd03l. "Selection screen purpose only *--------------------------------------------------------------------- * C L A S S D E F I N I T I O N *--------------------------------------------------------------------- CLASS lcl_f4_processing DEFINITION. PUBLIC SECTION. CLASS-METHODS: f4_presentation_file IMPORTING title TYPE any CHANGING filepath TYPE any, f4_server_file CHANGING filepath TYPE any. ENDCLASS. "lcl_f4_processing DEFINITION *----------------------------------------------------------------------* * CLASS lcl_table_absorber DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_table_absorber DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF ty_table, tabname TYPE dd03l-tabname, END OF ty_table, BEGIN OF ty_table_title, tabname TYPE dd02t-tabname, ddtext TYPE dd02t-ddtext, END OF ty_table_title, BEGIN OF ty_tablefields, tabname TYPE dd03l-tabname, fieldname TYPE dd03l-fieldname, position TYPE dd03l-position, inttype TYPE dd03l-inttype, intlen TYPE dd03l-intlen, ddtext TYPE dd03t-ddtext, END OF ty_tablefields, ty_tab512_tt TYPE STANDARD TABLE OF tab512, ty_char780_tt TYPE STANDARD TABLE OF char780. CLASS-DATA: gt_tables TYPE STANDARD TABLE OF ty_table, gt_table_titles TYPE STANDARD TABLE OF ty_table_title, gt_data TYPE ty_char780_tt, gv_pathfile TYPE string, gv_quote TYPE c LENGTH 1. CLASS-METHODS: set_listbox_static, set_listboxes, select IMPORTING data_selection TYPE boolean DEFAULT abap_true, read_table IMPORTING query_table TYPE dd02l-tabname EXPORTING data TYPE ty_char780_tt, save_as_csv, run_excel, save_on_server, dump, prep_filename. ENDCLASS. "lcl_table_absorber DEFINITION *--------------------------------------------------------------------- * S E L E C T I O N - S C R E E N *--------------------------------------------------------------------- SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(30) lbl_01 FOR FIELD so_tabnm. SELECT-OPTIONS: so_tabnm FOR dd02l-tabname NO INTERVALS OBLIGATORY. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF SCREEN 1100 AS SUBSCREEN. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(30) lbl_02 FOR FIELD so_field. SELECT-OPTIONS: so_field FOR dd03l-fieldname. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: pa_save AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN COMMENT 4(20) box_00 FOR FIELD pa_save. PARAMETERS: pa_filen TYPE c LENGTH 100 LOWER CASE VISIBLE LENGTH 56. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 4. PARAMETERS: pa_add AS CHECKBOX DEFAULT space. SELECTION-SCREEN COMMENT 8(26) box_00_1 FOR FIELD pa_add. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 4. PARAMETERS: pa_xls AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN COMMENT 8(26) box_00_2 FOR FIELD pa_xls. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: pa_srvr AS CHECKBOX DEFAULT space. SELECTION-SCREEN COMMENT 4(20) box_05 FOR FIELD pa_srvr. PARAMETERS: pa_file2 TYPE c LENGTH 100 LOWER CASE VISIBLE LENGTH 56. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 4. PARAMETERS: pa_add2 AS CHECKBOX DEFAULT space. SELECTION-SCREEN COMMENT 8(26) box_05_1 FOR FIELD pa_add2. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: pa_titl AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN COMMENT 4(35) box_02 FOR FIELD pa_titl. SELECTION-SCREEN COMMENT 39(12) box_02_2 FOR FIELD pa_quot. PARAMETERS: pa_quot TYPE c LENGTH 3 AS LISTBOX VISIBLE LENGTH 18. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: pa_lbla AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN COMMENT 4(34) box_03 FOR FIELD pa_lbla. SELECTION-SCREEN COMMENT 39(20) box_03_2 FOR FIELD pa_pflrc. PARAMETERS: pa_pflrc TYPE c LENGTH 1 DEFAULT space LOWER CASE. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: pa_lblb AS CHECKBOX DEFAULT space. SELECTION-SCREEN COMMENT 4(35) box_04 FOR FIELD pa_lblb. SELECTION-SCREEN COMMENT 39(12) box_04_2 FOR FIELD pa_fdat. PARAMETERS: pa_fdat TYPE c LENGTH 10 AS LISTBOX VISIBLE LENGTH 13. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: pa_msgd AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN COMMENT 4(35) box_06 FOR FIELD pa_msgd. SELECTION-SCREEN COMMENT 39(12) box_06_2 FOR FIELD pa_fnum. PARAMETERS: pa_fnum TYPE c LENGTH 3 AS LISTBOX VISIBLE LENGTH 13. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: pa_tcol AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN COMMENT 4(34) box_07 FOR FIELD pa_tcol. PARAMETERS: pa_sep TYPE c LENGTH 1 DEFAULT ';' LOWER CASE. SELECTION-SCREEN COMMENT 41(18) box_07_2 FOR FIELD pa_sep. PARAMETERS: pa_tab AS CHECKBOX DEFAULT space USER-COMMAND dummy. SELECTION-SCREEN COMMENT 63(10) box_07_3 FOR FIELD pa_tab. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(33) lbl_04 FOR FIELD pa_max. PARAMETERS: pa_max TYPE soid-accnt DEFAULT 1000. SELECTION-SCREEN COMMENT 44(20) lbl_05 FOR FIELD pa_start. PARAMETERS: pa_start TYPE soid-accnt DEFAULT 0. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF SCREEN 1100. SELECTION-SCREEN BEGIN OF SCREEN 1200 AS SUBSCREEN. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(70) txt_01. SELECTION-SCREEN END OF LINE. DEFINE option_line. selection-screen begin of line. parameters pa_tabx&1 type ddobjname as listbox visible length 15 user-command libo. parameters pa_fldx&1 type char20 as listbox visible length 15. parameters pa_valx&1 type char40 lower case. selection-screen end of line. END-OF-DEFINITION. option_line: 1,2,3,4,5,6,7,8,9,0,a,b,c,d,e. SELECTION-SCREEN END OF SCREEN 1200. SELECTION-SCREEN BEGIN OF SCREEN 1300 AS SUBSCREEN. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(70) txt_00. SELECTION-SCREEN END OF LINE. DEFINE option_line_all. selection-screen begin of line. parameters pa_fldy&1 type char20. parameters pa_valy&1 type char40 lower case. selection-screen end of line. END-OF-DEFINITION. option_line_all: 1,2,3,4,5,6,7,8,9,0,a,b,c,d,e. SELECTION-SCREEN END OF SCREEN 1300. SELECTION-SCREEN BEGIN OF SCREEN 1400 AS SUBSCREEN. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(70) txt_02. SELECTION-SCREEN END OF LINE. DEFINE free_option_line. selection-screen begin of line. parameters pa_tbl&1 type c length 10 as listbox visible length 15. parameters pa_free&1 type c length 80. parameters pa_and&1 type c length 3 as listbox visible length 8. selection-screen end of line. END-OF-DEFINITION. free_option_line: 1,2,3,4,5,6,7,8,9,0,a,b,c,d,e. SELECTION-SCREEN END OF SCREEN 1400. SELECTION-SCREEN BEGIN OF TABBED BLOCK maintab FOR 16 LINES. SELECTION-SCREEN TAB (20) tab_01 USER-COMMAND tab1 DEFAULT SCREEN 1100. SELECTION-SCREEN TAB (20) tab_02 USER-COMMAND tab2 DEFAULT SCREEN 1200. SELECTION-SCREEN TAB (20) tab_03 USER-COMMAND tab3 DEFAULT SCREEN 1300. SELECTION-SCREEN TAB (20) tab_04 USER-COMMAND tab4 DEFAULT SCREEN 1400. SELECTION-SCREEN END OF BLOCK maintab. selection-SCREEN BEGIN OF LINE. SELECTION-SCREEN PUSHBUTTON (70) lbl_link USER-COMMAND HRCHANNELS VISIBLE LENGTH 5. selection-SCREEN END OF LINE. AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_filen. lcl_f4_processing=>f4_presentation_file( EXPORTING title = 'Choose file' CHANGING filepath = pa_filen ). AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_file2. lcl_f4_processing=>f4_server_file( CHANGING filepath = pa_file2 ). AT SELECTION-SCREEN. CASE sscrfields-ucomm. WHEN 'LIBO'. lcl_table_absorber=>set_listboxes( ). WHEN 'HRCHANNELS'. CALL FUNCTION 'CALL_BROWSER' EXPORTING URL = 'http://www.hrchannels.nl/index.php/bibliotheek/19-download-tool' EXCEPTIONS OTHERS = 0. ENDCASE. AT SELECTION-SCREEN ON so_tabnm. lcl_table_absorber=>set_listboxes( ). AT SELECTION-SCREEN OUTPUT. IF NOT so_tabnm[] IS INITIAL. lcl_table_absorber=>set_listboxes( ). ENDIF. IF pa_filen IS INITIAL. DATA: lv_filename TYPE string. cl_gui_frontend_services=>directory_get_current( CHANGING current_directory = lv_filename ). cl_gui_cfw=>flush( ). CONCATENATE lv_filename 'SAP{S}_tables_{D}_{T}.csv' INTO pa_filen SEPARATED BY '\'. ENDIF. IF pa_file2 IS INITIAL. DATA: lw_pars TYPE spfpflpar, lv_separator TYPE c LENGTH 1. lw_pars-parname = 'DIR_HOME'. CALL FUNCTION 'RSAN_SYSTEM_PARAMETER_READ' EXPORTING i_name = lw_pars-parname IMPORTING e_value = lw_pars-pvalue EXCEPTIONS OTHERS = 0. lv_separator = lw_pars-pvalue(1). if lv_separator <> '/'. lv_separator = '\'. endif. CONCATENATE lw_pars-pvalue 'SAP{S}_tables_{D}_{T}.csv' INTO pa_file2 SEPARATED BY lv_separator. ENDIF. IF NOT pa_tab IS INITIAL. LOOP AT SCREEN. IF screen-name = 'PA_SEP'. screen-input = 0. MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF. *--------------------------------------------------------------------- * C L A S S I M P L E M E N T A T I O N *--------------------------------------------------------------------- CLASS lcl_f4_processing IMPLEMENTATION. METHOD f4_presentation_file. DATA: lt_files TYPE STANDARD TABLE OF sdokpath, lw_file TYPE sdokpath. CALL FUNCTION 'TMP_GUI_FILE_OPEN_DIALOG' EXPORTING window_title = title default_filename = filepath TABLES file_table = lt_files EXCEPTIONS OTHERS = 4. IF sy-subrc <> 0. MESSAGE 'Front end file open error' TYPE 'E'. ELSE. READ TABLE lt_files INDEX 1 INTO lw_file. filepath = lw_file-pathname. ENDIF. ENDMETHOD. "f4_presentation_file METHOD f4_server_file. DATA: lv_old_filepath TYPE string. lv_old_filepath = filepath. CALL FUNCTION '/SAPDMC/LSM_F4_SERVER_FILE' EXPORTING directory = filepath filemask = ' ' IMPORTING serverfile = filepath EXCEPTIONS canceled_by_user = 1 OTHERS = 2. CASE sy-subrc. WHEN 1. filepath = lv_old_filepath. WHEN 2. MESSAGE 'Server file open error' TYPE 'E'. ENDCASE. ENDMETHOD. "f4_server_file ENDCLASS. "lcl_f4_processing IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_table_absorber IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_table_absorber IMPLEMENTATION. METHOD set_listbox_static. DATA: lt_list TYPE vrm_values, lw_list LIKE LINE OF lt_list. DEFINE set_format. lw_list-key = &1. if &2 is initial. lw_list-text = &1. else. lw_list-text = &2. endif. append lw_list to lt_list. END-OF-DEFINITION. CLEAR lt_list[]. set_format: 'ALL' 'All fields', 'TXT' 'Text fields'. CALL FUNCTION 'VRM_SET_VALUES' EXPORTING id = 'PA_QUOT' values = lt_list. CLEAR lt_list[]. set_format: 'DD-MM-YYYY' '', 'DD/MM/YYYY' '', 'DD-MM-YY' '', 'MM-DD-YYYY' '', 'DD/MM' ''. CALL FUNCTION 'VRM_SET_VALUES' EXPORTING id = 'PA_FDAT' values = lt_list. CLEAR lt_list[]. set_format: 'COM' '123,02', 'DOT' '123.02'. CALL FUNCTION 'VRM_SET_VALUES' EXPORTING id = 'PA_FNUM' values = lt_list. ENDMETHOD. "set_listbox_date_formats METHOD set_listboxes. DATA: lt_list TYPE vrm_values, lt_list_and_or TYPE vrm_values, lw_list LIKE LINE OF lt_list, lt_list_fields TYPE vrm_values, lw_list_field LIKE LINE OF lt_list, lw_table_title TYPE ty_table_title, lt_dfies TYPE STANDARD TABLE OF dfies, lw_dfies TYPE dfies. DEFINE set_option. call function 'VRM_SET_VALUES' exporting id = 'PA_TABX&1' values = lt_list. call function 'VRM_DELETE_VALUES' exporting id = 'PA_FLDX&1' exceptions others = 0. if not pa_tabx&1 is initial. * Compose a list with possible values: fields of the table clear lt_list_fields[]. call function 'DDIF_FIELDINFO_GET' exporting tabname = pa_tabx&1 tables dfies_tab = lt_dfies exceptions others = 0. if sy-subrc = 0. loop at lt_dfies into lw_dfies. lw_list_field-key = lw_dfies-fieldname. lw_list_field-text = lw_dfies-scrtext_m. append lw_list_field to lt_list_fields. endloop. if sy-subrc = 0. call function 'VRM_SET_VALUES' exporting id = 'PA_FLDX&1' values = lt_list_fields. endif. endif. endif. END-OF-DEFINITION. DEFINE set_free_option. call function 'VRM_SET_VALUES' exporting id = 'PA_TBL&1' values = lt_list. call function 'VRM_SET_VALUES' exporting id = 'PA_AND&1' values = lt_list_and_or. END-OF-DEFINITION. CLEAR: lt_list[]. select( data_selection = abap_false ). IF sy-subrc = 0. APPEND lw_list TO lt_list. LOOP AT gt_table_titles INTO lw_table_title. lw_list-key = lw_table_title-tabname. lw_list-text = lw_table_title-ddtext. APPEND lw_list TO lt_list. ENDLOOP. ENDIF. set_option: 1,2,3,4,5,6,7,8,9,0,a,b,c,d,e. CLEAR lt_list_and_or[]. APPEND 'AND' TO lt_list_and_or. APPEND 'OR' TO lt_list_and_or. set_free_option: 1,2,3,4,5,6,7,8,9,0,a,b,c,d,e. ENDMETHOD. "set_listboxes METHOD select. DATA: lw_table TYPE ty_table, lt_data_single TYPE ty_char780_tt, lv_table_counter TYPE sy-index. * First compose a list of tables: SELECT tabname FROM dd02l INTO TABLE gt_tables WHERE tabname IN so_tabnm AND as4local = 'A' AND tabclass IN ('TRANSP', 'POOL', 'VIEW') AND viewclass IN (' ', 'D', 'P'). "View types: D=Databaseview, P=Projection view CHECK sy-subrc = 0. DESCRIBE TABLE gt_tables LINES lv_table_counter. IF lv_table_counter > 50. lv_table_counter = 50. IF NOT data_selection = abap_true. MESSAGE 'Number of tables limited to 50'(m03) TYPE 'S'. ENDIF. DELETE gt_tables FROM 51. ENDIF. * Table titels: SELECT tabname ddtext FROM dd02t INTO TABLE gt_table_titles FOR ALL ENTRIES IN gt_tables WHERE tabname = gt_tables-tabname AND as4local = 'A' AND ddlanguage = sy-langu. CHECK data_selection = abap_true. CLEAR gt_data[]. * Then gather additional information per table - using RFC_READ_TABLE LOOP AT gt_tables INTO lw_table. CLEAR lt_data_single[]. read_table( EXPORTING query_table = lw_table-tabname IMPORTING data = lt_data_single ). APPEND LINES OF lt_data_single TO gt_data. ENDLOOP. ENDMETHOD. "select METHOD read_table. DATA: lt_options TYPE STANDARD TABLE OF rfc_db_opt, lw_option TYPE rfc_db_opt, lt_fields TYPE STANDARD TABLE OF rfc_db_fld, lw_field TYPE rfc_db_fld, lv_query_table TYPE ddobjname, lt_data TYPE ty_tab512_tt, lw_data TYPE char780, lt_dfies TYPE STANDARD TABLE OF dfies, lw_dfies TYPE dfies, lv_line_cursor TYPE i, lv_headerline_flds TYPE string, lv_headerline_desc TYPE string, lw_table_title TYPE ty_table_title, lv_limited_fields TYPE boolean, lv_incorrect_selection TYPE boolean, lv_no_data_found TYPE boolean, lv_results_counter TYPE n LENGTH 6, lt_tokens TYPE STANDARD TABLE OF text150, lv_token TYPE text150, lv_tablesize TYPE i, lv_translation TYPE c LENGTH 2. DEFINE set_option. if pa_tabx&1 = query_table. concatenate pa_fldx&1 ' = ' '''' pa_valx&1 '''' into lw_option. append lw_option to lt_options. endif. END-OF-DEFINITION. DEFINE set_option_all. * Check the field: it should be part of the fieldlist of the table read table lt_dfies transporting no fields with key fieldname = pa_fldy&1. if sy-subrc = 0. concatenate pa_fldy&1 ' = ' '''' pa_valy&1 '''' into lw_option. append lw_option to lt_options. endif. END-OF-DEFINITION. DEFINE set_free_option. if pa_tbl&1 = query_table. lw_option = pa_free&1. if pa_and&1 = 'OR'. concatenate lw_option 'OR' into lw_option separated by space. endif. append lw_option to lt_options. endif. END-OF-DEFINITION. * The RFC_READ_TABLE functio module has a limitation to the record-width of * a single table, being 512 characters. If more data needs to be passed, * a more selective field choice should be applied. The coding below will * ensure that no more than .5k data is selected and that the field names for * these fields are listed: lv_query_table = query_table. CALL FUNCTION 'DDIF_FIELDINFO_GET' EXPORTING tabname = lv_query_table TABLES dfies_tab = lt_dfies EXCEPTIONS OTHERS = 0. * Prepare field header and footer CLEAR: gv_quote. IF ( pa_quot = 'TXT' ) OR ( pa_quot = 'ALL' ). gv_quote = '"'. ENDIF. * Prepare field selection, only allowing up to 512 characters to be filled: CLEAR: lt_fields[], lv_line_cursor, lv_headerline_flds, lv_headerline_desc, lv_limited_fields. DELETE lt_dfies WHERE fieldname NOT IN so_field. LOOP AT lt_dfies INTO lw_dfies. ADD lw_dfies-outputlen TO lv_line_cursor. ADD 1 TO lv_line_cursor. "The delimiter IF lv_line_cursor > 512. lv_limited_fields = abap_true. EXIT. ENDIF. lw_field-fieldname = lw_dfies-fieldname. APPEND lw_field TO lt_fields. * Header line: CONCATENATE lv_headerline_flds pa_sep gv_quote lw_dfies-fieldname gv_quote INTO lv_headerline_flds. CONCATENATE lv_headerline_desc pa_sep gv_quote lw_dfies-scrtext_m gv_quote INTO lv_headerline_desc. ENDLOOP. * Now prepare content selection, by filling in the lt_options table with * flexible selections. This is done via a macro, to avoid repetitive coding. CLEAR lt_options[]. set_option: 1,2,3,4,5,6,7,8,9,0,a,b,c,d,e. set_option_all: 1,2,3,4,5,6,7,8,9,0,a,b,c,d,e. * Set the free-input select options set_free_option: 1,2,3,4,5,6,7,8,9,0,a,b,c,d,e. * In case there are multiple options for a single table, the options need to be * linked with AND: DESCRIBE TABLE lt_options LINES lv_line_cursor. IF lv_line_cursor > 1. SUBTRACT 1 FROM lv_line_cursor. LOOP AT lt_options INTO lw_option FROM 1 TO lv_line_cursor. * If the line already ends in AND or OR, this addition should be skipped: SPLIT lw_option AT space INTO TABLE lt_tokens. DESCRIBE TABLE lt_tokens LINES lv_tablesize. READ TABLE lt_tokens INTO lv_token INDEX lv_tablesize. TRANSLATE lv_token TO UPPER CASE. "#EC TRANSLANG IF lv_token <> 'OR' AND lv_token <> 'AND'. CONCATENATE lw_option 'AND' INTO lw_option SEPARATED BY space. MODIFY lt_options FROM lw_option. ENDIF. ENDLOOP. ENDIF. lv_incorrect_selection = abap_false. * Just to avoid the system to dump, the selection is tried: IF NOT lt_options[] IS INITIAL. TRY. READ TABLE lt_dfies INTO lw_dfies WITH KEY inttype = 'C'. IF sy-subrc = 0. * If there are no character values to be selected, this dump-catching is skipped SELECT (lw_dfies-fieldname) FROM (query_table) INTO lw_data UP TO 1 ROWS WHERE (lt_options). ENDSELECT. ENDIF. CATCH cx_sy_dynamic_osql_error. lv_incorrect_selection = abap_true. CATCH cx_sy_open_sql_db. lv_incorrect_selection = abap_true. ENDTRY. ENDIF. IF lv_incorrect_selection = abap_false. CALL FUNCTION 'RFC_READ_TABLE' EXPORTING query_table = query_table delimiter = pa_sep rowskips = pa_start rowcount = pa_max TABLES OPTIONS = lt_options fields = lt_fields data = lt_data 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 <> 0. MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDIF. lv_no_data_found = abap_false. IF lt_data[] IS INITIAL. lv_no_data_found = abap_true. CLEAR lv_results_counter. ELSE. DESCRIBE TABLE lt_data LINES lv_results_counter. ENDIF. * Every table has multiple header lines: compose result table * The table name and title IF pa_titl = 'X'. READ TABLE gt_table_titles INTO lw_table_title WITH KEY tabname = query_table. IF lv_results_counter > 0. SHIFT lv_results_counter LEFT DELETING LEADING '0'. * Add a column with number of results CONCATENATE gv_quote lv_results_counter ' records' gv_quote pa_sep gv_quote lw_table_title-ddtext gv_quote INTO lw_data. ELSE. CONCATENATE gv_quote 'NO records' gv_quote pa_sep gv_quote lw_table_title-ddtext gv_quote INTO lw_data. ENDIF. IF pa_tcol = ' '. * If the table is not mentioned as 1st column, it should be mentioned here, as 1st column CONCATENATE lw_table_title-tabname pa_sep lw_data INTO lw_data. ENDIF. APPEND lw_data TO data. ENDIF. IF lv_incorrect_selection = abap_true. CONCATENATE gv_quote '*** Selection parameters incorrect for table'(m01) query_table gv_quote INTO lw_data SEPARATED BY space. MESSAGE lw_data TYPE 'I'. IF pa_msgd = 'X'. APPEND lw_data TO data. ENDIF. ELSEIF lv_no_data_found = abap_true. CONCATENATE gv_quote '*** No data found for table'(m02) query_table gv_quote INTO lw_data SEPARATED BY space. IF pa_msgd = 'X'. APPEND lw_data TO data. ENDIF. ENDIF. IF lv_limited_fields = abap_true. CONCATENATE gv_quote '*** Number of fields limited for table'(m04) query_table gv_quote INTO lw_data SEPARATED BY space. MESSAGE lw_data TYPE 'I'. IF pa_msgd = 'X'. APPEND lw_data TO data. ENDIF. ENDIF. * Column fields - as fieldname IF NOT pa_lbla IS INITIAL. SHIFT lv_headerline_flds LEFT BY 1 PLACES. lw_data = lv_headerline_flds. APPEND lw_data TO data. ENDIF. * Column fields - as field description IF NOT pa_lblb IS INITIAL. SHIFT lv_headerline_desc LEFT BY 1 PLACES. lw_data = lv_headerline_desc. APPEND lw_data TO data. ENDIF. * Actual content is added - line by line IF pa_quot IS INITIAL AND pa_pflrc IS INITIAL AND pa_fdat IS INITIAL AND pa_fnum IS INITIAL. APPEND LINES OF lt_data TO data. ELSE. * Data-lines are added to the end result line-by-line, because field-related options * are processed LOOP AT lt_data INTO lw_data. "<=512 to 780 SPLIT lw_data AT pa_sep INTO TABLE lt_tokens. CLEAR lw_data. LOOP AT lt_dfies INTO lw_dfies. READ TABLE lt_tokens INTO lv_token INDEX sy-tabix. IF sy-subrc = 0. CLEAR: gv_quote. IF ( pa_quot = 'TXT' AND lw_dfies-inttype = 'C' ) OR ( pa_quot = 'ALL' ). gv_quote = '"'. ENDIF. IF NOT pa_pflrc IS INITIAL. lv_translation = pa_pflrc. SHIFT lv_translation RIGHT BY 1 PLACES. TRANSLATE lv_token USING lv_translation. lv_token = lv_token(lw_dfies-outputlen). ENDIF. IF lw_dfies-inttype = 'D' AND NOT pa_fdat IS INITIAL. CASE pa_fdat. WHEN 'DD-MM-YYYY'. CONCATENATE lw_data pa_sep gv_quote lv_token+6(2) '-' lv_token+4(2) '-' lv_token(4) gv_quote INTO lw_data. WHEN 'DD-MM-YY'. CONCATENATE lw_data pa_sep gv_quote lv_token+6(2) '-' lv_token+4(2) '-' lv_token+2(2) gv_quote INTO lw_data. WHEN 'DD/MM/YYYY'. CONCATENATE lw_data pa_sep gv_quote lv_token+6(2) '/' lv_token+4(2) '/' lv_token(4) gv_quote INTO lw_data. WHEN 'MM-DD-YYYY'. CONCATENATE lw_data pa_sep gv_quote lv_token+4(2) '-' lv_token+6(2) '-' lv_token(4) gv_quote INTO lw_data. WHEN 'DD/MM'. CONCATENATE lw_data pa_sep gv_quote lv_token+6(2) '/' lv_token+4(2) gv_quote INTO lw_data. ENDCASE. ELSEIF lw_dfies-inttype = 'P' AND NOT pa_fnum IS INITIAL. CASE pa_fnum. WHEN 'COM'. "Comma REPLACE '.' WITH ',' INTO lv_token. WHEN 'DOT'. "Dot REPLACE ',' WITH '.' INTO lv_token. ENDCASE. CONCATENATE lw_data pa_sep gv_quote lv_token gv_quote INTO lw_data. ELSE. CONCATENATE lw_data pa_sep gv_quote lv_token gv_quote INTO lw_data. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. SHIFT lw_data LEFT BY 1 PLACES. APPEND lw_data TO data. ENDLOOP. ENDIF. * Now prefix the complete data set (header plus table content) with the table name: IF pa_tcol = 'X'. CLEAR gv_quote. IF ( pa_quot = 'TXT' ) OR ( pa_quot = 'ALL' ). gv_quote = '"'. ENDIF. LOOP AT data INTO lw_data. CONCATENATE gv_quote query_table gv_quote pa_sep lw_data INTO lw_data. MODIFY data FROM lw_data. ENDLOOP. ENDIF. ENDMETHOD. "read_table METHOD save_as_csv. * Determine the path and filename gv_pathfile = pa_filen. prep_filename( ). * First store the data, as XLS file: CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING filename = gv_pathfile filetype = 'ASC' append = pa_add TABLES data_tab = gt_data EXCEPTIONS OTHERS = 4. IF sy-subrc <> 0. MESSAGE 'File could not be saved'(m05) TYPE 'I'. CLEAR gv_pathfile. ENDIF. ENDMETHOD. "save_as_csv METHOD run_excel. DATA: lv_path TYPE string, lv_file TYPE string. * Trigger Excel to do it's thing: - which requires path and file to * be separated CALL FUNCTION '/SAPDMC/LSM_PATH_FILE_SPLIT' EXPORTING pathfile = gv_pathfile IMPORTING pathname = lv_path filename = lv_file. * Start Excel with the file, indicating default directory and operation cl_gui_frontend_services=>execute( EXPORTING application = 'EXCEL' parameter = lv_file default_directory = lv_path operation = 'OPEN' maximized = 'X' EXCEPTIONS OTHERS = 4 ). IF sy-subrc <> 0. MESSAGE 'Excel could not be started'(m06) TYPE 'I'. ENDIF. ENDMETHOD. "run_excel METHOD save_on_server. DATA: lv_data LIKE LINE OF gt_data. * Determine the path and filename gv_pathfile = pa_file2. prep_filename( ). IF pa_add2 = 'X'. OPEN DATASET gv_pathfile FOR APPENDING IN TEXT MODE ENCODING DEFAULT. ELSE. OPEN DATASET gv_pathfile FOR OUTPUT IN TEXT MODE ENCODING DEFAULT. ENDIF. IF sy-subrc = 0. LOOP AT gt_data INTO lv_data. TRANSFER lv_data TO gv_pathfile. ENDLOOP. CLOSE DATASET gv_pathfile. ELSE. MESSAGE 'Kon bestand op de server niet openen'(m07) TYPE 'E'. ENDIF. ENDMETHOD. "save_on_server METHOD dump. DATA: lw_data TYPE tab512. LOOP AT gt_data INTO lw_data. WRITE: / lw_data. ENDLOOP. ENDMETHOD. "dump METHOD prep_filename. DATA: lv_system TYPE c LENGTH 15, lv_system_str TYPE string. CONCATENATE sy-sysid sy-mandt INTO lv_system SEPARATED BY '_'. CONDENSE lv_system NO-GAPS. lv_system_str = lv_system. REPLACE '{S}' WITH lv_system_str INTO gv_pathfile. REPLACE '{D}' WITH sy-datum INTO gv_pathfile. REPLACE '{T}' WITH sy-uzeit INTO gv_pathfile. REPLACE '{H}' WITH sy-uzeit(2) INTO gv_pathfile. REPLACE '{M}' WITH sy-uzeit+2(2) INTO gv_pathfile. REPLACE '{C}' WITH sy-mandt(3) INTO gv_pathfile. ENDMETHOD. "prep_filename ENDCLASS. "lcl_table_absorber IMPLEMENTATION INITIALIZATION. * All texts for this report have been set up as hard-coded texts (no use * of the report text-pool). Reason: easy copying of report source code. tab_01 = 'General'(t01). tab_02 = 'Field selection'(t02). tab_03 = 'Field selection (2)'(t03). tab_04 = 'Free selection'(t04). lbl_01 = 'Tables'(001). lbl_02 = 'Table fields'(002). box_00 = 'Save as'(005). box_00_1 = 'Append'(006). box_00_2 = 'Start Excel'(007). box_02 = 'Header with table description'(008). box_02_2 = 'Quotes for'. box_03 = 'Columnheaders as fieldname'(010). box_03_2 = 'Overlay fields with'. box_04 = 'Columnheaders as description'(011). box_04_2 = 'Date fields'. box_05 = 'Save on server'(012). box_05_1 = box_00_1. box_06 = 'Incorporate messages in result'(013). box_06_2 = 'Number flds'. box_07 = 'First column: table name'(014). box_07_2 = 'Field separator'. box_07_3 = 'Use TAB'. lbl_04 = 'Max. nr of records per table'(015). lbl_05 = 'Skip records'(016). txt_00 = 'Specify field name and value (applies to all tables)'(017). txt_01 = 'Specify table, fieldname and field value'(018). txt_02 = 'Specify table and free format selection'(019). lbl_link = '@N5\QMore on HRchannels.nl@'. lcl_table_absorber=>set_listbox_static( ). *--------------------------------------------------------------------- * S T A R T - O F - S E L E C T I O N *--------------------------------------------------------------------- START-OF-SELECTION. IF pa_tab = 'X'. pa_sep = cl_abap_char_utilities=>horizontal_tab. ENDIF. lcl_table_absorber=>select( ). IF NOT lcl_table_absorber=>gt_data[] IS INITIAL. IF pa_save = 'X'. lcl_table_absorber=>save_as_csv( ). ENDIF. IF pa_xls = 'X' AND NOT lcl_table_absorber=>gv_pathfile IS INITIAL. lcl_table_absorber=>run_excel( ). ENDIF. IF pa_srvr = 'X'. lcl_table_absorber=>save_on_server( ). ENDIF. * No output to file = dump on screen IF pa_save = space AND pa_srvr = space. lcl_table_absorber=>dump( ). ENDIF. ELSE. MESSAGE 'No output' TYPE 'S'. ENDIF.