REPORT z_alv_smartforms. *---------------------------------------------------------------------* * ALV List of Smart forms * *---------------------------------------------------------------------* * Author : Michel PIOUD - Updated 09-Feb-09 * * HomePage : http://www.oocities.org/mpioud/Abap_programs.html * *---------------------------------------------------------------------* * Macro definition DEFINE m_line. selection-screen : begin of line, comment 10(20) v_&1 for field &2. select-options &2 for &3. selection-screen end of line. END-OF-DEFINITION. *---------------------------------------------------------------------* TYPE-POOLS slis. " ALV Global types *---------------------------------------------------------------------* CONSTANTS : c_x VALUE 'X', c_eb9 TYPE syucomm VALUE '&EB9', c_refresh TYPE syucomm VALUE '&REFRESH'. *---------------------------------------------------------------------* TYPES : BEGIN OF ty_s_data. INCLUDE TYPE stxfadm. TYPES : caption TYPE tdtext, checkbox TYPE xfeld, END OF ty_s_data. *---------------------------------------------------------------------* DATA : gs_dummy_data TYPE ty_s_data, gt_data TYPE TABLE OF ty_s_data. *---------------------------------------------------------------------* * Select-Options / Parameters m_line 1 s_fname gs_dummy_data-formname. "#EC NEEDED m_line 3 s_dvclss gs_dummy_data-devclass. "#EC NEEDED SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 10(20) v_2 FOR FIELD s_luser. "#EC NEEDED SELECT-OPTIONS s_luser FOR gs_dummy_data-lastuser MATCHCODE OBJECT user_comp. SELECTION-SCREEN END OF LINE. m_line 6 s_ldate gs_dummy_data-lastdate. "#EC NEEDED SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 10(20) v_5 FOR FIELD s_luser. "#EC NEEDED SELECT-OPTIONS s_fuser FOR gs_dummy_data-firstuser MATCHCODE OBJECT user_comp. SELECTION-SCREEN END OF LINE. m_line 7 s_fdate gs_dummy_data-lastdate. "#EC NEEDED m_line 4 s_langu gs_dummy_data-masterlang. "#EC NEEDED m_line 8 s_ftype gs_dummy_data-formtype. "#EC NEEDED SELECTION-SCREEN : SKIP, BEGIN OF LINE, COMMENT 1(35) v_20 FOR FIELD p_max. "#EC NEEDED PARAMETERS p_max(3) TYPE n DEFAULT '200' OBLIGATORY. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN : SKIP, BEGIN OF LINE, COMMENT 1(35) v_21 FOR FIELD p_path. "#EC NEEDED PARAMETERS p_path TYPE rlgrap-filename DEFAULT 'C:\' OBLIGATORY. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN : BEGIN OF LINE, COMMENT 1(35) v_22 FOR FIELD p_extens. "#EC NEEDED PARAMETERS p_extens(3). SELECTION-SCREEN END OF LINE. *---------------------------------------------------------------------* INITIALIZATION. PERFORM f_initialization. *---------------------------------------------------------------------* START-OF-SELECTION. PERFORM f_read_data. *---------------------------------------------------------------------* END-OF-SELECTION. PERFORM f_display_data. *---------------------------------------------------------------------* * Form F_INITIALIZATION *---------------------------------------------------------------------* FORM f_initialization. DATA : ls_fname LIKE LINE OF s_fname, ls_ftype LIKE LINE OF s_ftype, ls_dvclss LIKE LINE OF s_dvclss, ls_luser LIKE LINE OF s_luser. v_1 = 'Smart form name'. v_2 = 'Last changed by'. v_3 = 'Developpment Class'. v_4 = 'Masterlang'. v_5 = 'Created by'. v_6 = 'Changed on'. v_7 = 'Created on'. v_8 = 'Form type'. v_20 = 'Maximum number of selected entries'. v_21 = 'Directory'. v_22 = 'Extension'. CONCATENATE 'ICP' 'Z*' INTO ls_fname. APPEND ls_fname TO s_fname. CONCATENATE 'ICP' 'Z*' INTO ls_dvclss. APPEND ls_dvclss TO s_dvclss. CONCATENATE 'IEQ' ' ' INTO ls_ftype. APPEND ls_ftype TO s_ftype. CONCATENATE 'IEQ' sy-uname INTO ls_luser. APPEND ls_luser TO s_luser. p_path = 'C:\Documents and Settings\pioudmic\Bureau\Pgm\'. ENDFORM. " F_INITIALIZATION *---------------------------------------------------------------------* * Form F_READ_DATA *---------------------------------------------------------------------* FORM f_read_data. DATA ls_address TYPE addr3_val. FIELD-SYMBOLS : <ls_data> TYPE ty_s_data. * Read data from TADIR and STXFADM SELECT formname t~masterlang version firstuser firstdate firsttime lastuser lastdate lasttime formtype t~devclass UP TO p_max ROWS INTO CORRESPONDING FIELDS OF TABLE gt_data FROM tadir AS t JOIN stxfadm AS s ON t~obj_name = s~formname WHERE pgmid = 'R3TR' AND object = 'SSFO' AND obj_name IN s_fname AND lastuser IN s_luser AND t~devclass IN s_dvclss AND t~masterlang IN s_langu AND firstuser IN s_fuser AND lastdate IN s_ldate AND formtype IN s_ftype. * Sort to improve performance of FM SUSR_USER_ADDRESS_READ SORT gt_data BY lastuser. LOOP AT gt_data ASSIGNING <ls_data>. * Get user address data CALL FUNCTION 'SUSR_USER_ADDRESS_READ' EXPORTING user_name = <ls_data>-lastuser "#EC IMPORTING user_address = ls_address EXCEPTIONS user_address_not_found = 1 OTHERS = 2. IF sy-subrc = 0. CONCATENATE ls_address-name_last ls_address-name_first INTO <ls_data>-lastuser SEPARATED BY space. ENDIF. * Get user address data CALL FUNCTION 'SUSR_USER_ADDRESS_READ' EXPORTING user_name = <ls_data>-firstuser "#EC IMPORTING user_address = ls_address EXCEPTIONS user_address_not_found = 1 OTHERS = 2. IF sy-subrc = 0. CONCATENATE ls_address-name_last ls_address-name_first INTO <ls_data>-firstuser SEPARATED BY space. ENDIF. * Read description from STXFADMT SELECT SINGLE caption INTO <ls_data>-caption FROM stxfadmt WHERE formname = <ls_data>-formname AND langu = <ls_data>-masterlang. ENDLOOP. ENDFORM. " F_READ_DATA *---------------------------------------------------------------------* * Form f_display_data *---------------------------------------------------------------------* FORM f_display_data. * Macro definition DEFINE m_sort. add 1 to ls_sort-spos. ls_sort-fieldname = &1. ls_sort-up = &2. ls_sort-down = &3. ls_sort-group = &4. append ls_sort to lt_sort. END-OF-DEFINITION. * Macro definition DEFINE m_fieldcat. add 1 to ls_fieldcat-col_pos. ls_fieldcat-fieldname = &1. ls_fieldcat-ref_tabname = &2. append ls_fieldcat to lt_fieldcat. END-OF-DEFINITION. DATA: ls_layout TYPE slis_layout_alv, lt_sort TYPE slis_t_sortinfo_alv, ls_sort TYPE slis_sortinfo_alv, ls_fieldcat TYPE slis_fieldcat_alv, lt_fieldcat TYPE slis_t_fieldcat_alv, ls_event_exit TYPE slis_event_exit, lt_event_exit TYPE slis_t_event_exit. ls_layout-zebra = c_x. ls_layout-cell_merge = c_x. ls_layout-group_change_edit = c_x. ls_layout-colwidth_optimize = c_x. ls_layout-box_fieldname = 'CHECKBOX'. * Build sort table m_sort 'LASTDATE' '' c_x ''. m_sort 'LASTTIME' '' c_x ''. * Build field catalog table m_fieldcat 'FORMNAME' 'STXFADM'. m_fieldcat 'MASTERLANG' 'STXFADM'. m_fieldcat 'CAPTION' 'STXFADMT'. m_fieldcat 'LASTUSER' 'STXFADM'. m_fieldcat 'LASTDATE' 'STXFADM'. m_fieldcat 'LASTTIME' 'STXFADM'. m_fieldcat 'FIRSTUSER' 'STXFADM'. m_fieldcat 'FIRSTDATE' 'STXFADM'. m_fieldcat 'FIRSTTIME' 'STXFADM'. m_fieldcat 'DEVCLASS' 'STXFADM'. m_fieldcat 'FORMTYPE' 'STXFADM'. m_fieldcat 'VERSION' 'STXFADM'. * Activate refresh button CLEAR ls_event_exit. ls_event_exit-after = c_x. ls_event_exit-ucomm = c_refresh. " Refresh APPEND ls_event_exit TO lt_event_exit. ls_event_exit-ucomm = c_eb9. " Refresh APPEND ls_event_exit TO lt_event_exit. * Display data CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-cprog i_callback_user_command = 'USER_COMMAND' i_callback_pf_status_set = 'PF_STATUS_SET' is_layout = ls_layout it_fieldcat = lt_fieldcat it_sort = lt_sort it_event_exit = lt_event_exit i_save = 'A' TABLES t_outtab = gt_data. ENDFORM. " F_DISPLAY_DATA *---------------------------------------------------------------------* * FORM USER_COMMAND * *---------------------------------------------------------------------* FORM user_command USING u_ucomm TYPE syucomm us_selfield TYPE slis_selfield. "#EC CALLED DATA : ls_data TYPE ty_s_data. CASE u_ucomm. WHEN '&IC1'. " Pick READ TABLE gt_data INDEX us_selfield-tabindex INTO ls_data. CHECK sy-subrc EQ 0. IF ls_data-formtype = space. * SAP Smart Forms: Name of a Smart Form SET PARAMETER ID 'SSFNAME' FIELD ls_data-formname. * SAP Smart Forms: Name of a Text Module SET PARAMETER ID 'SSFTXTNAME' FIELD space. ELSEIF ls_data-formtype = 'T'. * SAP Smart Forms: Name of a Smart Form SET PARAMETER ID 'SSFNAME' FIELD space. * SAP Smart Forms: Name of a Text Module SET PARAMETER ID 'SSFTXTNAME' FIELD ls_data-formname. ENDIF. * SAP Smart Forms CALL TRANSACTION 'SMARTFORMS'. " USING lt_bdcdata MODE 'A'. WHEN c_refresh. PERFORM f_read_data. us_selfield-refresh = c_x. WHEN c_eb9. LOOP AT gt_data INTO ls_data WHERE formtype = space AND checkbox = c_x. PERFORM f_download USING ls_data-formname space. ENDLOOP. IF sy-subrc IS NOT INITIAL. READ TABLE gt_data INDEX us_selfield-tabindex INTO ls_data. CHECK sy-subrc EQ 0. PERFORM f_download USING ls_data-formname c_x. ENDIF. ENDCASE. ENDFORM. " USER_COMMAND *---------------------------------------------------------------------* * FORM PF_STATUS_SET * *---------------------------------------------------------------------* FORM pf_status_set USING ut_extab TYPE slis_t_extab. "#EC CALLED * Display refresh button DELETE ut_extab WHERE fcode = c_refresh OR fcode = c_eb9. SET PF-STATUS 'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL' EXCLUDING ut_extab. ENDFORM. " PF_STATUS_SET *---------------------------------------------------------------------* * Form f_read_data *---------------------------------------------------------------------* FORM f_download USING u_formname TYPE tdsfname u_popup TYPE xfeld. TYPES : BEGIN OF ty_code, code(370) TYPE c, END OF ty_code, ty_t_code TYPE STANDARD TABLE OF ty_code. DATA : l_error TYPE xfeld, l_fm_name TYPE rs38l_fnam, l_ok TYPE xfeld, l_report TYPE program, l_ligne TYPE ty_code, l_ligne2 TYPE ty_code, l_tabix TYPE sytabix, l_localfile TYPE localfile, lt_tab TYPE ty_t_code, lt_report TYPE ty_t_code. CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = u_formname IMPORTING fm_name = l_fm_name EXCEPTIONS no_form = 1 no_function_module = 2 OTHERS = 3. CHECK sy-subrc IS INITIAL. * Importing and tabels parameters CONCATENATE l_fm_name(8) 'L' l_fm_name+8(10) 'U01' INTO l_report. READ REPORT l_report INTO lt_tab. CHECK sy-subrc IS INITIAL. CLEAR l_ok. LOOP AT lt_tab INTO l_ligne. IF l_ligne = '*" EXCEPTIONS'. EXIT. ENDIF. IF l_ligne = '*" EXPORTING'. CLEAR l_ok. ENDIF. IF l_ok IS NOT INITIAL. IF l_ok = 'T'. REPLACE ' STRUCTURE ' IN l_ligne WITH '%TYPE TABLE OF%'. CONCATENATE 'DATA%' l_ligne INTO l_ligne. ELSEIF l_ok = 'X'. REPLACE 'OPTIONAL' IN l_ligne WITH space. REPLACE 'REFERENCE(' IN l_ligne WITH 'DATA%'. REPLACE 'VALUE(' IN l_ligne WITH 'DATA%'. REPLACE ')' IN l_ligne WITH ' '. ENDIF. REPLACE '*"' IN l_ligne WITH ' '. TRANSLATE l_ligne USING '% '. CONCATENATE l_ligne '.' INTO l_ligne. CONDENSE l_ligne. APPEND l_ligne TO lt_report. ENDIF. IF l_ligne CS '(USER_SETTINGS)'. l_ok = 'X'. ENDIF. IF l_ligne = '*" TABLES'. l_ok = 'T'. ENDIF. ENDLOOP. CLEAR l_ligne(72) WITH '*'. APPEND l_ligne TO lt_report. * Global data and types CONCATENATE l_fm_name(8) 'L' l_fm_name+8(10) 'TOP' INTO l_report. READ REPORT l_report INTO lt_tab. CHECK sy-subrc IS INITIAL. LOOP AT lt_tab INTO l_ligne. IF l_ligne = '* TYPES AND CONSTANTS' OR l_ligne = '* GLOBAL DATAS'. EXIT. ELSE. DELETE lt_tab. ENDIF. ENDLOOP. APPEND LINES OF lt_tab TO lt_report. CLEAR l_ligne(72) WITH '*'. APPEND l_ligne TO lt_report. * Forms CONCATENATE l_fm_name(8) 'L' l_fm_name+8(10) 'F01' INTO l_report. READ REPORT l_report INTO lt_tab. CHECK sy-subrc IS INITIAL. CLEAR l_ok. LOOP AT lt_tab INTO l_ligne. IF l_ligne(5) = 'FORM '. IF l_ligne+5(12) = '%GLOBAL_INIT' OR l_ligne+5(3) = '%CO' OR l_ligne+5(1) <> '%'. l_ok = 'X'. l_tabix = sy-tabix - 5. DO 5 TIMES. READ TABLE lt_tab INTO l_ligne2 INDEX l_tabix. IF l_ligne2(1) = '*'. APPEND l_ligne2 TO lt_report. ENDIF. ADD 1 TO l_tabix. ENDDO. ENDIF. ENDIF. IF l_ok = 'X'. APPEND l_ligne TO lt_report. ENDIF. IF l_ligne(8) = 'ENDFORM.'. CLEAR l_ok. ENDIF. ENDLOOP. CONCATENATE 'REPORT' u_formname '.' INTO l_ligne SEPARATED BY space. INSERT l_ligne INTO lt_report INDEX 1. CLEAR l_ligne(72) WITH '*'. INSERT l_ligne INTO lt_report INDEX 2. CONCATENATE '*' u_formname sy-datum sy-uzeit sy-uname INTO l_ligne SEPARATED BY space. INSERT l_ligne INTO lt_report INDEX 3. CLEAR l_ligne(72) WITH '*'. INSERT l_ligne INTO lt_report INDEX 4. IF u_popup = c_x. EDITOR-CALL FOR lt_report DISPLAY-MODE. ELSE. CONCATENATE p_path u_formname '.' p_extens '.xml' INTO l_localfile. PERFORM xml_download IN PROGRAM rfrecpsftlxml USING u_formname l_localfile CHANGING l_error IF FOUND. ENDIF. ENDFORM. " F_DOWNLOAD *---------------------------------------------------------------------* * Form MODIF_EXTENSION * *---------------------------------------------------------------------* FORM modif_extension CHANGING u_extens TYPE char3. DATA l_len TYPE i. CHECK u_extens IS INITIAL. l_len = sy-datum+4(2) - 1. u_extens(1) = sy-abcde+l_len(1). u_extens+1(2) = sy-datum+6(2). " Current day ENDFORM. " MODIF_EXTENSION *---------------------------------------------------------------------* * Form SELECTION_SCREEN_FOR_P_PATH *---------------------------------------------------------------------* FORM selection_screen_for_p_path CHANGING u_path TYPE localfile. DATA : l_folder TYPE string. CALL METHOD cl_gui_frontend_services=>directory_browse EXPORTING initial_folder = 'C:\' CHANGING selected_folder = l_folder EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 OTHERS = 4. IF sy-subrc IS INITIAL. u_path = l_folder. ENDIF. ENDFORM. " SELECTION_SCREEN_FOR_P_PATH *---------------------------------------------------------------------* AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. PERFORM selection_screen_for_p_path CHANGING p_path. *---------------------------------------------------------------------* AT SELECTION-SCREEN ON p_extens. PERFORM modif_extension CHANGING p_extens. ************ END OF PROGRAM Z_ALV_SMARTFORMS **************************