*&---------------------------------------------------------------------*
*& Report  Z_READTABLES
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  z_readtables.

*&---------------------------------------------------------------------*
*& Report  Z_MARKUS001
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

*----------------------------------------------------------------------*
*       CLASS readtabs DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS readtabs DEFINITION.
  PUBLIC SECTION.
    METHODS: main, storelocal.


  PRIVATE SECTION.
    "CONSTANTS dset TYPE string VALUE 'D:\temp\sap.csv'.

    DATA:  lt_xmlstr TYPE TABLE OF string,
           fn TYPE fieldname,
           field_lengths TYPE TABLE OF i.

ENDCLASS.                    "demo DEFINITION

SELECTION-SCREEN BEGIN OF BLOCK tabs WITH FRAME TITLE text-s02.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) text-s01.
PARAMETERS: tabfrom(10) TYPE c OBLIGATORY DEFAULT 'T000'.
SELECTION-SCREEN END   OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) text-s02.
PARAMETERS: tabthru(10) TYPE c OBLIGATORY DEFAULT 'T000'.
SELECTION-SCREEN COMMENT 25(10) text-s03.
PARAMETERS: totalr AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END   OF LINE.
SELECTION-SCREEN END OF BLOCK tabs.

SELECTION-SCREEN BEGIN OF BLOCK data WITH FRAME TITLE text-s04.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) text-s04.
PARAMETERS: showdata AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 18(12) text-s05.
PARAMETERS: maxdata TYPE i DEFAULT 5.
SELECTION-SCREEN END   OF LINE.

SELECTION-SCREEN END OF BLOCK data.

SELECTION-SCREEN BEGIN OF BLOCK download WITH FRAME TITLE text-s06.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(14) text-s06.
PARAMETERS: downfile(80) TYPE c OBLIGATORY DEFAULT 'D:\temp\tabs.csv'.
SELECTION-SCREEN END   OF LINE.

SELECTION-SCREEN END OF BLOCK download.

