Anand K
asked on
AS400 - SBMJOB with command prompter
I have tried two options.
Option 1. With passing the cmd value as RSTOBJ ?*RSTLIB(ABCLIB).
PGM
DCL &CMD *CHAR 1024
DCL &CMDLEN *INT 4 VALUE(1024)
DCL &OPTIONS *CHAR 20
DCL &OPTIONSLEN *INT 4 VALUE(20)
DCL &OPTIONS *CHAR 20
DCL &NEWCMD *CHAR 1024
DCL &NEWCMDLENA *INT 4 VALUE(1024)
DCL &NEWCMDLENC *INT 4 VALUE(1024)
CHGVAR %SST(&OPTIONS 1 4) VALUE(X'00000001')
CHGVAR %SST(&OPTIONS 5 1) VALUE('0')
CHGVAR %SST(&OPTIONS 6 1) VALUE('1')
CHGVAR %SST(&OPTIONS 7 1) VALUE('0')
CHGVAR %SST(&OPTIONS 12 4) VALUE(X'00000000')
CHGVAR %SST(&OPTIONS 16 5) VALUE(X'0000000000')
CHGVAR &CMD VALUE('RSTOBJ ?*RSTLIB(ABCLIB)')
CALL QCAPCMD PARM(&CMD &CMDLEN &OPTIONS &OPTIONSLEN +
'CPOP0100' &NEWCMD &NEWCMDLENA &NEWCMDLENC +
X'00000000')
MONMSG CPF6801 EXEC(RETURN)
SBMJOB CMD(CALL PGM(QCMDEXC) PARM(&NEWCMD +
&NEWCMDLENA)) JOB(RSTOBJ#) JOBQ(QBATCH)
ENDPGM
After calling above program, below is the prompt, which only displays "restore to library" parameter. All other input parameters are not displayed.
Restore Object (RSTOBJ)
Type choices, press Enter.
Restore to library . . . . . . . > ABCLIB Name, *SAVLIB
Option 2. With passing the cmd value will all parameters.
PGM
DCL &CMD *CHAR 1024
DCL &CMDLEN *INT 4 VALUE(1024)
DCL &OPTIONS *CHAR 20
DCL &OPTIONSLEN *INT 4 VALUE(20)
DCL &OPTIONS *CHAR 20
DCL &NEWCMD *CHAR 1024
DCL &NEWCMDLENA *INT 4 VALUE(1024)
DCL &NEWCMDLENC *INT 4 VALUE(1024)
CHGVAR %SST(&OPTIONS 1 4) VALUE(X'00000001')
CHGVAR %SST(&OPTIONS 5 1) VALUE('0')
CHGVAR %SST(&OPTIONS 6 1) VALUE('1')
CHGVAR %SST(&OPTIONS 7 1) VALUE('0')
CHGVAR %SST(&OPTIONS 12 4) VALUE(X'00000000')
CHGVAR %SST(&OPTIONS 16 5) VALUE(X'0000000000')
CHGVAR &CMD VALUE('RSTOBJ +
??OBJ() +
??SAVLIB() +
??DEV() +
??OBJTYPE(*FILE) +
??VOL() +
??SEQNBR() +
??POSITION() +
??LABEL() +
??ENDOPT() +
??SAVF() +
??OPTION(*NEW) +
??FILEMBR() +
??MBROPT(*NEW) +
??SPLFDTA() +
??SAVDATE() +
??SAVTIME() +
??ALWOBJDIF(*ALL) +
??FRCOBJCVN() +
?*RSTLIB(ABCLIB) +
??OUTPUT(*PRINT) +
??MEDDFN() +
??OPTFILE() +
??RSTASPDEV() +
??RSTASP() +
??OUTFILE() +
??OUTMBR() +
??INFTYPE() +
??OMITLIB() +
??OMITOBJ()')
CALL QCAPCMD PARM(&CMD &CMDLEN &OPTIONS &OPTIONSLEN +
'CPOP0100' &NEWCMD &NEWCMDLENA &NEWCMDLENC +
X'00000000')
MONMSG CPF6801 EXEC(RETURN)
SBMJOB CMD(CALL PGM(QCMDEXC) PARM(&NEWCMD +
&NEWCMDLENA)) JOB(RSTOBJ#) JOBQ(QBATCH)
ENDPGM
For this option2. we get the prompt for all paramters, however, it fails with below error.
Message . . . . : -CALL PGM(QCMDEXC) PARM('RSTOBJ ??OBJ(F0001)
??SAVLIB(TESTLIB) ??DEV(TAPLIB1) ??OBJTYPE(*FILE) ??VOL(MA2041) ??SEQNBR(345)
??POSITION(*N) ??LABEL(*N) ??ENDOPT(*N) ??SAVF(*N) ??OPTION(*NEW)
??FILEMBR(*N) ??MBROPT(*NEW) ??SPLFDTA(*N) ??SAVDATE(*N) ??SAVTIME(*N)
??ALWOBJDIF(*ALL) ??FRCOBJCVN(*N) ?*RSTLIB(ABCLIB) ??OUTPUT(*PRINT)
??MEDDFN(*N) ??OPTFILE(*N) ??RSTASPDEV(*N) ??RSTASP(*N) ??OUTFILE(*N)
??OUTMBR(*N) ??INFTYPE(*N) ??OMITLIB(*N) ??OMITOBJ(*N)' 1024)
02/11/16 04:40:49.603159 QCANPARS QSYS 094F QCMD QSYS
Message . . . . : String ' ' contains a character that is not
valid.
Option 1. With passing the cmd value as RSTOBJ ?*RSTLIB(ABCLIB).
PGM
DCL &CMD *CHAR 1024
DCL &CMDLEN *INT 4 VALUE(1024)
DCL &OPTIONS *CHAR 20
DCL &OPTIONSLEN *INT 4 VALUE(20)
DCL &OPTIONS *CHAR 20
DCL &NEWCMD *CHAR 1024
DCL &NEWCMDLENA *INT 4 VALUE(1024)
DCL &NEWCMDLENC *INT 4 VALUE(1024)
CHGVAR %SST(&OPTIONS 1 4) VALUE(X'00000001')
CHGVAR %SST(&OPTIONS 5 1) VALUE('0')
CHGVAR %SST(&OPTIONS 6 1) VALUE('1')
CHGVAR %SST(&OPTIONS 7 1) VALUE('0')
CHGVAR %SST(&OPTIONS 12 4) VALUE(X'00000000')
CHGVAR %SST(&OPTIONS 16 5) VALUE(X'0000000000')
CHGVAR &CMD VALUE('RSTOBJ ?*RSTLIB(ABCLIB)')
CALL QCAPCMD PARM(&CMD &CMDLEN &OPTIONS &OPTIONSLEN +
'CPOP0100' &NEWCMD &NEWCMDLENA &NEWCMDLENC +
X'00000000')
MONMSG CPF6801 EXEC(RETURN)
SBMJOB CMD(CALL PGM(QCMDEXC) PARM(&NEWCMD +
&NEWCMDLENA)) JOB(RSTOBJ#) JOBQ(QBATCH)
ENDPGM
After calling above program, below is the prompt, which only displays "restore to library" parameter. All other input parameters are not displayed.
Restore Object (RSTOBJ)
Type choices, press Enter.
Restore to library . . . . . . . > ABCLIB Name, *SAVLIB
Option 2. With passing the cmd value will all parameters.
PGM
DCL &CMD *CHAR 1024
DCL &CMDLEN *INT 4 VALUE(1024)
DCL &OPTIONS *CHAR 20
DCL &OPTIONSLEN *INT 4 VALUE(20)
DCL &OPTIONS *CHAR 20
DCL &NEWCMD *CHAR 1024
DCL &NEWCMDLENA *INT 4 VALUE(1024)
DCL &NEWCMDLENC *INT 4 VALUE(1024)
CHGVAR %SST(&OPTIONS 1 4) VALUE(X'00000001')
CHGVAR %SST(&OPTIONS 5 1) VALUE('0')
CHGVAR %SST(&OPTIONS 6 1) VALUE('1')
CHGVAR %SST(&OPTIONS 7 1) VALUE('0')
CHGVAR %SST(&OPTIONS 12 4) VALUE(X'00000000')
CHGVAR %SST(&OPTIONS 16 5) VALUE(X'0000000000')
CHGVAR &CMD VALUE('RSTOBJ +
??OBJ() +
??SAVLIB() +
??DEV() +
??OBJTYPE(*FILE) +
??VOL() +
??SEQNBR() +
??POSITION() +
??LABEL() +
??ENDOPT() +
??SAVF() +
??OPTION(*NEW) +
??FILEMBR() +
??MBROPT(*NEW) +
??SPLFDTA() +
??SAVDATE() +
??SAVTIME() +
??ALWOBJDIF(*ALL) +
??FRCOBJCVN() +
?*RSTLIB(ABCLIB) +
??OUTPUT(*PRINT) +
??MEDDFN() +
??OPTFILE() +
??RSTASPDEV() +
??RSTASP() +
??OUTFILE() +
??OUTMBR() +
??INFTYPE() +
??OMITLIB() +
??OMITOBJ()')
CALL QCAPCMD PARM(&CMD &CMDLEN &OPTIONS &OPTIONSLEN +
'CPOP0100' &NEWCMD &NEWCMDLENA &NEWCMDLENC +
X'00000000')
MONMSG CPF6801 EXEC(RETURN)
SBMJOB CMD(CALL PGM(QCMDEXC) PARM(&NEWCMD +
&NEWCMDLENA)) JOB(RSTOBJ#) JOBQ(QBATCH)
ENDPGM
For this option2. we get the prompt for all paramters, however, it fails with below error.
Message . . . . : -CALL PGM(QCMDEXC) PARM('RSTOBJ ??OBJ(F0001)
??SAVLIB(TESTLIB) ??DEV(TAPLIB1) ??OBJTYPE(*FILE) ??VOL(MA2041) ??SEQNBR(345)
??POSITION(*N) ??LABEL(*N) ??ENDOPT(*N) ??SAVF(*N) ??OPTION(*NEW)
??FILEMBR(*N) ??MBROPT(*NEW) ??SPLFDTA(*N) ??SAVDATE(*N) ??SAVTIME(*N)
??ALWOBJDIF(*ALL) ??FRCOBJCVN(*N) ?*RSTLIB(ABCLIB) ??OUTPUT(*PRINT)
??MEDDFN(*N) ??OPTFILE(*N) ??RSTASPDEV(*N) ??RSTASP(*N) ??OUTFILE(*N)
??OUTMBR(*N) ??INFTYPE(*N) ??OMITLIB(*N) ??OMITOBJ(*N)' 1024)
02/11/16 04:40:49.603159 QCANPARS QSYS 094F QCMD QSYS
Message . . . . : String ' ' contains a character that is not
valid.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
This is the Best explanation i have seen for my question. Thanks a ton !!
I used the QCMDCHK, this API solved the problem.
Here is my modified code.
PGM
DCL VAR(&CMD) TYPE(*CHAR) LEN(4024)
DCL VAR(&CMDLEN) TYPE(*INT) LEN(4) VALUE(1024)
DCL VAR(&OPTIONS) TYPE(*CHAR) LEN(20)
DCL VAR(&OPTIONSLEN) TYPE(*INT) LEN(4) VALUE(20)
DCL VAR(&OPTIONS) TYPE(*CHAR) LEN(20)
DCL VAR(&NEWCMD) TYPE(*CHAR) LEN(4024)
DCL VAR(&NEWCMDLENA) TYPE(*INT) LEN(4) VALUE(4024)
DCL VAR(&NEWCMDLENC) TYPE(*INT) LEN(4) VALUE(4024)
CHGVAR VAR(%SST(&OPTIONS 1 4)) VALUE(X'00000001')
CHGVAR VAR(%SST(&OPTIONS 5 1)) VALUE('0')
CHGVAR VAR(%SST(&OPTIONS 6 1)) VALUE('1')
CHGVAR VAR(%SST(&OPTIONS 7 1)) VALUE('0')
CHGVAR VAR(%SST(&OPTIONS 12 4)) VALUE(X'00000000')
CHGVAR VAR(%SST(&OPTIONS 16 5)) VALUE(X'0000000000')
CHGVAR VAR(&CMD) VALUE('?RSTOBJ OBJTYPE(*FILE) +
OPTION(*NEW) MBROPT(*NEW) ALWOBJDIF(*ALL) +
?*RSTLIB(RESTORELIB) OUTPUT(*PRINT)')
CALL PGM(QCMDCHK) PARM(&CMD 2000)
MONMSG MSGID(CPF6801) EXEC(RETURN)
CALL PGM(QCAPCMD) PARM(&CMD &CMDLEN &OPTIONS +
&OPTIONSLEN 'CPOP0100' &NEWCMD +
&NEWCMDLENA &NEWCMDLENC X'00000000')
MONMSG MSGID(CPF6801) EXEC(RETURN)
SBMJOB JOB(RSTOBJ#) JOBQ(QBATCH) RQSDTA(&NEWCMD)
ENDPGM
I used the QCMDCHK, this API solved the problem.
Here is my modified code.
PGM
DCL VAR(&CMD) TYPE(*CHAR) LEN(4024)
DCL VAR(&CMDLEN) TYPE(*INT) LEN(4) VALUE(1024)
DCL VAR(&OPTIONS) TYPE(*CHAR) LEN(20)
DCL VAR(&OPTIONSLEN) TYPE(*INT) LEN(4) VALUE(20)
DCL VAR(&OPTIONS) TYPE(*CHAR) LEN(20)
DCL VAR(&NEWCMD) TYPE(*CHAR) LEN(4024)
DCL VAR(&NEWCMDLENA) TYPE(*INT) LEN(4) VALUE(4024)
DCL VAR(&NEWCMDLENC) TYPE(*INT) LEN(4) VALUE(4024)
CHGVAR VAR(%SST(&OPTIONS 1 4)) VALUE(X'00000001')
CHGVAR VAR(%SST(&OPTIONS 5 1)) VALUE('0')
CHGVAR VAR(%SST(&OPTIONS 6 1)) VALUE('1')
CHGVAR VAR(%SST(&OPTIONS 7 1)) VALUE('0')
CHGVAR VAR(%SST(&OPTIONS 12 4)) VALUE(X'00000000')
CHGVAR VAR(%SST(&OPTIONS 16 5)) VALUE(X'0000000000')
CHGVAR VAR(&CMD) VALUE('?RSTOBJ OBJTYPE(*FILE) +
OPTION(*NEW) MBROPT(*NEW) ALWOBJDIF(*ALL) +
?*RSTLIB(RESTORELIB) OUTPUT(*PRINT)')
CALL PGM(QCMDCHK) PARM(&CMD 2000)
MONMSG MSGID(CPF6801) EXEC(RETURN)
CALL PGM(QCAPCMD) PARM(&CMD &CMDLEN &OPTIONS +
&OPTIONSLEN 'CPOP0100' &NEWCMD +
&NEWCMDLENA &NEWCMDLENC X'00000000')
MONMSG MSGID(CPF6801) EXEC(RETURN)
SBMJOB JOB(RSTOBJ#) JOBQ(QBATCH) RQSDTA(&NEWCMD)
ENDPGM
Assuming you want to protect the RSTLIB() parameter, but allow the user to specify any other values, then I suggest you try this:
?RSTOBJ RSTOBJ RSTLIB(ABCLIB)
http://www.ibm.com/support/knowledgecenter/SSAE4W_7.1.0/com.ibm.etools.iseries.pgmgd.doc/evfclmst162.htm