REPORT z_alv_object_history.
*---------------------------------------------------------------------*
* This report displays data from table SGOSHIST (Object History)      *
*---------------------------------------------------------------------*
* Author : Michel PIOUD - Updated 16-Nov-07                           *
* HomePage : http://www.oocities.org/mpioud                          *
*---------------------------------------------------------------------*
* Macro definition
DEFINE m_ligne.
  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.

CONSTANTS :
  c_x VALUE 'X',
  c_refresh TYPE syucomm VALUE '&REFRESH'.
*---------------------------------------------------------------------*
TYPE-POOLS slis.                       " ALV Global types

TYPES :
  BEGIN OF ty_data,
    sapname   TYPE sgoshist-sapname,    " SAP User name
    name_last TYPE addr3_val-name_last, " User name
    keyword   TYPE swotbasdat-keyword,  " Object type short text
    objkey    TYPE sgoshist-objkey,     " Object key
    objtype   TYPE sgoshist-objtype,    " Object type
    timestamp TYPE sgoshist-timestamp,  " Time stamp
    tcode     TYPE sgoshist-tcode,      " Transaction code
    ttext     TYPE tstct-ttext,         " Transaction text
  END OF ty_data.

DATA :
  g_bname      TYPE ust04-bname,        " Users
  gs_sgoshist  TYPE sgoshist,           " Object History
  gs_date      TYPE range_s_dats,
  gr_timestamp TYPE RANGE OF tzntstmps,
  gs_timestamp LIKE LINE OF gr_timestamp,
  gt_data      TYPE STANDARD TABLE OF ty_data.

*---------------------------------------------------------------------*
* Select-Options / Parameters
m_ligne 1 s_sapnam g_bname.                                 "#EC NEEDED
m_ligne 2 s_tcode  gs_sgoshist-tcode.                       "#EC NEEDED
m_ligne 3 s_objtyp gs_sgoshist-objtype.                     "#EC NEEDED
m_ligne 4 s_objkey gs_sgoshist-objkey.                      "#EC NEEDED
m_ligne 5 s_date   sy-datum.                                "#EC NEEDED

SELECTION-SCREEN :
SKIP, BEGIN OF LINE, COMMENT 1(35) v_6 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.

  LOOP AT s_date INTO gs_date.
    CLEAR gs_timestamp.
    gs_timestamp-sign   = gs_date-sign.
    gs_timestamp-option = gs_date-option.

    IF NOT gs_date-low IS INITIAL.
      CONVERT DATE gs_date-low  TIME '000000'
         INTO TIME STAMP gs_timestamp-low TIME ZONE sy-zonlo.
      IF gs_date-high EQ '00000000'.
        gs_timestamp-option = 'BT'.
        CONVERT DATE gs_date-low TIME '235959'
           INTO TIME STAMP gs_timestamp-high TIME ZONE sy-zonlo.
      ENDIF.
    ENDIF.

    IF NOT gs_date-high IS INITIAL.
      CONVERT DATE gs_date-high TIME '235959'
         INTO TIME STAMP gs_timestamp-high TIME ZONE sy-zonlo.
    ENDIF.

    APPEND gs_timestamp TO gr_timestamp.
  ENDLOOP.

  PERFORM f_read_data.

*---------------------------------------------------------------------*
END-OF-SELECTION.

  PERFORM f_display_data.

*---------------------------------------------------------------------*
*       Form  F_READ_DATA
*---------------------------------------------------------------------*
FORM f_read_data.

  DATA l_adresse TYPE addr3_val.

  FIELD-SYMBOLS <data> TYPE ty_data.

* Read data from SGOSHIST
  SELECT * UP TO p_max ROWS
         INTO CORRESPONDING FIELDS OF TABLE gt_data
         FROM sgoshist
        WHERE sapname   IN s_sapnam
          AND tcode     IN s_tcode
          AND objtype   IN s_objtyp
          AND objkey    IN s_objkey
          AND timestamp IN gr_timestamp
     ORDER BY timestamp DESCENDING.

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