*----------------------------------------------------------------------*
*       CLASS demo  IMPLEMENTATIO
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS readtabs IMPLEMENTATION.

  METHOD main.
    TYPES: BEGIN OF mytable,
      tabname TYPE tabname,
      ddtext TYPE ddtext,
      ddtext_de TYPE ddtext,
      END OF mytable.

    FIELD-SYMBOLS: <tab> TYPE ANY TABLE,
                   <wa> TYPE ANY,
                   <field> TYPE ANY.


    DATA: rs TYPE cursor,
          help TYPE string,
          help2 TYPE string,
          text1 TYPE string,
          text2 TYPE string,
          text3 TYPE string,
          text4 TYPE string,
          statustext TYPE c LENGTH 50,
          fieldnames TYPE string,
          fieldlabels TYPE string,

          total TYPE i,
          idx TYPE i,
          where_cl TYPE string,
          order_cl TYPE string,
          tabparam TYPE tabname.

    DATA: tabdata TYPE mytable,
          tables TYPE TABLE OF mytable,
          totaltabs TYPE i,
          cc TYPE i,
          out TYPE i,
          perc TYPE i.

    DATA BEGIN OF tabfields.
    DATA: fieldname TYPE fieldname,
    inttype TYPE inttype,
    intlen TYPE intlen,
    fldlabel TYPE ddtext,
    domlabel TYPE ddtext.
    DATA END OF tabfields.

    REFRESH: lt_xmlstr.

    SELECT
      a~tabname
      b~ddtext
      c~ddtext
    FROM dd02l AS a
      LEFT outer JOIN dd02t AS b
        ON b~tabname = a~tabname
        AND b~ddlanguage = 'EN'
      LEFT OUTER JOIN dd02t AS c
        ON c~tabname = a~tabname
        AND c~ddlanguage = 'DE'
    INTO TABLE tables
    WHERE a~tabname between tabfrom AND tabthru
    AND a~tabclass = 'TRANSP'
    ORDER BY a~tabname.

      CLEAR field_lengths.
      DESCRIBE TABLE tables LINES totaltabs.

      cc = 1.
      out = 1.
      LOOP AT tables INTO tabdata.
        tabparam = tabdata-tabname.

        perc = cc MOD 20.
        IF perc EQ 0.
          help = totaltabs.
          text3 = cc.
          CONCATENATE 'Processing' text3 '/' help INTO statustext SEPARATED BY ' '.
          CALL FUNCTION 'PROGRESS_INDICATOR'
            EXPORTING
              i_text               = statustext
              i_processed          = cc
              i_total              = totaltabs
              i_output_immediately = 'X'.
          "COMMIT WORK.
        ENDIF.
        cc = cc + 1.

        IF STRLEN( tabparam ) > 1.

          " count rows
          IF totalr IS NOT INITIAL.
            CLEAR total.
            SELECT SINGLE COUNT( * ) INTO total FROM (tabparam).
            help2 = total.
          ELSE.
            help2 = ''.
          ENDIF.


          " starting csv line
          text3 = out.
          CONCATENATE text3 tabdata-tabname tabdata-ddtext help2 INTO text1 SEPARATED BY ';'.
          out = out + 1.

          " get fields
          CONCATENATE 'a~tabname = ''' tabparam '''' INTO where_cl.
          order_cl = 'a~position'.

          CLEAR fieldnames.
          CLEAR fieldlabels.
          SELECT a~fieldname
                 a~inttype
                 a~intlen
                 b~ddtext
                 c~ddtext
            FROM dd03l AS a
              LEFT OUTER JOIN dd03t AS b
                ON b~tabname = a~tabname
                AND b~fieldname = a~fieldname
                AND b~ddlanguage = 'EN'
              LEFT OUTER JOIN dd01t AS c
                ON c~domname = a~domname
                AND c~ddlanguage = 'EN'
            INTO tabfields
            WHERE (where_cl)
            ORDER BY (order_cl).

            text3 = tabfields-inttype.
            text4 = tabfields-intlen.

            APPEND tabfields-intlen TO field_lengths.

            CONCATENATE fieldnames tabfields-fieldname ' (' text3 text4 ');' INTO fieldnames.

            IF tabfields-fldlabel IS NOT INITIAL.
              CONCATENATE fieldlabels tabfields-fldlabel ';' INTO fieldlabels.
            ELSE.
              CONCATENATE fieldlabels tabfields-domlabel ';' INTO fieldlabels.
            ENDIF.

          ENDSELECT.
          CONCATENATE text1 fieldnames INTO text3 SEPARATED BY ';'.
          APPEND text3 TO lt_xmlstr.

          concatenate ';;' tabdata-ddtext_de ';' into text3.
          CONCATENATE text3 fieldlabels INTO text3 SEPARATED BY ';'.
          APPEND text3 TO lt_xmlstr.


          " get data
          IF showdata IS NOT INITIAL.

*----- Referencer for Itab and Itab Workarea
            DATA ref_itab TYPE REF TO data.
            DATA ref_itwa TYPE REF TO data.
*----- Dereferencer for Itab Body
            FIELD-SYMBOLS: <fs_itab> TYPE STANDARD TABLE.
*----- Dereferencer for Itab Workarea
            FIELD-SYMBOLS: <fs_itwa> TYPE ANY.
*----- Dereferencer for Itab Workarea Components
            FIELD-SYMBOLS: <fs_comp> TYPE ANY.

            TRY.

*----- Define Itab for all DB-Records
                CREATE DATA ref_itab TYPE STANDARD TABLE OF (tabparam).

*----- Make Content of Itab accessible
*      Dereference (->*) Pointer ref_itab into a <fs>
                ASSIGN ref_itab->* TO <fs_itab>.

*----- Read all DB-Records into Itab
                SELECT * FROM (tabparam) UP TO maxdata ROWS INTO TABLE <fs_itab>.
                IF sy-subrc NE 0.
                  APPEND ';;;;no data' TO lt_xmlstr.
                ELSE.

*----- Define Workarea for Itab
                  CREATE DATA ref_itwa TYPE (tabparam).
*----- Make content of Itab Workarea accessible
                  ASSIGN ref_itwa->* TO <fs_itwa>.


                  LOOP AT <fs_itab> INTO <fs_itwa>.
                    text1 = ';;;;'.
                    DO.
*----- Assign via do-loop every component of itab workarea
*      to a component fieldsymbol and access content for write
                      ASSIGN COMPONENT sy-index OF STRUCTURE
                                       <fs_itwa> TO <fs_comp>.
*----- Abort endless loop after assign of last component
                      IF sy-subrc NE 0. EXIT. ENDIF.
                      text2 = <fs_comp>.
                      CONCATENATE text1 text2 ';' INTO text1.

                    ENDDO.
                    APPEND text1 TO lt_xmlstr.

                  ENDLOOP.
                ENDIF.
              CATCH cx_root. "DB-Table does not exist
                APPEND ';;;;data error' TO lt_xmlstr.
            ENDTRY.

          ENDIF.  " showdata
        ENDIF.    " strlen
      ENDLOOP.        " at tables

      text1 = out.
      text2 = totaltabs.
      CONCATENATE text1 '/' text2 'tables read.' INTO text3 SEPARATED BY ' '.
      MESSAGE text3 TYPE 'I'.

    ENDMETHOD.                    "demo



    METHOD storelocal.

      DATA dset TYPE string.

      dset = downfile.

*.. Download
      CALL FUNCTION 'GUI_DOWNLOAD'
        EXPORTING
          filename                = dset
        TABLES
          data_tab                = lt_xmlstr
        EXCEPTIONS
          file_write_error        = 1
          no_batch                = 2
          gui_refuse_filetransfer = 3
          invalid_type            = 4
          no_authority            = 5
          unknown_error           = 6
          header_not_allowed      = 7
          separator_not_allowed   = 8
          filesize_not_allowed    = 9
          header_too_long         = 10
          dp_error_create         = 11
          dp_error_send           = 12
          dp_error_write          = 13
          unknown_dp_error        = 14
          access_denied           = 15
          dp_out_of_memory        = 16
          disk_full               = 17
          dp_timeout              = 18
          file_not_found          = 19
          dataprovider_exception  = 20
          control_flush_error     = 21
          OTHERS                  = 22.
      IF sy-subrc <> 0.
        WRITE 'Error'.
      ENDIF.




    ENDMETHOD.                    "storeLocal


  ENDCLASS.                    "demo  IMPLEMENTATIO

*&---------------------------------------------------------------------*
*& Implementations
*&---------------------------------------------------------------------*

START-OF-SELECTION.
*WRITE text.

  DATA demo TYPE REF TO readtabs.
  CREATE OBJECT demo.
  demo->main( ).
  demo->storelocal( ).
  LEAVE SCREEN.