Montag, 1. August 2011

ABAP Tool: Great stuff

Thanks to Frank.

*&-----------------------------------------------------------*
*& Report  Z_UPLOAD_TOOL
*&
*&-----------------------------------------------------------*
*&
*&  Loads every file up and down
*&-----------------------------------------------------------*

REPORT  Z_UPLOAD_TOOL.
tYPE-POOLS: abap.

PARAMETERS: tabname TYPE tabname16,
download RADIOBUTTON GROUP radi,
upload RADIOBUTTON GROUP radi.

DATA l_tab TYPE TABLE OF sdokpath.
DATA  l_wa_tab TYPE sdokpath.
DATA l_path TYPE string.
DATA l_wa_ref TYPE REF TO data.
DATA l_offset TYPE i.
DATA load(2) TYPE c.


FIELD-SYMBOLS: <l_string> TYPE ANY,
               <f1> TYPE abap_compdescr,
               <l_wa_tab> TYPE ANY.


DATA l_wa_data_tab(2000) TYPE c.
DATA l_data_tab LIKE  TABLE OF l_wa_data_tab.

DATA l_descr_ref TYPE REF TO cl_abap_typedescr.
DATA l_struc_ref TYPE REF TO cl_abap_structdescr.


CONSTANTS: con_download(2) TYPE c VALUE 'DL',
           con_upload(2) TYPE c VALUE 'UL'.




START-OF-SELECTION.

  IF download EQ 'X'.
    load = con_download.
  ELSE.
    load = con_upload.
  ENDIF.

  CASE load.

    WHEN con_download.

      CREATE DATA l_wa_ref TYPE (tabname).
      ASSIGN l_wa_ref->* TO  <l_wa_tab>.

      SELECT * FROM (tabname) INTO <l_wa_tab>.

        l_wa_data_tab = <l_wa_tab>.
        APPEND  l_wa_data_tab TO l_data_tab.

      ENDSELECT.

      CALL FUNCTION 'TMP_GUI_FILE_OPEN_DIALOG'
        EXPORTING
          window_title = 'DOWNLOAD'
        TABLES
          file_table   = l_tab
        EXCEPTIONS
          cntl_error   = 1
          OTHERS       = 2.
      IF sy-subrc <> 0.
      ENDIF.

      READ TABLE l_tab INTO l_wa_tab INDEX 1.
      l_path = l_wa_tab.


      CALL FUNCTION 'GUI_DOWNLOAD'
        EXPORTING
          filename                = l_path
        TABLES
          data_tab                = l_data_tab
        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.
        MESSAGE e063(5v).
*   No records down/uploaded
      ENDIF.




    WHEN con_upload.


      CALL FUNCTION 'TMP_GUI_FILE_OPEN_DIALOG'
        EXPORTING
          window_title = 'UPLOAD'
        TABLES
          file_table   = l_tab
        EXCEPTIONS
          cntl_error   = 1
          OTHERS       = 2.
      IF sy-subrc <> 0.
      ENDIF.

      READ TABLE l_tab INTO l_wa_tab INDEX 1.
      l_path = l_wa_tab.


      CALL FUNCTION 'GUI_UPLOAD'
        EXPORTING
          filename                = l_path
        TABLES
          data_tab                = l_data_tab
        EXCEPTIONS
          file_open_error         = 1
          file_read_error         = 2
          no_batch                = 3
          gui_refuse_filetransfer = 4
          invalid_type            = 5
          no_authority            = 6
          unknown_error           = 7
          bad_data_format         = 8
          header_not_allowed      = 9
          separator_not_allowed   = 10
          header_too_long         = 11
          unknown_dp_error        = 12
          access_denied           = 13
          dp_out_of_memory        = 14
          disk_full               = 15
          dp_timeout              = 16
          OTHERS                  = 17.

      IF sy-subrc <> 0.
        MESSAGE e063(5v).
*   No records down/uploaded
      ENDIF.



      CREATE DATA l_wa_ref TYPE (tabname).
      ASSIGN l_wa_ref->* TO  <l_wa_tab>.


      CALL METHOD cl_abap_typedescr=>describe_by_name
        EXPORTING
          p_name         = tabname
        RECEIVING
          p_descr_ref    = l_descr_ref
        EXCEPTIONS
          type_not_found = 1
          OTHERS         = 2.
      IF sy-subrc <> 0.
        .
      ENDIF.


      l_struc_ref ?=  l_descr_ref.

      LOOP AT l_data_tab ASSIGNING <l_string>.
        CLEAR l_offset.
        LOOP AT  l_struc_ref->components ASSIGNING <f1>.
          <l_wa_tab>+l_offset(<f1>-length)  =
                                <l_string>+l_offset(<f1>-length).

          l_offset = l_offset + <f1>-length.

        ENDLOOP.

        MODIFY (tabname) FROM <l_wa_tab>.

      ENDLOOP.



  endcase.

0 Kommentare:

Kommentar veröffentlichen