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?
|