QTEMP Is A Different Animal
November 15, 2016 Hey, Ted
|
I have a problem with an FTP script. I wish to send a file in QTEMP to a remote system, but the script tries to send the file from QGPL instead. The PUT command does not tell which library to send the file from because our standards prohibit the use of hard-coded library names. Any thoughts will be appreciated. –Al I commend you and other wise people in your shop for outlawing the hard-coding of library names, Al. The library list is a wonderful feature of IBM i, a feature that is sorely missing from other database systems. I have mentioned this before. However, QTEMP is a different animal. Since each job has its own QTEMP library, there is no way two users can step on one another’s feet. I suggest that you push to change the standards to make an exception of QTEMP. That would solve your FTP problem. If you are successful in having the policy changed, then I recommend the next step be to consider how best to hard code QTEMP. I’ll show you what I mean. Here’s a program that uses QTEMP.
pgm
dcl &Abending *lgl
dcl &MsgKey *char 4
dcl &PgmName *char 10
dcl &Sender *char 80
monmsg cpf0000 exec(goto Abend)
/* Retrieve the program name. */
sndpgmmsg msg(' ') topgmq(*same) msgtype(*info) keyvar(&msgkey)
rcvmsg pgmq(*same) msgtype(*info) sender(&sender) rmv(*yes)
chgvar &PgmName %sst(&Sender 56 10)
/* Create temporary objects */
crtdtaara qtemp/Sequence *dec (3 0)
crtpf qtemp/billwork1
crtpf qtemp/billwork2
crtpf qtemp/billwork3
ovrdbf billwork1 tofile(qtemp/billwork1)
ovrdbf billwork2 tofile(qtemp/billwork2)
ovrdbf billwork3 tofile(qtemp/billwork3)
call Bill500r
dltovr billwork1
dltovr billwork2
dltovr billwork3
return
Abend:
if (&Abending) do
sndpgmmsg msgid(cpf9898) msgf(qcpfmsg) +
msgdta('Unexpected error in' *bcat &PgmName) +
msgtype(*escape) keyvar(&MsgKey)
enddo
chgvar &Abending '1'
movpgmmsg msgtype(*diag)
rsnescmsg
endpgm
The program creates a data area and three physical files in QTEMP, the RPG program runs, and all’s right with the world. There’s nothing wrong with this. But I would do this instead:
pgm
dcl &WorkLib *char 10 value(QTEMP)
dcl &Abending *lgl
dcl &MsgKey *char 4
dcl &PgmName *char 10
dcl &Sender *char 80
monmsg cpf0000 exec(goto Abend)
/* Retrieve the program name. */
sndpgmmsg msg(' ') topgmq(*same) msgtype(*info) keyvar(&msgkey)
rcvmsg pgmq(*same) msgtype(*info) sender(&sender) rmv(*yes)
chgvar &PgmName %sst(&Sender 56 10)
/* Create temporary objects */
crtdtaara &WorkLib/Sequence *dec (3 0)
crtpf &WorkLib/billwork1
crtpf &WorkLib/billwork2
crtpf &WorkLib/billwork3
ovrdbf billwork1 tofile(&WorkLib/billwork1)
ovrdbf billwork2 tofile(&WorkLib/billwork2)
ovrdbf billwork3 tofile(&WorkLib/billwork3)
call qad06631r
dltovr billwork1
dltovr billwork2
dltovr billwork3
return
Abend:
if (&Abending) do
sndpgmmsg msgid(cpf9898) msgf(qcpfmsg) +
msgdta('Unexpected error in' *bcat &PgmName) +
msgtype(*escape) keyvar(&MsgKey)
enddo
chgvar &Abending '1'
movpgmmsg msgtype(*diag)
rsnescmsg
endpgm
QTEMP is still hard coded in the program, but only in one spot–the initial value of the &WORKLIB variable. On many occasions, I have found and exterminated bugs in batch jobs by changing the value of the work library variable. The sequence is:
By the way, if you’re not familiar with Brian Rusch’s fabulous Move Program Messages (MOVPGMMSG) and Resend Escape Message (RSNESCMSG) commands, I enthusiastically recommend you remedy that situation. You can learn about them here. QTEMP is another feature of IBM i that doesn’t exist on other systems. It pains me each time I see such well-designed software replaced by a cobbled-together assortment of utilities. Ted Holt welcomes your comments and questions. Email him through the IT Jungle Contacts page. RELATED STORIES Where Do Library Lists Reside?
|