*   Get Object type short text
    CALL FUNCTION 'SWO_TEXT_OBJTYPE'
      EXPORTING
        objtype = <data>-objtype
      IMPORTING
        keyword = <data>-keyword.

*   Get user address data
    CALL FUNCTION 'SUSR_USER_ADDRESS_READ'
      EXPORTING
        user_name              = <data>-sapname          "#EC DOM_EQUAL
      IMPORTING
        user_address           = l_adresse
      EXCEPTIONS
        user_address_not_found = 1
        OTHERS                 = 2.

    IF sy-subrc = 0.
      CONCATENATE l_adresse-name_last l_adresse-name_first
             INTO <data>-name_last SEPARATED BY space.
    ELSE.
      <data>-name_last = <data>-sapname.
    ENDIF.

*   Read transaction code text
    CALL FUNCTION 'BAL_DSP_TXT_ALTCODE_READ'
      EXPORTING
        i_tcode = <data>-tcode
      IMPORTING
        e_text  = <data>-ttext.

  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.
    ls_fieldcat-no_out      = &3.
    ls_fieldcat-edit_mask   = &4.
    ls_fieldcat-no_sum      = &5.
    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_grid_settings TYPE lvc_s_glay.

  ls_grid_settings-top_p_only = c_x.

  ls_layout-colwidth_optimize = c_x.
  ls_layout-zebra             = c_x.
  ls_layout-cell_merge        = c_x.

* Build sort table
  m_sort 'NAME_LAST' c_x ''  'UL'.
  m_sort 'TIMESTAMP' ''  c_x ''.

* Build field catalog table
  m_fieldcat 'SAPNAME'   'SGOSHIST'   c_x '' ''.
  m_fieldcat 'NAME_LAST' 'ADDR3_VAL'  ''  '' ''.
  m_fieldcat 'TIMESTAMP' 'SGOSHIST'   ''  '==TSTLC' c_x.
  m_fieldcat 'TCODE'     'SGOSHIST'   ''  '' ''.
  m_fieldcat 'TTEXT'     'TSTCT'      ''  '' ''.
  m_fieldcat 'OBJKEY'    'SGOSHIST'   ''  '==ALPHA' ''.
  m_fieldcat 'KEYWORD'   'SWOTBASDAT' ''  '' ''.
  m_fieldcat 'OBJTYPE'   'SGOSHIST'   c_x '' ''.

* 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_top_of_page   = 'TOP_OF_PAGE'
      i_callback_user_command  = 'USER_COMMAND'
      i_callback_pf_status_set = 'PF_STATUS_SET'
      is_layout                = ls_layout
      i_grid_settings          = ls_grid_settings
      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

  CASE u_ucomm.
    WHEN c_refresh.
      PERFORM f_read_data.             " Refresh 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 TOP_OF_PAGE                                              *
*---------------------------------------------------------------------*
FORM top_of_page.                                           "#EC CALLED

  ULINE.
  WRITE : sy-title(65) CENTERED, 'Page :' , sy-pagno .
  ULINE.

ENDFORM.                               " TOP_OF_PAGE
*---------------------------------------------------------------------*
*      Form  f_initialization
*---------------------------------------------------------------------*
FORM f_initialization .

  DATA:
    ls_sapnam LIKE LINE OF s_sapnam.

  v_1 = 'User name'.
  v_2 = 'Transaction code'.
  v_3 = 'Object type'.
  v_4 = 'Object key'.
  v_5 = 'Date'.
  v_6 = 'Maximum number of selected entries'.

  gs_date-low  = sy-datum.
  gs_date-high = sy-datum.
  APPEND gs_date TO s_date.

  CONCATENATE 'IEQ' sy-uname INTO ls_sapnam.
  APPEND ls_sapnam TO s_sapnam.

ENDFORM.                    " f_initialization
************ END OF PROGRAM Z_ALV_OBJECT_HISTORY **********************