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

    When it comes to consuming web APIs on your IBM i, your options often boil down to one of two things:

    First, you end up having to rely on a variety of open source and non-RPG solutions. This adds developer complexity, taking away time that could have been better spent invested in other projects. Of course, open source software is free, but generally comes at the cost of no professional support, which adds an element of risk in your production environment. RXS is completely professionally supported, and is complemented by a staff of trained IBM i developers who can address your nuanced development challenges, head on.

    Second, if you choose not to pursue an open-source solution, you’re often left having to shake up your current program architecture with proprietary software, external dependencies, and partial RPG implementations – many of which are sub-par compared to RPG-XML Suite’s wide range of features. RXS aims to simplify the efforts of developers with tools like code generators, useful commands, and subprocedures written in 100% RPG – no Java. Because they are entirely RPG, the RXS subprocedures are easy to add to new or existing ILE programs and architecture, helping to cut your development time. RPG-XML Suite offers powerful capabilities in an accessible, easy-to-implement format.

    With RPG-XML Suite, you can accomplish a variety of complex tasks, such as:

    • Calling REST and SOAP web services from your IBM i
    • Offering APIs from your IBM i
    • Creating JSON & XML
    • Parsing JSON & XML
    • Text manipulation, Base64 encoding/decoding, CCSID handling, hashing and encryption functions, and more.

    To try RXS for yourself, we recommend a free proof of concept, which not only gives you access to all of RPG-XML Suite’s subprocedures and utilities but also includes a tailor-made software demonstration that can be used as a starting point for your future API implementations.

    For a free proof of concept, contact us at sales@krengeltech.com, or visit our website for more information.

    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

  • IBM i 7.3 TR12: The Non-TR Tech Refresh
  • IBM i Integration Elevates Operational Query and Analytics
  • Simplified IBM i Stack Bundling Ahead Of Subscription Pricing
  • More Price Hikes From IBM, Now For High End Storage
  • Big Blue Readies Power10 And IBM i 7.5 Training for Partners
  • IBM Delivers More Out-of-the-Box Security with IBM i 7.5
  • Groundhog Day For Malware
  • IBM i Community Reacts to IBM i 7.5
  • Four Hundred Monitor, May 11
  • IBM i PTF Guide, Volume 24, Number 19

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 © 2022 IT Jungle

loading Cancel
Post was not sent - check your email addresses!
Email check failed, please try again
Sorry, your blog cannot share posts by email.