2008 Jul 02 12:25 PM
Hi gurus,
im trying to scheduke several jobs using the FM Job close, but the jobs are running paralel..
The first job its' schedule with a start date or imediate, and the letf ones are schedule to start after his precessor finish, but once i run the programa 4 jobs start running ...
Can any one help me on this?
Below goes my code...
DO njobs TIMES.
**Nome de Job
CLEAR: jobname, jobcount, job_release.
CLEAR: job_imediate, str_job.
ADD 1 TO ind_job.
WRITE ind_job TO str_job.
CONCATENATE 'EXECORC' sy-uname sy-uzeit str_job
INTO jobname SEPARATED BY '-'.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = jobname
IMPORTING
jobcount = jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE i003(zmapas).
EXIT.
ENDIF.
IF gv_global EQ 'X'.
**Submit job
SUBMIT z_mapa_execucao_orcamental
VIA JOB jobname NUMBER jobcount
WITH ano EQ ano
WITH so_perio IN so_perio
WITH so_date IN so_date
WITH so_org EQ so_org
WITH so_num IN so_num
AND RETURN.
ELSE.
***Limites
CLEAR: upper_bound, lower_bound.
upper_bound = njobs * ind_job.
lower_bound = upper_bound - njobs + 1.
CLEAR so_num.
REFRESH so_num.
LOOP AT tab_prog FROM lower_bound TO upper_bound.
so_num-sign = 'I'.
so_num-option = 'EQ'.
so_num-low = tab_prog-zlinha.
APPEND so_num.
ENDLOOP.
SUBMIT z_mapa_execucao_orcamental
VIA JOB jobname NUMBER jobcount
WITH ano EQ ano
WITH so_perio IN so_perio
WITH so_date IN so_date
WITH so_org EQ so_org
WITH so_num IN so_num
AND RETURN.
ENDIF.
IF ind_job EQ 1.
IF stdt_output-startdttyp EQ 'I'.
job_imediate = 'X'.
ENDIF.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = jobcount
jobname = jobname
sdlstrtdt = stdt_output-sdlstrtdt
sdlstrttm = stdt_output-sdlstrttm
strtimmed = job_imediate
IMPORTING
job_was_released = job_release
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE i003(zmapas).
EXIT.
ELSE.
CLEAR: predjob, predjobcount, stdt_output.
predjob = jobname.
predjobcount = jobcount.
MESSAGE s004(zmapas) WITH jobname.
ENDIF.
ELSE.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = jobcount
jobname = jobname
* predjob_checkstat = 'X'
pred_jobcount = predjobcount
pred_jobname = predjob
* strtimmed = 'X'
IMPORTING
job_was_released = job_release
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE i003(zmapas).
EXIT.
ELSE.
CLEAR: predjob, predjobcount, stdt_output.
predjob = jobname.
predjobcount = jobcount.
MESSAGE s004(zmapas) WITH jobname.
ENDIF.
ENDIF.
Thanks in Advance,
Best Regards,
João Martins
2008 Jul 02 2:39 PM
Hi Thomas,
thanks for your reply but my problem it's a little bit diferent from the link you gave me. I need to schedule several jobs, not only 2... My idea it's that the second job only starts after the first one finishs and so on...
I also have a doubt in this FM, if someone could help me on this...
In the first call to the FM JOB_CLOSE the parameters sdlstrtdt sdlstrttm sdlstrttm are filled either with the imediate parameter or the start date and time, but after the first call until the last job close the only parameters that it makes sense to fill it up, to me, are the jobname jobcount pred_jobcount and the pred_jobname. I dont understand why we have to fill up the strtimmed parameter ?!?! and also what does the * predjob_checkstat* do?
Thanks again for your reply,
Best Regards,
João Martins
2008 Jul 02 12:34 PM
2008 Jul 02 2:39 PM
Hi Thomas,
thanks for your reply but my problem it's a little bit diferent from the link you gave me. I need to schedule several jobs, not only 2... My idea it's that the second job only starts after the first one finishs and so on...
I also have a doubt in this FM, if someone could help me on this...
In the first call to the FM JOB_CLOSE the parameters sdlstrtdt sdlstrttm sdlstrttm are filled either with the imediate parameter or the start date and time, but after the first call until the last job close the only parameters that it makes sense to fill it up, to me, are the jobname jobcount pred_jobcount and the pred_jobname. I dont understand why we have to fill up the strtimmed parameter ?!?! and also what does the * predjob_checkstat* do?
Thanks again for your reply,
Best Regards,
João Martins
2008 Jul 02 2:44 PM
Hello.
First of all, parameter predjob_checkstat makes the second job to start only if the previous one ends without error. Probably this solves your problem at all ... the second waits to the end of the first to see if it ended with error or not.
I was analysing your problem. Parameter strtimmed can only be set in the first JOB_CLOSE. All the others cannot have this parameter set to 'X' if you want them to wait for the end of the previous ones.
So, try predjob_checkstat = 'X' and strtimmed = space.
Also, I have one example that is working:
*** Escalona um JOB para cada ficheiro encontrado.
LOOP AT t_processar.
CLEAR: w_jobcount, w_jobname, l_liberado.
ADD 1 TO l_conta.
MOVE l_conta TO l_conta2.
CONDENSE l_conta2.
CONCATENATE t_jobs-jobname l_conta2 INTO w_jobname.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = w_jobname
IMPORTING
jobcount = w_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
*** Criou-se o JOB com sucesso
IF sy-subrc = 0.
CLEAR seltab_wa.
*** Monta o parâmetro
MOVE: t_jobs-param TO seltab_wa-selname,
t_processar-line+34 TO seltab_wa-low.
APPEND seltab_wa TO seltab.
seltab_wa-selname = 'P_LOJA'.
seltab_wa-low = t_processar-ficheiro+7(4).
APPEND seltab_wa TO seltab.
*** Submete o programa para o JOB
SUBMIT (t_jobs-repid)
WITH SELECTION-TABLE seltab
USER sy-uname
VIA JOB w_jobname NUMBER w_jobcount
AND RETURN.
*** Encerra o JOB
IF l_conta EQ 1.
l_hora = sy-uzeit.
ADD 120 TO l_hora.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = w_jobcount
jobname = w_jobname
sdlstrtdt = sy-datum
sdlstrttm = l_hora
targetserver = w_servidor
IMPORTING
job_was_released = l_liberado
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
OTHERS = 8.
ELSE.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = w_jobcount
jobname = w_jobname
predjob_checkstat = 'X'
pred_jobcount = w_jobcount2
pred_jobname = w_jobname2
targetserver = w_servidor
IMPORTING
job_was_released = l_liberado
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
OTHERS = 8.
ENDIF. "l_conta eq ...
ENDIF. "sy-subrc = 0 do JOB-OPEN
w_jobname2 = w_jobname.
w_jobcount2 = w_jobcount.
PERFORM f_limpa_param.
ENDLOOP. "at t_processar
Regards.
Valter Oliveira.
2008 Jul 02 3:27 PM
Based on the analysis I have done in the quoted thread, I suggest the following approach for scheduling n jobs with predecessor dependency:
- JOB_OPEN and SUBMIT for first job, but no JOB_CLOSE yet, if immediate start is required!
- JOB_OPEN / SUBMIT / JOB_CLOSE for the subsequent jobs, for each one giving jobcount and jobname from the predecessor job in PRED_JOBNAME and PRED_JOBCOUNT, PREDJOB_CHECKSTAT as desired, but no STRTIMMED!
- JOB_CLOSE for the first job with STRTIMMED = "X"
try to reflect this in your code, there is a good chance it will work.
Thomas
2008 Jul 02 3:36 PM
uhmmm ... thomas solution probably works ... and maybe that's why my example works ... because my first JOB_CLOSE only starts 2 minutes after the schedule, i.e, after all the closes done.
l_hora = sy-uzeit.
ADD 120 TO l_hora.
Regards.
Valter Oliveira.
2008 Jul 02 3:45 PM
just tried it here with 10 jobs in a row and immediate start...bingo
2008 Jul 02 3:08 PM
Hi Valter,
Thanks for your reply.
I thought that way to, in the second job_close call, but it's giving me an error of invalid_startdate ....!!!! i dont understand why because if has a predjob it's shouldnt had a start date and time... am i correct?
IF ind_job EQ 1.
IF stdt_output-startdttyp EQ 'I'.
job_imediate = 'X'.
ENDIF.
***Primeiro Job
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = jobcount
jobname = jobname
sdlstrtdt = stdt_output-sdlstrtdt
sdlstrttm = stdt_output-sdlstrttm
strtimmed = job_imediate
IMPORTING
job_was_released = job_release
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE i003(zmapas).
EXIT.
ELSE.
CLEAR: predjob, predjobcount, stdt_output.
predjob = jobname.
predjobcount = jobcount.
MESSAGE s004(zmapas) WITH jobname.
ENDIF.
ELSE.
**Jobs Seguintes
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = jobcount
jobname = jobname
predjob_checkstat = 'X'
pred_jobcount = predjobcount
pred_jobname = predjob
strtimmed = space
IMPORTING
job_was_released = job_release
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE i003(zmapas).
EXIT.
ELSE.
CLEAR: predjob, predjobcount, stdt_output.
predjob = jobname.
predjobcount = jobcount.
MESSAGE s004(zmapas) WITH jobname.
ENDIF.
ENDIF.
Thanks,
Regards,
João Martins
2008 Jul 02 3:15 PM
Hi again.
Yes, you are correct. As you can see in my example, I don't even use parameter strtimmed because it makes no sense. In SM36, when you define a job, looking to a previous job, you don't have that option (starting time).
This may sound stupid, but try like this (perhaps parameter strtimmed affects the flow of JOB_CLOSE FM):
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = jobcount
jobname = jobname
predjob_checkstat = 'X'
pred_jobcount = predjobcount
pred_jobname = predjob
IMPORTING
job_was_released = job_release
EXCEPTIONS
cant_start_immediate = 1
...
Looking to your code everything looks fine.
Regards.
Valter Oliveira.
Edited by: Valter Oliveira on Jul 2, 2008 3:17 PM
2008 Jul 02 4:49 PM
Guys that's it...
Thanks Thomas and Valter foryour contribution, point will be rewarded..
Best Regards,
João Martins