La idea es de un programa que muestra un listado pasarlo a Excel y dejar el archivo en una ruta FTP.
Este programa lanza una ALV con los datos de selección.
Para ello partimos de la pantalla del programa
Este programa lanza una ALV con los datos de selección.
Para ello partimos de la pantalla del programa
En mi caso he creado tres programa para cada uno de los radio-buttons puesto que al crear el job no se puede ejecutar el mismo programa.
La idea es que si está marcado para ejecutar en job entre en la siguiente subrutina
ELSEIF tb_t EQ abap_true AND "Apuntes todos
r_man EQ abap_true AND "Job con pantalla de seleccion ACTIVADO
pt_listado2[] IS NOT INITIAL. "Que haya datos
PERFORM crea_job_datos_selec_man.
r_man EQ abap_true AND "Job con pantalla de seleccion ACTIVADO
pt_listado2[] IS NOT INITIAL. "Que haya datos
PERFORM crea_job_datos_selec_man.
La subrutina es de la siguiente forma:
FORM crea_job_datos_selec_man.
*Creamos el Job con los datos de seleccion ( Fechas porque ya tenemos todo en listado )
* BREAK-POINT.
"Crear Job
CONCATENATE 'ZDIARIO_EJEC_MANUAL_' sy-datum INTO gv_jobname.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = gv_jobname
IMPORTING
jobcount = gv_jobcount.
**** WRITE:/ 'Submit zidoc_inb_pulse_idocs'.
**** WRITE:/ 'Ruta', lv_ruta_servidor.
*Lanzar Job
SUBMIT zhn_diario_fi_man
WITH p_ejer EQ p_ejer "Ejercicio
WITH p_cldoc IN p_cldoc "Clase de Documento
WITH r_cuenta IN r_cuenta "Nº de Cuenta
WITH r_fechac IN r_fechac "Fechas
WITH r_stores IN r_stores "Tiendas
VIA JOB gv_jobname NUMBER gv_jobcount AND RETURN.
WRITE:/ 'El Job', gv_jobname, 'se ha creado correctamente'.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = gv_jobcount
jobname = gv_jobname
strtimmed = 'X'.
ENDFORM.
*Creamos el Job con los datos de seleccion ( Fechas porque ya tenemos todo en listado )
* BREAK-POINT.
"Crear Job
CONCATENATE 'ZDIARIO_EJEC_MANUAL_' sy-datum INTO gv_jobname.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = gv_jobname
IMPORTING
jobcount = gv_jobcount.
**** WRITE:/ 'Submit zidoc_inb_pulse_idocs'.
**** WRITE:/ 'Ruta', lv_ruta_servidor.
*Lanzar Job
SUBMIT zhn_diario_fi_man
WITH p_ejer EQ p_ejer "Ejercicio
WITH p_cldoc IN p_cldoc "Clase de Documento
WITH r_cuenta IN r_cuenta "Nº de Cuenta
WITH r_fechac IN r_fechac "Fechas
WITH r_stores IN r_stores "Tiendas
VIA JOB gv_jobname NUMBER gv_jobcount AND RETURN.
WRITE:/ 'El Job', gv_jobname, 'se ha creado correctamente'.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = gv_jobcount
jobname = gv_jobname
strtimmed = 'X'.
ENDFORM.
Fijense que el submit se hace al mismo programa con distinto nombre man
este programa también tiene el sigueinte cambio:
IF tb_t EQ abap_true AND "Apuntes todos
pt_listado2[] IS NOT INITIAL. "Que haya datos
* AND p_patch EQ abap_false.
* PERFORM alv_report2 USING pt_listado2. "2
PERFORM abro_conexion_ftp.
pt_listado2[] IS NOT INITIAL. "Que haya datos
* AND p_patch EQ abap_false.
* PERFORM alv_report2 USING pt_listado2. "2
PERFORM abro_conexion_ftp.
Y la subrutina de la siguiente forma:
FORM abro_conexion_ftp.
DATA: c_key_pass TYPE i VALUE '26101957', "26101957 es lo que hay que poner
c_password(30) VALUE 'XXXXXXXX',
c_username(30) VALUE 'XXXXXXXX',
c_port(30) VALUE 'XXXX',
c_host(30) VALUE 'XX.XXX.XXX.XXX XXXX',
c_sapftp LIKE rfcdes-rfcdest VALUE 'SAPFTP'.
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'.
ENDIF.
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.
*Como es un Job lo creo en una carpeta JOB Manuales
gv_command = 'mkdir /FI/DIARIO_JOB_MANUALES_'.
CONCATENATE gv_command sy-datum INTO gv_command.
CLEAR mtab_data[].
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = gv_handle
command = gv_command
TABLES
data = mtab_data
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
CLEAR mtab_data[].
*Me posiciono
REPLACE 'mkdir' WITH 'cd' INTO gv_command.
* gv_command = 'cd /FI/DIARIO_JOB_MANUALES'.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = gv_handle
command = gv_command
* COMPRESS =
* rfc_destination = 'SAPFTP'
* VERIFY =
* IMPORTING
* FILESIZE =
* FILEDATE =
* FILETIME =
TABLES
data = mtab_data
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
WRITE: / 'Error en el posicionamiento del directorio'.
ENDIF.
*Conviero a CSV tabla interna
DATA: itab TYPE truxs_t_text_data.
DATA: ls_itab LIKE LINE OF itab.
CALL FUNCTION 'SAP_CONVERT_TO_CSV_FORMAT'
EXPORTING
i_field_seperator = ';'
i_line_header = ''
* I_FILENAME =
* I_APPL_KEEP = ' '
TABLES
i_tab_sap_data = pt_listado2[]
CHANGING
i_tab_converted_data = itab
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
WRITE: / 'Error al pasar datos a la tabla interna'.
ENDIF.
*Relleno la cabecera
ls_itab = 'Cl.Documento;Descripción Cl.Documento;Nº de Cuenta;D/H;Descripción Cuenta;Total Cuenta;Moneda;Fecha;Nº Apunte'.
INSERT ls_itab INTO itab INDEX 1.
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.
*Creo el csv en el FTP
CALL FUNCTION 'FTP_R3_TO_SERVER'
EXPORTING
handle = gv_handle
fname = 'Todos_los_apuntes(Totalizado).csv'
* blob_length = gv_length
character_mode = 'X'
TABLES
* blob = pt_listado2
text = itab
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
WRITE: / 'Error en cargar el excel al directorio FTP'.
ENDIF.
CALL FUNCTION 'FTP_DISCONNECT'
EXPORTING
handle = gv_handle.
IF sy-subrc EQ 0.
WRITE: / 'El proceso se ha creado correctamente'.
ENDIF.
* BREAK-POINT.
ENDFORM.
DATA: c_key_pass TYPE i VALUE '26101957', "26101957 es lo que hay que poner
c_password(30) VALUE 'XXXXXXXX',
c_username(30) VALUE 'XXXXXXXX',
c_port(30) VALUE 'XXXX',
c_host(30) VALUE 'XX.XXX.XXX.XXX XXXX',
c_sapftp LIKE rfcdes-rfcdest VALUE 'SAPFTP'.
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'.
ENDIF.
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.
*Como es un Job lo creo en una carpeta JOB Manuales
gv_command = 'mkdir /FI/DIARIO_JOB_MANUALES_'.
CONCATENATE gv_command sy-datum INTO gv_command.
CLEAR mtab_data[].
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = gv_handle
command = gv_command
TABLES
data = mtab_data
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
CLEAR mtab_data[].
*Me posiciono
REPLACE 'mkdir' WITH 'cd' INTO gv_command.
* gv_command = 'cd /FI/DIARIO_JOB_MANUALES'.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = gv_handle
command = gv_command
* COMPRESS =
* rfc_destination = 'SAPFTP'
* VERIFY =
* IMPORTING
* FILESIZE =
* FILEDATE =
* FILETIME =
TABLES
data = mtab_data
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
WRITE: / 'Error en el posicionamiento del directorio'.
ENDIF.
*Conviero a CSV tabla interna
DATA: itab TYPE truxs_t_text_data.
DATA: ls_itab LIKE LINE OF itab.
CALL FUNCTION 'SAP_CONVERT_TO_CSV_FORMAT'
EXPORTING
i_field_seperator = ';'
i_line_header = ''
* I_FILENAME =
* I_APPL_KEEP = ' '
TABLES
i_tab_sap_data = pt_listado2[]
CHANGING
i_tab_converted_data = itab
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
WRITE: / 'Error al pasar datos a la tabla interna'.
ENDIF.
*Relleno la cabecera
ls_itab = 'Cl.Documento;Descripción Cl.Documento;Nº de Cuenta;D/H;Descripción Cuenta;Total Cuenta;Moneda;Fecha;Nº Apunte'.
INSERT ls_itab INTO itab INDEX 1.
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.
*Creo el csv en el FTP
CALL FUNCTION 'FTP_R3_TO_SERVER'
EXPORTING
handle = gv_handle
fname = 'Todos_los_apuntes(Totalizado).csv'
* blob_length = gv_length
character_mode = 'X'
TABLES
* blob = pt_listado2
text = itab
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
WRITE: / 'Error en cargar el excel al directorio FTP'.
ENDIF.
CALL FUNCTION 'FTP_DISCONNECT'
EXPORTING
handle = gv_handle.
IF sy-subrc EQ 0.
WRITE: / 'El proceso se ha creado correctamente'.
ENDIF.
* BREAK-POINT.
ENDFORM.
Al terminar el Job creará el excel en la ruta expecificada:
Hay que introducir el FTP en la vista SAPFTP_SERVERS_V
ResponderEliminar