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 **************************