• The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
Menu
  • The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
  • Sending Escape Messages From RPG, Take 2

    May 10, 2016 Hey, Ted

    In Sending Escape Messages from RPG, your program defines the message data parameter as 80 bytes, but the IBM manual (Send Program Message (QMHSNDPM)) defines the parameter as char(*), with notes saying it can be up to 32767. I would like a variable longer than 80, but instead of coding 100 today, 120 next project, and so on, I’m wondering how I could code it better to take full advantage of the API.

    –Glenn

    The short answer is that you don’t have to code the length. Let the compiler figure it out for you. Here’s an illustration that may help.

    Let’s suppose you use message USR1001 as a general escape message in an application. This message tells which program canceled, tells where it canceled, and gives some idea of what went wrong.

    ADDMSGD    MSGID(USR1001) MSGF(USRMSG) +
                 MSG('Program &1 canceled. Statement=&2, status=&3.') +
                 SECLVL('See previous messages in the job log for more +
                 information.') SEV(40) +
                 FMT((*CHAR 10) (*UBIN 2) (*CHAR 5))
    

    Notice the FMT parameter in the Add Message Description (ADDMSGD) command. It defines three fields. The first step in using this message is to create a data structure that defines those same fields. You might want to put it in a copybook.

    dcl-ds  USR1001  qualified inz;
         Program       char(10);
         Statement     uns(5);
         Status        char(5);
    end-ds;
    

    • Load the program subfield from the program status data structure.
    • Load the statement subfield with any number, using a different number for each error you trap. This tells you where the program found an error.
    • Load the status subfield with an appropriate status code (e.g., the SQL state) if needed.

    Create another copybook for a QMHSNDPM prototype.

    dcl-pr  QMHSNDPM     extpgm('QMHSNDPM');
       MsgID              char(7)      const;
       MsgFile            char(20)     const;
       MsgDta             char(32767)  const   options(*varsize);
       MsgDtaLen          int(10)      const;
       MsgType            char(10)     const;
       MsgQ               char(10)     const;
       MsgQNbr            int(10)      const;
       MsgKey             char(4);
       ErrorDs                         likeds(ErrorDS);
    end-pr;
    

    As you pointed out, the message data parameter can be up to 32,767 bytes long. Adding OPTIONS(*VARSIZE) allows you to pass character variables of other sizes. This is part of the answer to your question.

    Now, to address the rest of your question, here’s a fragmented program with a call to QMHSNDPM.

           ctl-opt actgrp(*caller) option(*srcstmt: *nodebugio);
    
           /copy copybooks,psds
           /copy copybooks,qmhsndpm
           /copy copybooks,errords
           /copy copybooks,usr1001
    
           dcl-s  MsgKey        char(4);
    
           *inlr = *on;
    
           monitor;
              Msg01RMain ();
           on-error;
              USR1001.Statement = 99;
              USR1001.Status = '99999';
              ErrorDS.BytesProvided = *zero;
           endmon;
    
           if USR1001.Statement <> *zero;
              USR1001.Program = psds.procedure;
              ErrorDS.BytesProvided = *zero;
              qmhsndpm ('USR1001': 'USRMSG    *LIBL': USR1001: %size(USR1001):
                        '*ESCAPE': '*PGMBDY': 1: MsgKey: ErrorDS );
           endif;
    
           return;
    
           dcl-proc  Msg01RMain;
    
                 dcl-c  EOD_SQL        const('02000');
    
                 // some sql statement here
                 if SQLState > EOD_SQL;
                    USR1001.Statement = 10;
                    USR1001.Status    = SqlState;
                 endif;
            end-proc;
    

    Notice the fourth argument supplied to QMHSNDPM: %SIZE(USR1001). Never do anything the compiler can do for you.

    So, to sum it up:

    1. Create a data structure that corresponds to the fields of the message description. Pass this data structure to QMHSNDPM as the message data.
    2. In the prototype for QMHSNDPM, define the message data parameter with the maximum length of 32,767 and OPTIONS(*VARSIZE).
    3. Use the %SIZE function to pass the length of the data structure to QMHSNDPM.

    If you do these things, you should have no problem sending escape messages from RPG programs, and your concern about the size of the message data parameter becomes a non-issue.

    It’s great that you’re looking for an effective way to use QMHSNDPM. Messaging is a fundamental that every developer should work to master.

    RELATED STORY

    Sending Escape Messages from RPG

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Tags:

    Sponsored by
    DRV Tech

    Get More Out of Your IBM i

    With soaring costs, operational data is more critical than ever. IBM shops need faster, easier ways to distribute IBM applications-based data to users more efficiently, no matter where they are.

    The Problem:

    For Users, IBM Data Can Be Difficult to Get To

    IBM Applications generate reports as spooled files, originally designed to be printed. Often those reports are packed together with so much data it makes them difficult to read. Add to that hardcopy is a pain to distribute. User-friendly formats like Excel and PDF are better, offering sorting, searching, and easy portability but getting IBM reports into these formats can be tricky without the right tools.

    The Solution:

    IBM i Reports can easily be converted to easy to read and share formats like Excel and PDF and Delivered by Email

    Converting IBM i, iSeries, and AS400 reports into Excel and PDF is now a lot easier with SpoolFlex software by DRV Tech.  If you or your users are still doing this manually, think how much time is wasted dragging and reformatting to make a report readable. How much time would be saved if they were automatically formatted correctly and delivered to one or multiple recipients.

    SpoolFlex converts spooled files to Excel and PDF, automatically emailing them, and saving copies to network shared folders. SpoolFlex converts complex reports to Excel, removing unwanted headers, splitting large reports out for individual recipients, and delivering to users whether they are at the office or working from home.

    Watch our 2-minute video and see DRV’s powerful SpoolFlex software can solve your file conversion challenges.

    Watch Video

    DRV Tech

    www.drvtech.com

    866.378.3366

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Sponsored Links

    COMMON:  2016 Annual Meeting & Expo, May 15 - 18, in New Orleans! Great Power Systems event!
    NGS :  Webinar: Realizing the Power of IBM i with NGS-IQ. May 11. RSVP now!
    Profound Logic Software:  'i on the Enterprise' Worldwide Virtual Event. June 8. Register Now!

    IBM To Sell Off Two-Thirds Of The Rochester Labs Jazzing Up IBM i In COMMON’s Quarter

    Leave a Reply Cancel reply

Volume 16, Number 11 -- May 10, 2016
THIS ISSUE SPONSORED BY:

ProData Computer Services
BCD Software
T.L. Ashford

Table of Contents

  • OLAP Aggregation Specification In DB2 For i 7.3
  • Sending Escape Messages From RPG, Take 2
  • When You Reach Your Break(ing) Point. . . Or Not

Content archive

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

Recent Posts

  • Meet The Next Gen Of IBMers Helping To Build IBM i
  • Looks Like IBM Is Building A Linux-Like PASE For IBM i After All
  • Will Independent IBM i Clouds Survive PowerVS?
  • Now, IBM Is Jacking Up Hardware Maintenance Prices
  • IBM i PTF Guide, Volume 27, Number 24
  • 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

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