SAP ENVIAR ARCHIVOS ( EXCEL ) DEL SERVIDOR A LA FTP

Este es un tema muy tocado pero en la mayoría de sitios web no informa de la forma precisa en la que realizar esto.

El guión cada vez que se ABAP conecta con una FTP es la siguiente:


  1. Abrir conexión
  2. Realizar acciones ( En nuestro caso enviar archivos )
  3. Cerrar conexión

1º Abrir conexión
 DATAc_key_pass     TYPE i          VALUE '26101957',
        c_password(30VALUE 'XXXXXXXXX',
        c_username(30VALUE 'XXXXXXXXX',
        c_port(30)     VALUE 'XXXX',
        c_host(30)     VALUE 'XX.XXX.XXX.XXX XXXX',
        c_sapftp       LIKE  rfcdes-rfcdest  VALUE 'SAPFTPA'.

  DATA " gv_username        LIKE ztbsd_directorio-username,
    gv_password(30)    TYPE c,
    gv_long_pass       TYPE i,
    gv_rfc_destination TYPE rfcdest,
    gv_host(64)        TYPE c,
    gv_directorio(64)  TYPE c,
*    gv_path            LIKE ztbsd_directorio-path,
    gv_fname(120)      TYPE c,
*    gv_handle          TYPE i,
*    gv_command(70)     TYPE c,
    gv_file_name       TYPE adfilename,
    file(30)           TYPE c,
    gv_error           TYPE sysubrc.


*  DATA: BEGIN OF mtab_data OCCURS 0,
*          line(1500) TYPE c,
*        END OF mtab_data.

*****ENCRIPTAR PASSWORD****
  gv_long_pass strlenc_password ).
  CALL FUNCTION 'HTTP_SCRAMBLE'
    EXPORTING
      source      c_password
      sourcelen   gv_long_pass
      key         c_key_pass
    IMPORTING
      destination gv_password.


  IF sy-subrc EQ 0.
*Todo ok
  ELSE.
    WRITE:'Error en la función contraseña'.
*   WRITE:/ 'Submit zidoc_inb_pulse_idocs'.
  ENDIF.

  CHECK sy-subrc EQ 0.

  CLEAR gv_handle.
  IF sy-batch 'X'.
    gv_rfc_destination 'SAPFTPA'"Para lanzarlo en JOB
    c_sapftp 'SAPFTPA'.
  ELSE.
    gv_rfc_destination c_sapftp.
  ENDIF.


  CALL FUNCTION 'FTP_CONNECT'
    EXPORTING
      user            c_username
      password        gv_password
      host            c_host
      rfc_destination c_sapftp
    IMPORTING
      handle          gv_handle
    EXCEPTIONS
      not_connected   1
      OTHERS          2.


  IF sy-subrc NE 0.
    WRITE/ sy-msgnosy-msgidsy-msgv1.
    WRITE'Error en la conexión RFC'.
  ENDIF.



2. Realizar Acciones ( En nuestro caso primero grabamos el excel en el servidor y después enviamos a un FTP externo ).




*Paso a itab para enviar el excel al servidor
  CLEAR itab[].
  LOOP AT pt_listado3_aux1 INTO ps_listado3.

    lv_1 ps_listado3-pswbt.
    lv_2 ps_listado3-numas.

    CONCATENATE ps_listado3-belnr
             ps_listado3-clipro
             ps_listado3-txtcp
             ps_listado3-blart
             ps_listado3-ltext
             ps_listado3-hkont
             ps_listado3-shkzg
             ps_listado3-txt50

             lv_1

             ps_listado3-pswsl
             ps_listado3-mwskz
             ps_listado3-kostl
             ps_listado3-budat

             lv_2

             ps_listado3-bktxt INTO ls_itab SEPARATED BY ';' IN CHARACTER MODE RESPECTING BLANKS.
    APPEND ls_itab TO itab.
  ENDLOOP.




*Relleno la cabecera
  CLEAR ls_itab.
  ls_itab 'Doc Contable;Nº Cuenta;Denominación Cuenta;Clase Doc;Texto Cl. Doc;D/H;Cuenta;Descripción de la Cuenta;Importe;Moneda;Ind Impuestos;CeCo;Fecha Contb;Nº Asiento;Concepto'.
  INSERT ls_itab INTO itab INDEX 1.



  CLEARlv_namegv_patch_server_file.
  CONCATENATE gv_mes_name '_1' '.csv' INTO lv_name.
  CONDENSE lv_name.
  CONCATENATE gv_patch_server '\' lv_name INTO gv_patch_server_file.


gv_patch_server_file  =>  sería como G:\com\Prueba\Doc1.csv


*Pongo el fichero en el servidor
  OPEN DATASET gv_patch_server_file FOR OUTPUT IN TEXT MODE ENCODING NON-UNICODE IGNORING CONVERSION ERRORS.

  IF sy-subrc EQ 0.

    LOOP AT itab INTO ls_itab.
      TRANSFER ls_itab TO gv_patch_server_file.
    ENDLOOP.

  ELSE.
    WRITE'Error al transferir archivo al data set:',gv_patch_server_file.
  ENDIF.

  CHECK sy-subrc EQ 0.
  CLOSE DATASET gv_patch_server_file.




*Y transfiero archivos al FTP
  CLEARlv_namegv_patch_ftp_file.
  CONCATENATE gv_mes_name '_1' '.csv' INTO lv_name.
  CONDENSE lv_name.
  CONCATENATE gv_patch_ftp_mes '/' lv_name INTO gv_patch_ftp_file.

  CONCATENATE 'put' gv_patch_server_file gv_patch_ftp_file INTO gv_patch_ftp_file SEPARATED BY space.




Siendo gv_patch_ftp_file =>   put G:\com\Prueba\Doc1.csv PRUEBA/ficheros/Doc1.csv

Es decir porner "put" espacio "nombre archivo servidor" espacio "Directorio del FTP"

  DATA gv_length TYPE i.
  CLEAR mtab_data[].
*Paso a modo pasivo
  CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
      handle        gv_handle
      command       'set passive on'
    TABLES
      data          mtab_data
    EXCEPTIONS
      command_error 1
      tcpip_error   2.


  CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
      handle        gv_handle
      command       gv_patch_ftp_file
    TABLES
      data          mtab_data
    EXCEPTIONS
      command_error 1
      tcpip_error   2.

  IF sy-subrc NE 0.
    WRITE'Error al FTP_COMMAN:',gv_patch_ftp.
  ENDIF.
  CHECK sy-subrc EQ 0.



Y con todo esto es mucho más rápido, no se manejan tablas internas y la memoria de SAP no se carga en exceso.




Comentarios