REPORT z_alv_list_transposed_v2.
*---------------------------------------------------------------------*
* This report displays an ALV Grid list transposed.                   *
*---------------------------------------------------------------------*
* Author : Michel PIOUD - Updated 19-Nov-07                           *
* HomePage : http://www.oocities.org/mpioud                          *
*---------------------------------------------------------------------*
CONSTANTS :
  c_x VALUE 'X'.
*---------------------------------------------------------------------*
TYPE-POOLS: slis.                      " ALV Global types

SELECTION-SCREEN :
BEGIN OF LINE, COMMENT 1(35) v_1 FOR FIELD p_table.         "#EC NEEDED
PARAMETERS p_table TYPE dd03l-tabname OBLIGATORY.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN :
  SKIP, BEGIN OF LINE,COMMENT 5(27) v_2 FOR FIELD p_max.    "#EC NEEDED
PARAMETERS p_max(2) TYPE n DEFAULT '10' OBLIGATORY.
SELECTION-SCREEN END OF LINE.

FIELD-SYMBOLS :
  <gt_data> TYPE STANDARD TABLE.       " Read Data

*---------------------------------------------------------------------*
INITIALIZATION.

  v_1 = 'Table or view'.
  v_2 = 'Maximum of records to read'.

*---------------------------------------------------------------------*
AT SELECTION-SCREEN.

  PERFORM f_check_table.

*---------------------------------------------------------------------*
START-OF-SELECTION.

  PERFORM f_read_data.

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

  PERFORM f_display_data.

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

  DATA:
    lp_table TYPE REF TO data.         " Pointer to dynamic table

* Create internal table
  CREATE DATA lp_table TYPE STANDARD TABLE OF (p_table)
                       WITH NON-UNIQUE DEFAULT KEY.
  ASSIGN lp_table->* TO <gt_data>.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE <gt_data>
             UP TO p_max ROWS
           FROM (p_table).

ENDFORM.                               " F_READ_DATA
*---------------------------------------------------------------------*
*      Form  F_DISPLAY_DATA
*---------------------------------------------------------------------*
FORM f_display_data.

  DATA:
    l_column    TYPE sy-tabix,
    lp_struct   TYPE REF TO data,
    lp_table    TYPE REF TO data,      " Pointer to dynamic table
    ls_lvc_cat  TYPE lvc_s_fcat,
    lt_lvc_cat  TYPE lvc_t_fcat,       " Field catalog
    lt_fcat     TYPE slis_t_fieldcat_alv,  " Field catalog
    ls_fieldcat TYPE slis_fieldcat_alv,
    lt_fieldcat TYPE slis_t_fieldcat_alv,  " Field catalog
    ls_layout   TYPE slis_layout_alv.

  FIELD-SYMBOLS :
    <ls_header>    TYPE ANY,
    <field_header> TYPE ANY,
    <field_data>   TYPE ANY,
    <ls_data>      TYPE ANY,
    <lt_data>      TYPE STANDARD TABLE." Data to display

  ls_lvc_cat-fieldname = 'COLUMNTEXT'.
  ls_lvc_cat-ref_table = 'LVC_S_DETA'.
  APPEND ls_lvc_cat TO lt_lvc_cat.

  ls_fieldcat-fieldname = 'COLUMNTEXT'.
  ls_fieldcat-ref_tabname = 'LVC_S_DETA'.
  ls_fieldcat-key  = c_x.
  APPEND ls_fieldcat TO lt_fieldcat.

  DESCRIBE TABLE <gt_data>.

  DO sy-tfill TIMES.
*   For each line, a column 'VALUEx' is created in the fieldcatalog
*   Build Fieldcatalog
    WRITE sy-index TO ls_lvc_cat-fieldname LEFT-JUSTIFIED.
    CONCATENATE 'VALUE' ls_lvc_cat-fieldname
           INTO ls_lvc_cat-fieldname.
    ls_lvc_cat-ref_field = 'VALUE'.
    ls_lvc_cat-ref_table = 'LVC_S_DETA'.
    APPEND ls_lvc_cat TO lt_lvc_cat.
