• 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
    FalconStor

    Simplify Secure Offsite Data Protection for IBM Power with FalconStor Habanero™

    IBM i teams are under growing pressure to ensure data is protected, recoverable, and compliant—without adding complexity or disrupting stable environments.

    FalconStor Habanero™ provides secure, fully managed offsite data protection purpose-built for IBM Power. It integrates directly with existing IBM i backup tools and processes, enabling reliable offsite copies without new infrastructure, workflow changes, or added operational overhead.

    By delivering and managing the service end-to-end, FalconStor helps organizations strengthen cyber resilience, improve disaster recovery readiness, and meet compliance requirements with confidence. Offsite copies are securely maintained and available when needed, supporting recovery, audits, and business continuity.

    FalconStor Habanero offers a straightforward way to modernize offsite data protection for IBM i: focused on simplicity, reliability, and resilience.

    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

  • IBM Starts Winding Down Power10 System Sales
  • Guru: Service Programs And Activation Groups – Design Decisions That Matter
  • Strategic Topics To Think About For 2026, Part 1
  • Shield Gooses Performance Of Nagios Monitoring Tool, Adds AI Reporting
  • IBM i PTF Guide, Volume 28, Number 6
  • Rolling The Die In 2026: IBM i Predictions, Take Two
  • Perhaps 2026 Is The Year For Power Systems To Boom A Little
  • Guru: Binder Source Is Your Service Program’s Owner’s Manual
  • Skills Displaces Cybersecurity As Top Concern For IBM i Shops
  • IBM i PTF Guide, Volume 28, Number 5

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