REPORT z_alv_sapscripts.
*---------------------------------------------------------------------*
* ALV List of Sapscript Forms                                         *
*---------------------------------------------------------------------*
* Author : Michel PIOUD - Updated 05-Feb-09                           *
* HomePage : http://www.oocities.org/mpioud/Abap_programs.html       *
*---------------------------------------------------------------------*
* Macro definition
DEFINE mac_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_refresh TYPE syucomm VALUE '&REFRESH'.

*---------------------------------------------------------------------*
TYPES :
  BEGIN OF ty_s_data.
INCLUDE TYPE stxh.
TYPES :
    devclass TYPE tadir-devclass,
    tdline   TYPE tline-tdline,
    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
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(20) v_1 FOR FIELD s_mandt.      "#EC NEEDED
SELECT-OPTIONS s_mandt FOR gs_dummy_data-mandt DEFAULT sy-mandt
                 MATCHCODE OBJECT ddsef4clnt.
SELECTION-SCREEN END OF LINE.
mac_line 2 s_fname  gs_dummy_data-tdname.                   "#EC NEEDED
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(20) v_3 FOR FIELD s_luser.      "#EC NEEDED
SELECT-OPTIONS s_luser FOR gs_dummy_data-tdluser
          MATCHCODE OBJECT user_comp.
SELECTION-SCREEN END OF LINE.
mac_line 4 s_ldate  gs_dummy_data-tdldate.                  "#EC NEEDED
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(20) v_5 FOR FIELD s_fuser.      "#EC NEEDED
SELECT-OPTIONS s_fuser FOR gs_dummy_data-tdfuser
          MATCHCODE OBJECT user_comp.
SELECTION-SCREEN END OF LINE.
mac_line 6 s_fdate  gs_dummy_data-tdfdate.                  "#EC NEEDED
mac_line 7 s_dvclss gs_dummy_data-devclass.                 "#EC NEEDED
mac_line 8 s_spras  gs_dummy_data-tdspras.                  "#EC NEEDED

SELECTION-SCREEN :
SKIP, BEGIN OF LINE, COMMENT 1(35) v_21 FOR FIELD p_string. "#EC NEEDED
PARAMETERS p_string TYPE tdtitle.
SELECTION-SCREEN :END OF LINE,
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.
*---------------------------------------------------------------------*
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_dvclss LIKE LINE OF s_dvclss.

  v_1 = 'Client'.
  v_2 = 'Sapscript Form Name'.
  v_3 = 'Last changed by'.
  v_4 = 'Changed on'.
  v_5 = 'Created by'.
  v_6 = 'Created on'.
  v_7 = 'Devlopment Class'.
  v_8 = 'Language'.
  v_20 = 'Maximum number of selected entries'.
  v_21 = 'String'.

  CONCATENATE 'ICP' 'Z*' INTO ls_fname.
  APPEND ls_fname TO s_fname.

  CONCATENATE 'ICP' 'Z*' INTO ls_dvclss.
  APPEND ls_dvclss TO s_dvclss.

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 STXH
  SELECT * UP TO p_max ROWS
         INTO CORRESPONDING FIELDS OF TABLE gt_data
         FROM tadir AS t
         JOIN stxh AS s
           ON t~obj_name = s~tdname CLIENT SPECIFIED
        WHERE pgmid = 'R3TR'
          AND object = 'FORM'
          AND tdobject = 'FORM'
          AND tdid    <> 'DEF'
          AND tdname   IN s_fname
          AND tdluser  IN s_luser
          AND tdfuser  IN s_fuser
          AND tdldate  IN s_ldate
          AND devclass IN s_dvclss
          AND tdspras  IN s_spras
          AND mandt    IN s_mandt.

* Sort to improve performance of FM SUSR_USER_ADDRESS_READ
  SORT gt_data BY tdluser.
  LOOP AT gt_data ASSIGNING <ls_data>.

*   Get user address data
    CALL FUNCTION 'SUSR_USER_ADDRESS_READ'
      EXPORTING
        user_name              = <ls_data>-tdluser          "#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>-tdluser SEPARATED BY space.
    ENDIF.

*   Get user address data
    CALL FUNCTION 'SUSR_USER_ADDRESS_READ'
      EXPORTING
        user_name              = <ls_data>-tdfuser          "#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>-tdfuser SEPARATED BY space.
    ENDIF.

    PERFORM fill_firstline CHANGING <ls_data>.

  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_fieldcat   TYPE slis_fieldcat_alv,
    lt_fieldcat   TYPE slis_t_fieldcat_alv,
    lt_sort       TYPE slis_t_sortinfo_alv,
    ls_sort       TYPE slis_sortinfo_alv,
    ls_layout     TYPE slis_layout_alv,
    lt_event_exit TYPE slis_t_event_exit,
    ls_event_exit TYPE slis_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 'TDLDATE' ''  c_x ''.
  m_sort 'TDLTIME' ''  c_x ''.
*
* Build field catalog table
  m_fieldcat 'MANDT'    'STXH'.
  m_fieldcat 'TDNAME'   'STXH'.
  m_fieldcat 'TDSPRAS'  'STXH'.
  m_fieldcat 'TDTITLE'  'STXH'.
  m_fieldcat 'TDLDATE'  'STXH'.
  m_fieldcat 'TDLTIME'  'STXH'.
  m_fieldcat 'TDLUSER'  'STXH'.
  m_fieldcat 'TDFUSER'  'STXH'.
  m_fieldcat 'TDFDATE'  'STXH'.
  m_fieldcat 'TDFTIME'  'STXH'.
  m_fieldcat 'DEVCLASS' 'TADIR'.
  m_fieldcat 'TDLINE'   'TLINE'.

* Activate refresh button
  CLEAR ls_event_exit.
  ls_event_exit-ucomm = c_refresh.     " Refresh
  ls_event_exit-after = c_x.
  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 :
    l_spras(2),
    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.
      CHECK ls_data-mandt EQ sy-mandt.
*     SAPscript form name
      SET PARAMETER ID 'TXF' FIELD ls_data-tdform.
      WRITE ls_data-tdspras TO l_spras.
*     SAPscript form and style language
      SET PARAMETER ID 'TXL' FIELD l_spras.
*     SAPscript form
      CALL TRANSACTION 'SE71'.
    WHEN c_refresh.
      PERFORM f_read_data.
      us_selfield-refresh = c_x.
  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.

  SET PF-STATUS 'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL'
      EXCLUDING ut_extab.

ENDFORM.                               " PF_STATUS_SET
*---------------------------------------------------------------------*
*      Form  FILL_FIRSTLINE
*---------------------------------------------------------------------*
FORM fill_firstline CHANGING us_data TYPE ty_s_data.

  DATA:
    ls_lines TYPE tline,
    lt_lines TYPE tline_t.

  CALL FUNCTION 'READ_FORM'
    EXPORTING
      client     = us_data-mandt
      form       = us_data-tdform
      language   = us_data-tdspras
    TABLES
      form_lines = lt_lines.

  LOOP AT lt_lines INTO ls_lines WHERE NOT tdline IS INITIAL.
    us_data-tdline = ls_lines-tdline.
    EXIT.
  ENDLOOP.

  IF NOT p_string IS INITIAL.
    LOOP AT lt_lines INTO ls_lines WHERE NOT tdline IS INITIAL.
      IF ls_lines-tdline CS p_string.
        us_data-tdline = ls_lines-tdline.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDFORM.                               " FILL_FIRSTLINE
******************* END OF PROGRAM Z_ALV_SAPSCRIPTS *******************