*   Build Fieldcatalog
    CLEAR ls_fieldcat.
    ls_fieldcat-fieldname = ls_lvc_cat-fieldname.
    ls_fieldcat-ref_fieldname = 'VALUE'.
    ls_fieldcat-ref_tabname = 'LVC_S_DETA'.
    APPEND ls_fieldcat TO lt_fieldcat.
  ENDDO.

* Create internal table
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = lt_lvc_cat
    IMPORTING
      ep_table        = lp_table.

  ASSIGN lp_table->* TO <lt_data>.

* Create structure = structure of the internal table
  CREATE DATA lp_struct LIKE LINE OF <lt_data>.
  ASSIGN lp_struct->* TO <ls_header>.

* Create structure = structure of the internal table
  CREATE DATA lp_struct LIKE LINE OF <gt_data>.
  ASSIGN lp_struct->* TO <ls_data>.

* Create field catalog from dictionary structure
  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name       = p_table
    CHANGING
      ct_fieldcat            = lt_fcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  DESCRIBE TABLE lt_fcat.

* Fill the internal to display <lt_data>
  DO sy-tfill TIMES.
    IF sy-index = 1.
      READ TABLE lt_fcat INTO ls_fieldcat INDEX 1.
      IF ls_fieldcat-fieldname = 'MANDT'.
*       If 1st column is MANDT, it's not displayed
        CONTINUE.
      ENDIF.
    ENDIF.
*   For each field of GT_DATA
    ASSIGN COMPONENT 1 OF STRUCTURE <ls_header> TO <field_header>.
    IF sy-subrc NE 0. EXIT .ENDIF.
    READ TABLE lt_fcat INTO ls_fieldcat INDEX sy-index.
*   Fill 1st column
    <field_header> = ls_fieldcat-seltext_m.
    IF <field_header> IS INITIAL.
      <field_header> = ls_fieldcat-fieldname.
    ENDIF.

    LOOP AT <gt_data> INTO <ls_data>.
      l_column = sy-tabix + 1.
      ASSIGN COMPONENT sy-index OF STRUCTURE <ls_data> TO <field_data>.
      IF sy-subrc NE 0. EXIT .ENDIF.
      ASSIGN COMPONENT l_column OF STRUCTURE <ls_header> TO <field_header>.
      IF sy-subrc NE 0. EXIT .ENDIF.
      WRITE <field_data> TO <field_header> LEFT-JUSTIFIED.
    ENDLOOP.
    APPEND <ls_header> TO <lt_data>.
  ENDDO.

  ls_layout-zebra = c_x.
  ls_layout-no_colhead = c_x.
  ls_layout-colwidth_optimize = c_x.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      is_layout   = ls_layout
      it_fieldcat = lt_fieldcat
    TABLES
      t_outtab    = <lt_data>.

ENDFORM.                               " F_DISPLAY_DATA
*---------------------------------------------------------------------*
*      Form  F_CHECK_TABLE
*---------------------------------------------------------------------*
FORM f_check_table .

  DATA :
    l_tabclass  TYPE tabclass,            " Table category
    l_viewclass TYPE viewclass.           " View Type

* Read table category
  SELECT SINGLE tabclass viewclass
           INTO (l_tabclass, l_viewclass)
           FROM dd02l
          WHERE tabname  = p_table
            AND as4local = 'A'
            AND as4vers  = '0000'.
  IF sy-subrc NE 0.
*   Table & is not active in the Dictionary
    MESSAGE e402(mo) WITH p_table.
  ELSEIF l_tabclass = 'INTTAB'.
*   & is a structure, not a table
    MESSAGE e403(mo) WITH p_table.
  ELSEIF l_tabclass = 'VIEW' AND l_viewclass NE 'D'.
*   Only use views of type "Maintenance view"
    MESSAGE e309(sv).
  ENDIF.

ENDFORM.                    " F_CHECK_TABLE
********* END OF PROGRAM Z_ALV_LIST_TRANSPOSED_V2 *********************