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