Note: This function is primarily replaced by the CMD parameter on
SBMJOB. It provides the same advantages. BLDCALL is useful if you
have a long parameter list on a call that you need to either submit
to batch or execute using QCMDEXC. See the TAASYSDC CL program for
an example. If you only need to submit to batch, you should use the
SBMJOB CMD parameter.
Two commands are provided (BLDCALL and BLDCALL2). BLDCALL2 is the
same function, but the RQSDTA parameter is increased to 3000 bytes
(the new limit on SBMJOB).
The BLDCALL command is specifically designed to assist you in
building a CALL command with parameters that is to be submitted to
batch. The following is a typical use of the command:
DCL &RQSDTA *CHAR LEN(256)
DCL &X *CHAR LEN(10)
DCL &Y *CHAR LEN(5)
.
.
BLDCALL RQSDTA(&RQSDTA) PGM(PGMA) PARM(&X &Y 1)
SBMJOB RQSDTA(&RQSDTA)
If &X = ABCDEF and &Y = MNOP, the command submitted to batch would
be:
CALL PGMA PARM('ABCDEF' 'MNOP' '1')
The BLDCALL command has the following advantages:
** BLDCALL eliminates the coding complexities of using the CHGVAR
command with concatenation and multiple apostrophes to
assemble the CALL command. To perform the same function with
a CHGVAR command would be:
CHGVAR &RQSDTA ('CALL PGMA PARM(' *CAT '''' *CAT &X +
*CAT '''' *BCAT '''' *CAT &Y *CAT '''' +
*BCAT '''' *CAT '1' *CAT '''' *CAT ')')
** BLDCALL eliminates the problem that can occur when one of the
parameters is blank and has not been surrounded with
apostrophes. In this case, the command analyzer will not
recognize that a parameter exists and this can often result in
considerable debugging effort.
For example, assume the CHGVAR command had been coded as:
CHGVAR &RQSDTA ('CALL PGMA PARM(' *CAT &X *BCAT &Y +
*CAT '1' *CAT ')')
and &X contains blanks. The command passed into batch would
appear as:
CALL PGMA PARM(MNOP 1)
and MNOP (the value intended for the second parameter) would
be placed in the first parameter and a 1 placed in the second
parameter.
This problem is avoided by the fact that the parameters are
always surrounded by apostrophes by the BLDCALL command.
** BLDCALL eliminates the problem of a character variable with an
embedded blank being treated as two parameters when the
command is analyzed in batch.
For example if &X had contained (MILK MAN) and had not been
surrounded with apostrophes, the resulting command passed to
batch would contain four parameters as:
CALL PGMA PARM(MILK MAN MNOP 1)
This can also result in considerable debugging effort and is
avoided by the fact that the BLDCALL command always places
apostrophes around the variables.
** BLDCALL eliminates the problem of numeric data intended to be
treated as character from being treated as a decimal value.
There are two conditions where this can cause confusion:
-- The constant '1' which needs to be passed must be
surrounded with apostrophes to be treated as character.
If the following is passed to batch:
CALL PGMA PARM(ABCDEF MNOP 1)
the third parameter will be treated as a numeric value
and will be packed by the system.
-- This can also occur when a variable contains numeric
data. For example, if &X contains 123 and had not been
surrounded with apostrophes, the following would have
been passed to batch.
CALL PGMA PARM(123 MNOP 1)
In this case, the command analyzer would treat the
first parameter as numeric and pass it to the program
as a packed decimal value.
** BLDCALL eliminates the need to have to define *DEC type
variables in batch as having a length of (15 5). When a
command string is analyzed by the command analyzer, any
numeric values are treated as if they had been defined with a
(15 5) definition. The failure to properly code for this
definition can result in considerable debugging effort. Since
all parameters are forced to be passed as character, your
programs do not have to be aware of this command analyzer
definition. Your program need only make the simple conversion
from character to decimal.
Restrictions
------------
** Because the BLDCALL command requires a return variable, the
command can only be executed within a CL program.
** Only character variables may be used. If a *DEC type must be
passed, it must first be converted to character. If a *DEC
type is specified, the CRTCLPGM command will fail with an
appropriate diagnostic.
** Character variables cannot exceed 32 bytes in length. If a
longer length is specified, the program will compile
correctly, but will abort during execution regardless of the
number of characters in the variable. If a long character
variable must be passed, you may place it in multiple 32 byte
variables.
** As with SBMJOB, the RQSDTA parameter is limited to 256 bytes.
If you attempt to assemble more than 256 bytes, an escape
message will be sent during execution.
The BLDCALL2 command is the same function, but the size of the
RQSDTA is increased to 3000 bytes. See BLDCALL2.
BLDCALL Command parameters *CMD
--------------------------
RQSDTA The return variable that will be used in the SBMJOB
command. It must be defined as *CHAR LEN(256).
PGM The qualified program name that will be placed in
the the SBMJOB command. The default for the library
is *LIBL.
PARM A list of up to 50 entries that define the
parameters to be used on SBMJOB. Only character
variables may be used. The length of each cannot
exceed 32 characters. A numeric value (e.g. 132)
may be entered, but it will be passed as a character
value. All entries will have apostrophes
surrounding them on the SBMJOB command.
BLDCALL2 Command parameters *CMD
---------------------------
RQSDTA The return variable that will be used in the SBMJOB
command. It must be defined as *CHAR LEN(3000).
PGM The qualified program name that will be placed in
the the SBMJOB command. The default for the library
is *LIBL.
PARM A list of up to 50 entries that define the
parameters to be used on SBMJOB. Only character
variables may be used. The length of each cannot
exceed 32 characters. A numeric value (e.g. 132)
may be entered, but it will be passed as a character
value. All entries will have apostrophes
surrounding them on the SBMJOB command.
Example
-------
When you want to pass a *DEC type variable, you must first convert it
to a character variable. When changing to a character variable, you
must consider the length of the character field. It must be large
enough to contain a decimal point (if it exists) and a minus sign (if
the field is negative).
CL Code
DCL &COUNT *DEC LEN(3 0) VALUE(50)
DCL &AMT1 *DEC LEN(5 2) VALUE(10.32)
DCL &AMT2 *DEC LEN(5 2) VALUE(-110.50)
DCL &COUNTA *CHAR LEN(3)
DCL &AMT1A *CHAR LEN(6)
DCL &AMT2A *CHAR LEN(7)
DCL &RQSDTA *CHAR LEN(256)
.
.
CHGVAR &COUNTA &COUNT
CHGVAR &AMT1A &AMT1
CHGVAR &AMT2A &AMT2
BLDCALL RQSDTA(&RQSDTA) PGM(PGMB) PARM(&COUNTA &AMT1A +
&AMT2A)
SBMJOB RQSDTA(&RQSDTA)
The resulting command placed into batch would be:
CALL PGMB PARM('050' '010.32' '-110.50')
Note that the &COUNTA field is the same length as &COUNT since
it has 0 decimals and is assumed to be only positive. The
&AMT1A field is one position longer than the &AMT1 field to
allow for the decimal point and is assumed to be always
positive. The &AMT2A field is two positions longer than the
&AMT2 field to account for the decimal position and the minus
sign.
The batch program (assume it is CL) will allow you to place
the character values back into the proper numeric variables.
The CHGVAR command will perform decimal alignment. You should
avoid passing a value containing a decimal point directly to
RPG. It is easier to let CL convert the value (place it in a
packed field with an implied decimal point) and then pass the
converted value to RPG.
If PGMB is a CL program, it would be coded as follows:
PGM PARM(&COUNTA &AMT1A &AMT2A)
DCL &COUNT *DEC LEN(3 0)
DCL &AMT1 *DEC LEN(5 2)
DCL &AMT2 *DEC LEN(5 2)
DCL &COUNTA *CHAR LEN(3)
DCL &AMT1A *CHAR LEN(6)
DCL &AMT2A *CHAR LEN(7)
DCL &RQSDTA *CHAR LEN(256)
.
.
CHGVAR &COUNT &COUNTA
CHGVAR &AMT1 &AMT1A
CHGVAR &AMT2 &AMT2A
If you want to pass a long character variable (more than 32 bytes)
you can break up the variable. For example, assume you want to pass
a 50 byte variable you could do it as:
DCL &BIG *CHAR LEN(50) VALUE('....50 bytes worth...')
DCL &VAR1 *CHAR LEN(25)
DCL &VAR2 *CHAR LEN(25)
DCL &RQSDTA *CHAR LEN(256)
.
.
CHGVAR &VAR1 %SST(&BIG 1 25)
CHGVAR &VAR2 %SST(&BIG 26 25)
BLDCALL RQSDTA(&RQSDTA) PGM(PGMB) PARM(&VAR1 &VAR2)
SBMJOB RQSDTA(&RQSDTA)
Prerequisites
-------------
The following TAA Tools must be on your system:
SNDESCMSG Send escape message
Implementation
--------------
None, the tool is ready to use.
Objects used by the tool
------------------------
Object Type Attribute Src member Src file
------ ----- --------- ---------- -----------
BLDCALL *CMD TAABLDA QATTCMD
BLDCALL2 *CMD TAABLDA2 QATTCMD
TAABLDAC *PGM CLP TAABLDAC QATTCL
TAABLDAC2 *PGM CLP TAABLDAC2 QATTCL
Structure
---------
BLDCALL Cmd
TAABLDAC CLP
BLDCALL2 Cmd
TAABLDAC2 CLP
|