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:
El guión cada vez que se ABAP conecta con una FTP es la siguiente:
- Abrir conexión
- Realizar acciones ( En nuestro caso enviar archivos )
- Cerrar conexión
1º Abrir conexión
DATA: c_key_pass TYPE i VALUE '26101957',
c_password(30) VALUE 'XXXXXXXXX',
c_username(30) VALUE '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 = strlen( c_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-msgno, sy-msgid, sy-msgv1.
WRITE: / 'Error en la conexión RFC'.
ENDIF.
c_password(30) VALUE 'XXXXXXXXX',
c_username(30) VALUE '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 = strlen( c_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-msgno, sy-msgid, sy-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.
CLEAR: lv_name, gv_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
CLEAR: lv_name, gv_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.
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.
CLEAR: lv_name, gv_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
CLEAR: lv_name, gv_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
Publicar un comentario