I have a CL program that calls an RPG program to accept a bunch of parameters (via a subfile). These get saved in a QTEMP file. The CL program would then SUBMIT a second RPG program to run in batch to generate a report based on the parameters captured. How do I send the stuff from the calling CL's QTEMP to the batch QTEMP? The OS/400 SBMJOB command does have a 'Copy environment variables Y/N ?' option, would that do the trick?
What you need to do is to make the file in QTEMP available to your submitted job by putting it into a proper library. When you create the file, name it using the job number of the creating (interactive, in you case) job - like this:
:
Dcl &JobNum *Char Len(6)
Dcl &File *Char Len(10)
:
:
RtvJobA Nbr(&JobNum)
:
:
ChgVar &File ('X' *CAT &JobNum)
CrtDupObj BaseFile BaseLib *File WorkLib &File Data(*No)
MonMsg CPF0000
:
:
SbmJob BatchJob Cmd(Call MyPgm Parm(&parm1 &parm2 &File)) ....
:
We pass the name of the file to the submitted job, which does its override and reads the file. Once it has finished processing, it will delete the file.
This technique is fine as long as the user does not run the program more than once between the interactive side creating the file and the batch side deleting it -- if that is likely to happen, you will have to devise a more unique naming method. Try involving a sequential number, and incrementing it if your interactive CL finds that a file with that name (X + Job number + Sequence) already exists:
:
Dcl &JobNum *Char Len(6)
Dcl &SeqNum *Dec Len(3 0) Value(0)
Dcl &SeqChr *Char Len(3)
Dcl &File *Char Len(10)
:
:
RtvJobA Nbr(&JobNum)
:
:
Loop:
ChgVar &SeqNum (&SeqNum + 1)
ChgVar &SeqChr (&SeqNum)
ChgVar &File ('X' *CAT &JobNum *CAT &SeqChr)
CrtDupObj BaseFile BaseLib *File WorkLib &File Data(*No)
MonMsg CPF0000 Exec(GoTo Loop)
:
:
SbmJob BatchJob Cmd(Call MyPgm Parm(&parm1 &parm2 &File)) ....
:
Another way to pass a list of data is in a User Space. This is a much more involved process, and requires the use of a number of IBM APIs. You still have to uniquely name the object and pass the name to the batch job. Lastly, you could pass data using a 'pipe'. This is another API-based solution, and uses programs and techniques associated with Qshell. Best to stick with the file option, I think!
================================== MORE INFORMATION ON THIS TOPIC ==================================
The Best Web Links: tips, tutorials and more.
Visit the ITKnowledge Exchange and get answers to your developing questions fast.
Ask the Experts yourself: Our application development gurus are waiting to answer your programming questions.
This was first published in December 2004