Upload/Download Change Request from/to PC

*&---------------------------------------------------------------------*
*& Report  Z_UP_DOWN_CR
*&---------------------------------------------------------------------*
*& Upload/Download Change Request from/to PC
*&---------------------------------------------------------------------*
*& Unknown author
*&---------------------------------------------------------------------*
 
REPORT z_up_down_cr.
 
* Selection screen *
PARAMETERS p_trkorr LIKE e070-trkorr OBLIGATORY.
PARAMETERS p_lpath(100) OBLIGATORY DEFAULT 'c:\temp\'.
 
SELECTION-SCREEN SKIP.
 
PARAMETERS p_down RADIOBUTTON GROUP func DEFAULT 'X'.
PARAMETERS p_up   RADIOBUTTON GROUP func.
 
* Global data *
TYPE-POOLS sabc.
 
DATA pos  TYPE i.
DATA temp TYPE c.
 
DATA path        LIKE p_lpath.
DATA path_cofile LIKE p_lpath.
DATA path_data   LIKE p_lpath.
DATA path_bin    LIKE p_lpath.
 
DATA fk LIKE p_lpath.
DATA fr LIKE p_lpath.
DATA fd LIKE p_lpath.
 
DATA separator TYPE c.
 
* Complete local path *
AT SELECTION-SCREEN.
 
  pos  = strlen( p_lpath ) - 1.
  temp =  p_lpath+pos(1).
  CHECK NOT temp = '\'.
  CONCATENATE p_lpath '\' INTO p_lpath.
 
***********************************************************************
START-OF-SELECTION.
***********************************************************************
 
* Determine transport base directory *
  CALL 'C_SAPGPARAM' ID 'NAME'  FIELD 'DIR_TRANS'
                     ID 'VALUE' FIELD  path.
 
* Determine file/path separator *
  IF sy-opsys = 'Windows NT'.
    separator = '\'.
  ELSE.
    separator = '/'.
  ENDIF.
 
* Determine transport directories *
  CONCATENATE path separator 'cofiles' separator INTO path_cofile.
  CONCATENATE path separator 'data'    separator INTO path_data.
  CONCATENATE path separator 'data'    separator INTO path_bin.
 
  WRITE: /  'Path Cofile:', path_cofile.
  WRITE: /  'Path Data  :', path_data.
  WRITE: /  'Path Bin   :', path_bin.
  SKIP.
 
* Build filenames *
  CONCATENATE p_trkorr+3(7) p_trkorr+0(3) INTO fk SEPARATED BY '.'.
  CONCATENATE 'R' p_trkorr+4(6) '.' p_trkorr+0(3) INTO fr.
  CONCATENATE 'D' p_trkorr+4(6) '.' p_trkorr+0(3) INTO fd.
 
* Up- or download transport request *
  IF p_down = 'X'.
    PERFORM download USING path_cofile p_lpath fk.
    PERFORM download USING path_data   p_lpath fr.
    PERFORM download USING path_data   p_lpath fd.
  ELSE.
    PERFORM upload USING p_lpath path_cofile fk.
    PERFORM upload USING p_lpath path_data   fr.
    PERFORM upload USING p_lpath path_data   fd.
  ENDIF.
 
*&---------------------------------------------------------------------*
*&      Form  download
*&---------------------------------------------------------------------*
FORM download USING value(srcpath) LIKE p_lpath
                    value(dstpath) LIKE p_lpath
                    value(file)    LIKE p_lpath.
  DATA BEGIN OF buffer OCCURS 0.
  DATA   data(1024) TYPE x.
  DATA END OF buffer.
 
  DATA filename TYPE rlgrap-filename.
  DATA reclen   TYPE i.
  DATA filelen  TYPE i.
 
* Read input file *
  CONCATENATE srcpath file INTO filename.
  OPEN DATASET filename FOR INPUT IN BINARY MODE.
  CHECK sy-subrc = 0.
  WHILE sy-subrc = 0.
    READ DATASET filename INTO buffer LENGTH reclen.
    filelen = filelen + reclen.
    APPEND buffer.
  ENDWHILE.
  CLOSE DATASET filename.
 
* Download file *
  CONCATENATE dstpath file INTO filename.
  CALL FUNCTION 'WS_DOWNLOAD'
    EXPORTING
      bin_filesize = filelen
      filename     = filename
      filetype     = 'BIN'
    TABLES
      data_tab     = buffer
    EXCEPTIONS
      OTHERS       = 1.
  CHECK sy-subrc = 0.
 
  WRITE: / 'Download:',(150) file.
 
ENDFORM.                    "download
 
*&---------------------------------------------------------------------*
*&      Form  upload
*&---------------------------------------------------------------------*
FORM upload USING value(srcpath) LIKE p_lpath
                  value(dstpath) LIKE p_lpath
                  value(file)    LIKE p_lpath.
  DATA BEGIN OF buffer OCCURS 0.
  DATA   data(1024) TYPE x.
  DATA END OF buffer.
 
  DATA filename TYPE rlgrap-filename.
  DATA reclen   TYPE i.
  DATA filelen  TYPE i.
  DATA result   TYPE c.
 
* Check if file exists *
  CONCATENATE srcpath file INTO filename.
  CALL FUNCTION 'WS_QUERY'
    EXPORTING
      filename = filename
      query    = 'FE'
    IMPORTING
      return   = result
    EXCEPTIONS
      OTHERS   = 1.
  CHECK sy-subrc = 0 AND result = '1'.
 
* Upload file *
  CALL FUNCTION 'WS_UPLOAD'
    EXPORTING
      filename   = filename
      filetype   = 'BIN'
    IMPORTING
      filelength = filelen
    TABLES
      data_tab   = buffer
    EXCEPTIONS
      OTHERS     = 1.
 
* Write file to server *
  CONCATENATE dstpath file INTO filename.
  OPEN DATASET filename FOR OUTPUT IN BINARY MODE.
  CHECK sy-subrc = 0.
 
  LOOP AT buffer.
    DESCRIBE FIELD  buffer-data LENGTH reclen IN BYTE MODE.
    IF filelen > reclen.
      filelen = filelen - reclen.
    ELSE.
      reclen = filelen.
    ENDIF.
    TRANSFER buffer TO filename LENGTH reclen.
  ENDLOOP.
  CLOSE DATASET filename.
 
  WRITE: / 'Upload:',(150) file.
 
ENDFORM.                    "upload