• The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
Menu
  • The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
  • 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:

    • Start a service job on the batch job
    • Put the program into debug
    • Set a breakpoint before the first executable statement
    • Change the value of the work library variable to the name of a temporary library I had created for the occasion
    • Let the program run to completion
    • Query the temporary database tables

    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?

    CL Error-Handling With APIs

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Tags:

    Sponsored by
    Maxava

    Migrate IBM i with Confidence

    Tired of costly and risky migrations? Maxava Migrate Live minimizes disruption with seamless transitions. Upgrading to Power10 or cloud hosted system, Maxava has you covered!

    Learn More

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Sponsored Links

    Profound Logic Software:  NOW ON DEMAND! Webinar: Agile Modernization with Node.js.
    Fresche:  IBM i staffing for all of your IT needs. Request a FREE estimate. 1-800-361-6782
    Chrono-Logic:  Simplify deployment with LANSA-based Change Management and Deployment solutions.

    You’re Hired! Finding Your Next IBM i Pro What Koch’s $2.5 Billion Infor Investment Means For IBM i

    Leave a Reply Cancel reply

Volume 16, Number 25 -- November 15, 2016
THIS ISSUE SPONSORED BY:

ProData Computer Services
T.L. Ashford
WorksRight Software

Table of Contents

  • Calling SQL Functions From RPG, A Service Program
  • SQL PL–The LOOP Loop
  • QTEMP Is A Different Animal

Content archive

  • The Four Hundred
  • Four Hundred Stuff
  • Four Hundred Guru

Recent Posts

  • Big Blue Raises IBM i License Transfer Fees, Other Prices
  • Keep The IBM i Youth Movement Going With More Training, Better Tools
  • Remain Begins Migrating DevOps Tools To VS Code
  • IBM Readies LTO-10 Tape Drives And Libraries
  • IBM i PTF Guide, Volume 27, Number 23
  • SEU’s Fate, An IBM i V8, And The Odds Of A Power13
  • Tandberg Bankruptcy Leaves A Hole In IBM Power Storage
  • RPG Code Generation And The Agentic Future Of IBM i
  • A Bunch Of IBM i-Power Systems Things To Be Aware Of
  • IBM i PTF Guide, Volume 27, Numbers 21 And 22

Subscribe

To get news from IT Jungle sent to your inbox every week, subscribe to our newsletter.

Pages

  • About Us
  • Contact
  • Contributors
  • Four Hundred Monitor
  • IBM i PTF Guide
  • Media Kit
  • Subscribe

Search

Copyright © 2025 IT Jungle