PDA

Ver la Versión Completa : ejecutar programa en fondo


pancho6102
18/03/15, 00:17:28
Hola, tengo un reporte que muestra un ALV y tagregue un boton para generar un TXT, el cual muestra el usuario una ventana del explorador y lo guarda local.

El problema es que las consultas son pesadas y me pidieron que agregara un checkBox en la pantalla principal para que el programa se ejecute en fondo y no tenga al usuario en la pantalla esperando la consulta y despues presionar el boton generar TXT, el proceso de fondo genera el archivo TXT en el servidor de aplicaciones.

ya tengo eso intente ejecutar la funcion OPEN_JOB antes de los select validando que se haya seleccionado el checkBox y un CLOSE_JOB cuando se termine de guardar en el servidor de aplicaciones. (con todas las validaciones y ejecucion en automatico con el perform que guarda el archivo, y ya no mostrarse el ALV).

la estructura que encontre del llamado de las funciones son:

CALL OPEN_JOB

SUBMIT ZPROGRAM via JOB.

CALL CLOSE_JOB.

en este caso el Submit no lo uso puesto que ya estoy en mi programa y se sustituye por el proceso de seleccion de la informacion.

Ahora lo que aun no entiendo es como debe ser para que despues del CALL OPEN_JOB continue el demas proceso en fondo. ya que lo ejecuto y me tengo que esperar aun asi en pantalla hasta que el flujo del programa llegue al CLOSE_JOB.

Una solucion que se me viene de pronto seria re llamar mi programa usando el submit y mediante la variable SY-BATCH sepa como se esta ejecutando pero aun asi tendria que buscar la forma de simular que el usuario oprime el boton de generar archivo TXT.

Necesito ayuda.

Saludos.

sconoredhot
18/03/15, 10:58:13
Hola,

para esas funciones, tenes que crear otro programa con la lógica que necesitas que se corra de fondo, no la podes dejar en un form, si no que tiene que ir en un programa aparte, pasandole datos como parametro. Si tenes que pasar una tabla, podes usar IMPORT / EXPORT. o bien hacer la seleccion de datos dentro del programa que corre de fondo, que a la vez te hace mas veloz el programa original. Quedaria algo asi:

CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = 'NOMBRE_JOB'
IMPORTING
jobcount = 'VARIABLE_JOBCOUNT'
EXCEPTIONS
OTHERS = 1.

SUBMIT 'TU_NUEVO_PROGRAMA'
WITH 'LOS PARAMETROS' (por ejemplo al programa le podes hacer parametros tales como la ruta, el nombre del archivo, etc)
AND RETURN VIA JOB lv_jobname NUMBER lv_jobcount.

* Se cierra el job
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = lv_strtimmed
IMPORTING
job_was_released = lv_rele
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
invalid_target = 8
OTHERS = 9.

pancho6102
18/03/15, 20:08:34
Gracias por la ayuda intente algo loco usando un rellamado al programa via job pero no me funciono ya que no entraba al evento start of selection creo que me falta un skip first screen o algo asi.

Termine creando el programa solo de construccion del archivo y llamado con el Job como me lo sugeriste sebas.


Saludos.

ehrman
21/03/15, 10:34:54
Si el programa se envía de fondo adiciona una condicional

IF sy-batch EQ 'X'.
PERFORM get_job_details.
ENDIF.

Declaras las varibles necesarias.
* Job Runtime Parameters
DATA: gd_eventid LIKE tbtcm-eventid,
gd_eventparm LIKE tbtcm-eventparm,
gd_external_program_active LIKE tbtcm-xpgactive,
gd_jobcount LIKE tbtcm-jobcount,
gd_jobname LIKE tbtcm-jobname,
gd_stepcount LIKE tbtcm-stepcount,
gd_error TYPE sy-subrc,
gd_reciever TYPE sy-subrc.

*---------------------------------------------------------------------*
* FORM get_job_details *
*---------------------------------------------------------------------*
FORM get_job_details.
* Get current job details
CALL FUNCTION 'GET_JOB_RUNTIME_INFO'
IMPORTING
eventid = gd_eventid
eventparm = gd_eventparm
external_program_active = gd_external_program_active
jobcount = gd_jobcount
jobname = gd_jobname
stepcount = gd_stepcount
EXCEPTIONS
no_runtime_info = 1
OTHERS = 2.

ENDFORM.