Академический Документы
Профессиональный Документы
Культура Документы
| SCN
Getting Started New sletters Store
Conditionally
created by Anoop kumar on Dec 25, 2012 10:56 AM, last modified by Anoop kumar on Dec 27, 2012 7:39 AM
Introduction:
This Article provides various solutions for scheduling multiple BODS Batch Jobs (Jobs) sequentially and
conditionally. As you are aware that BODS does not contain an inbuilt mechanism to chain multiple Jobs within one
parent Job and the default way to work is to chain multiple Workflow's within a Job. However we cannot execute
workflow on its own and need a Job to execute it and in various scenarios there is a need to sequence the Jobs and
conditionally run the Jobs. The approaches provided below can be used where chaining multiple Workflow's within a
Job is not enough and Jobs have to be chained/Sequenced.
1.There is no need for a Third Party Scheduling Tool, Various features within BODS can be combined to create a Job,
which acts as a Parent Job, which can be scheduled to trigger Jobs one after other. Parent Job acts like a Sequencer
of Jobs.
2. We can avoid scheduling each and every Job and only Schedule Parent Jobs.
3. Using WebServices approach, Global Variables can be passed Via XML file to the Jobs in a simplified manner.
4. Using WebServices approach, Developer would need access only to the folder, which JobServer can access, to
place the XML files and does not require access to the JobServer itself.
5. Avoids loading a Job with too many WorkFlows.
6. Time based Scheduling (example:Schedule Jobs at 10 every minutes Interval) can be avoided and Hence there will
not any overlap if the preceding Job takes more than 10 minutes.
7.As the Child Jobs and the Parent Job will have its own Trace Logs it would make it easier to troubleshoot in case of
any issues.
8.At any point, Child Jobs can be run independently too in Production Environment, this will not be possible if the
entire Job logic is put into a WorkFlow.
Consider two simple Jobs: Job1 and Job2 are to be executed in sequence and Job2 does not have any Business
dependency on Job1. The requirement is to execute only one Job at a time. i.e Job1 can be run first and then Job2 or
the other way round but the only criteria is that no two jobs should run at the same time. This restriction could be for
various reasons like efficient utilization of Job Server or because both the Jobs use the same Temp Tables.
1.Export the Jobs as .bat (Windows) using the Export Execution Command from Management console.
http://scn.sap.com/docs/DOC-34648 1/10
1/14/2014 Scheduling BODS Jobs Sequentially and Condition... | SCN
2.Check availability of Job1.bat and Job2.bat files in the Job Server.
3.Create a new Parent Job (call it as Schedule_Jobs) with just one Script Object.
4. In the Script, Call the Job1 and Job2 one after another using the exec function as given below
Print('Trigger Job1');
Print(exec('C:\Program Files (x86)\Business Objects\BusinessObjects Data Services\log\Job1.bat','',8));
Print('Trigger Job2');
Print(exec('C:\Program Files (x86)\Business Objects\BusinessObjects Data Services\log\Job2.bat','',8));
When the Schedule_Jobs Parent Job is run it triggers Job1 and then after completion (successful
completion/Termination) of Job1 it triggers Job2. Now Parent Job can be Scheduled in the Management Console to
run at a Scheduled time and it would trigger both Job1 and Job2 in sequence as required. Note that if the Job1 hangs
due to some reason, Schedule_Job will wait until Job1 comes out of the hung state and returns control to
Schedule_Job. In this way any number of Jobs can be sequenced.
If the same above two jobs (Job1 and Job2) have to be executed in sequence using Webservices, below approach
can be used.
2.Pick up the Webservice URL using the view WSDL option, the link will be as given below
http://<hostname>:28080/DataServices/servlet/webservices?ver=2.1&wsdlxml
3.In Designer, create a new DataStore with Datastore type as WebService and provide the WebService URL
fetched from View WSDL option.
http://scn.sap.com/docs/DOC-34648 2/10
1/14/2014 Scheduling BODS Jobs Sequentially and Condition... | SCN
5. Create a simple Parent Job (called Simple_Schedule) to trigger Job1 and Job2
6. In the Call_Job1 query object, call Job1 as shown in below diagrams, as no inputs are required for Job1, the
DI_ROW_ID from Row_Generation or Null can be passed on to the Job1.
http://scn.sap.com/docs/DOC-34648 3/10
1/14/2014 Scheduling BODS Jobs Sequentially and Condition... | SCN
http://scn.sap.com/docs/DOC-34648 4/10
1/14/2014 Scheduling BODS Jobs Sequentially and Condition... | SCN
When the Simple_Schedule Parent Job is run, It triggers Job1 and then after completion (successful
completion/Termination) of Job1 it triggers Job2. Now the Parent Job can be Scheduled in the Management Console
to run at a Scheduled time and it would trigger both Job1 and Job2 in sequence as required. Note that if the Job1
hangs due to some reason, Parent Job will wait until Job1 comes out of the hung state and returns control to Parent
Job. In this way any number of Jobs can be sequenced.
Lets consider that Job2 should be triggered after successful completion (not termination) of Job1 and Job2 should
not be triggered if Job1 fails.
Job status can be obtained from Repository table/view ALVW_HISTORY. The Job status for the latest instance of the
Job1 run should be checked and based on that Job2 should be triggered.To do this,
Print('Trigger Job1');
Print(exec('C:\Program Files (x86)\Business Objects\BusinessObjects Data Services\log\Job1.bat','',8));
#Remain idle for 2 secs so that Job Status is Stable (Status moves from S to D for a Successful Job and E for Error)
Sleep(2000);
if ($JobStatus='E')
begin
PRINT('First Job Failed');
raise_exception('First Job Failed');
end
else
begin
print('First Job Success, Second Job w ill be Triggered');
end
Print('Trigger Job2');
Print(exec('C:\Program Files (x86)\Business Objects\BusinessObjects Data Services\log\Job2.bat','',8));
Using the above code in the Script, when the Parent Job is Run it will trigger Job1 and only if Job1 has completed
successfully it will trigger Job2. If Job1 fails then Parent Job will be terminated using the raise_exception function.
This approach can be used to conditionally schedule any number of Jobs.
To conditionally execute Job (Published as WebService) based on the status of preceding Job (again Published as
WebService), the same concept used in the Conditional Execution using Script can be applied. i.e Call Job1, Check
the Status of Job1 and then if Job1 is successful trigger Job2.
1.Create a Parent Job with 2 DataFlows and a Script in between the DataFlows
http://scn.sap.com/docs/DOC-34648 5/10
1/14/2014 Scheduling BODS Jobs Sequentially and Condition... | SCN
2. Use First DataFlow to call the First Job (Refer above section for detail on calling a Job as webservice within
another Job)
3. Use the Second DataFlow to call the Second Job
4. Use the Script to Check the Status of First Job
if ($JobStatus='E')
begin
PRINT('First Job Failed');
raise_exception('First Job Failed');
end
else
begin
print('First Job Success, Second Job w ill be Triggered');
end
Using the above code in the Script when the Parent Job is Run it will trigger Job1 and only if Job1 has completed
successfully it will trigger Job2. This approach can be used to conditionally schedule any number of Jobs that are
published as WebService.
When Jobs have Global Variables for which values needs to be passed while triggering it,It needs to be handled
differently as when the Job is called as webservice it expects Global Variables to be mapped. So the idea is to pass
either Null Values (For Scheduled Run) or actual Values (For Manual Trigger) using XML file as input.
Lets assume that the First Job has 2 Global Variables like $GV1Path and $GV2Filename and that the second Job
does not have any Global Variables and the requirement is to trigger Job2 immediately after successful completion of
Job1.
1.Similar to above Parent Job, Create a Parent Job with 2 DataFlows and a Script in between the DataFlows
http://scn.sap.com/docs/DOC-34648 6/10
1/14/2014 Scheduling BODS Jobs Sequentially and Condition... | SCN
2. Use First DataFlow to call the First Job (Refer above sections for detail on calling a Job as webservice within
another Job), Instead of Using Row Generator Object use XML input File as source
The XSD for the Input XML file will be as given below, if there are more Global Variables in the Job then
elements GV3, GV4 and so on should be added to the Schema.
<FIRSTJOB>
<GLOBALVARIABLES>
<GV1>testpath1</GV1>
<GV2>testfilename</GV2>
</GLOBALVARIABLES>
</FIRSTJOB>
3. In the "WebService function Call" in "call_FirstJob" Query object, map the Global Variables as shown below
4.Use Second DataFlow to call the Second Job. As this Job does not contain Global Variables, Row Generation
object would be enough (as in previous section)
5. Use the Script object to Check the Status of First Job
http://scn.sap.com/docs/DOC-34648 7/10
1/14/2014 Scheduling BODS Jobs Sequentially and Condition... | SCN
Using the above approach, When the Parent Job is Run it will trigger First Job and pass the Global Variables present
in the Input XML File and only if First Job has completed successfully it will trigger Second Job. This approach can be
used to conditionally schedule any number of Jobs that are published as WebService. For every Job that has Global
Variables, An XSD and XML file should be created. The Global Variables passed from the XML file to the WebService
seems to be working only when the parameters are passed in right order, Hence it would be good practice to name
the Global Variables with good naming convention like $GV1<name>, $GV2<name> and so on.
About me:
Anoop kumar V K, Technology Lead at Infosys Limited.
6529 View s
Tags: data_services, trigger, dataservices, bods_jobs_scheduling, bods_job_chain, sequential_execution_of_bods_jobs,
scheduling_using_w ebservices, exec, export_execution_command, global_variables, trigger_batch_jobs,
run_bods_job_sequentially, run_bods_job_conditionally, run_one_job_w ithin_another, call_job_as_w ebservice,
call_bods_job_as_w eb_service
(6 ratings)
14 Comments
Good article.
Good one!!
Like (0)
Good One.
Thanks
Like (0)
Hi Anoop,
The document is very illustrative, but I cannot execute 2 BODS jobs in the 1st script option you have
suggested.
I do not get any errors, but the MONITOR adjacent to TRACE and ERROR tabs does not reflect the
record creation.
I have also tried to execute the batch jobs independently, the CMD window opens for a sec, executes
and closes. but there is no change in the target table.
Regards,
Harvin
Like (0)
Hi Anoop,
Thanks
http://scn.sap.com/docs/DOC-34648 8/10
1/14/2014 Scheduling BODS Jobs Sequentially and Condition... | SCN
Suraj Pabbathi
Like (1)
Hi Anoop,
Very Helpful blog, very easy to understand.
Am greatful to you for providing this blog.
Thanks
Abhi
Like (1)
Hey Anoop,
This article is really good one. This actually will help somany situations that we face in project.
Thanks again for this article.
Rakesh
Like (0)
How about creating a BW process chain to trigger the BODS jobs/flows(assuming you have BW)?
Like (0)
Good document
Like (0)
Like (0)
We've been using a similar approach with a custom made function which launch jobs via
al_joblauncher, instead of creating .bat files that could be cumbersome to administer. So far its
proved to be a very reliable solution. The trick was to disassembled the .bat call and parametrize all
that we could.
Our main reason for doing this (against certain recommendations) is that bigger Jobs takes longer
to compile and are more prone to corruption issues.
Like (0)
Hi Anoop,
Article really informative and very useful. Way of presenting scenario with example is really good for
easily understanding .
Hi Anoop,
Excellent blog with easy to understand flow in picturial format. I am working in ECC,BI. I just want to
know if BODS wants data from ECC what is the procedure and steps to follow for that. what are the
programs or Function modules useful. If you can reply to this post a new blog that will be amazing.
Like (0)
http://scn.sap.com/docs/DOC-34648 9/10
1/14/2014 Scheduling BODS Jobs Sequentially and Condition... | SCN
http://scn.sap.com/docs/DOC-34648 10/10