REPORT z_alv_list_transposed.
*---------------------------------------------------------------------*
* This report displays an ALV Grid list transposed. It can be easely  *
* adapted to your needs, just replace SPFLI by another DDIC table     *
*---------------------------------------------------------------------*
* Author : Michel PIOUD - Updated 19-Nov-07                           *
* HomePage : http://www.oocities.org/mpioud                          *
*---------------------------------------------------------------------*
TYPE-POOLS: slis.                      " ALV Global types

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

DATA gt_data TYPE TABLE OF spfli.

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

  v_1 = 'Maximum of records to read'.

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

  PERFORM f_read_data.

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

  PERFORM f_display_data.

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

  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_data
             UP TO p_max ROWS
           FROM spfli.

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,
    ls_data     LIKE LINE OF gt_data.

  FIELD-SYMBOLS :
    <header>       TYPE ANY,
    <field_header> TYPE ANY,
    <field_spfli>  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  = '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 <header>.

* Create field catalog from dictionary structure
  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name       = 'SPFLI'
    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 <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_spfli>.
      IF sy-subrc NE 0. EXIT .ENDIF.
      ASSIGN COMPONENT l_column OF STRUCTURE <header> TO <field_header>.
      IF sy-subrc NE 0. EXIT .ENDIF.
      WRITE <field_spfli> TO <field_header> LEFT-JUSTIFIED.
    ENDLOOP.
    APPEND <header> TO <lt_data>.
  ENDDO.

  ls_layout-zebra = 'X'.
  ls_layout-no_colhead = 'X'.
  ls_layout-colwidth_optimize = '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
************ END OF PROGRAM Z_ALV_LIST_TRANSPOSED *********************