• The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
Menu
  • The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
  • A Practical Way to Add Exports to a Service Program

    October 15, 2008 Ted Holt

    My life was confusing enough already. Then along came IBM with binder language, the CL-like language we use to define the list of exports of a service program. Awhile back I sat down to try to find an effective way to deal with service program exports. Here’s what I came up with.

    When you create a service program, you must list the exports, that is, the data and/or modules that are available to callers. There is a shortcut. If you specify EXPORT(*ALL) in the Create Service Program (CRTSRVPGM) command, the system will generate the list of exports for you. However, you don’t have any guarantee that the generated list will be compatible with existing callers, therefore you will need to rebind the newly created service program to existing callers. You can use binder language to avoid the rebinding process, because binder language gives you a way to order the list of exports.

    Binder language is stored in physical file members, like RPG, CL, and DDS source code. Create a source physical file called QSRVSRC. I recommend you put it and the source code for all the modules in the same library.

    The first line of a binder language source member is the Start Program Export (STRPGMEXP) command. The last line is the End Program Export (ENDPGMEXP) command. Between the two, use the EXPORT command to list each export. Here’s an example:

    strpgmexp pgmlvl(*current) lvlchk(*yes) signature('BR549')
    export    symbol('JUNIOR')
    export    symbol('SAMPLES')
    endpgmexp
    

    Notice that the STRPGMEXP command has three parameters:

    • PGMLVL (program level) may be *CURRENT, to indicate that the list of exports is the current list of exports, or *PRV, to indicate that the list of exports is that of a previous version of the service program. You may have one *CURRENT list and one or more *PRV lists.
    • LVLCHK (level check) determines whether callers will perform level checking on a service program at run-time (*YES) or not (*NO). If a caller finds that the list of exports for a service program has been changed, it issues message MCH443 (program signature violation).
    • In the SIGNATURE parameter, You may specify a signature of 16 bytes or less, or you may use the special value *GEN to tell the system to generate a signature. SIGNATURE(*GEN) is required with LVLCHK(*NO).

    Suppose we have a service program, NUMBERS, which is made of one module, also called NUMBERS, which consists of two subprocedures, THREE and FOUR.

    H nomain
    
    D/copy prototypes,numbers
    
    P Three           b                   export
    D                 pi             5i 0
     /free
        return 3;
     /end-free
    P                 e
     * =========================================
    P Four            b                   export
    D                 pi             5i 0
     /free
        return 4;
     /end-free
    P                 e
    

    For completeness, here’s the prototype referred to in the source.

    D Three           pr             5i 0
    D Four            pr             5i 0
    

    Which of the various combinations of the STRPGMEXP parameters would be most conducive to change? That is, what binder language would be easy to add exports to? What binder language would not require that callers be rebound to the service program? Here’s one possibility:

    strpgmexp pgmlvl(*current) lvlchk(*yes) signature('NUMBERS')
    export    symbol('THREE')
    export    symbol('FOUR')
    endpgmexp
    

    Suppose I decide to add three more subprocedures–ONE, TWO, and FIVE–to this module and service program.

    H nomain
    
    D/copy prototypes,numbers
    
    P One             b                   export
    D                 pi             5i 0
     /free
        return 1;
     /end-free
    P                 e
     * ==========================================
    P Two             b                   export
    D                 pi             5i 0
     /free
        return 2;
     /end-free
    P                 e
     * ==========================================
    P Three           b                   export
    D                 pi             5i 0
     /free
        return 3;
     /end-free
    P                 e
     * ==========================================
    P Four            b                   export
    D                 pi             5i 0 
     /free
        return 4;
     /end-free
    P                 e
     * ==========================================
    P Five            b                   export
    D                 pi             5i 0
     /free
        return 5;
     /end-free
    P                 e
    

    After I recreate the module, I am ready to recreate the service program. How should I modify the binder language?

    I could change the previous binder language to a *PRV signature, and add a new current signature, like this:

    strpgmexp pgmlvl(*current) lvlchk(*yes) signature(*gen)
    export    symbol('ONE')
    export    symbol('TWO')
    export    symbol('THREE')
    export    symbol('FOUR')
    export    symbol('FIVE')
    endpgmexp
    strpgmexp pgmlvl(*prv) lvlchk(*yes) signature(*gen)
    export    symbol('THREE')
    export    symbol('FOUR')
    endpgmexp
    

    But guess what? This binder language won’t work. When I run a program that calls this service program, calls to THREE return 1 and calls to FOUR return 2. To ensure that the callers continue to work correctly, I have to add the new exports to the end of the list, like this:

    strpgmexp pgmlvl(*current) lvlchk(*yes) signature(*gen)
    export    symbol('THREE')
    export    symbol('FOUR')
    export    symbol('ONE')
    export    symbol('TWO')
    export    symbol('FIVE')
    endpgmexp
    strpgmexp pgmlvl(*prv) lvlchk(*yes) signature(*gen)
    export    symbol('THREE')
    export    symbol('FOUR')
    endpgmexp
    

    According to my tests, I can add the subprocedures anywhere in the module. The only thing that matters to callers is that the new exports be added to the end of the list.

    But if the new exports must be added to the end of the list, why fool around with *PRV lists anyway? For that reason, I use only a *CURRENT signature, to which I give a name, and I add new exports to the end of the list.

    strpgmexp pgmlvl(*current) lvlchk(*yes) signature('NUMBERS')
    export    symbol('THREE')
    export    symbol('FOUR')
    export    symbol('ONE')
    export    symbol('TWO')
    export    symbol('FIVE')
    endpgmexp
    

    The result is the same, and I have less complexity to deal with.

    To sum it up:

    • Create one *CURRENT signature only.
    • Do not create *PRV signatures.
    • Name the signature, instead of letting the system generate a name.
    • Add new exports to the bottom of the list.



                         Post this story to del.icio.us
                   Post this story to Digg
        Post this story to Slashdot

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Tags:

    Sponsored by
    WorksRight Software

    Do you need area code information?
    Do you need ZIP Code information?
    Do you need ZIP+4 information?
    Do you need city name information?
    Do you need county information?
    Do you need a nearest dealer locator system?

    We can HELP! We have affordable AS/400 software and data to do all of the above. Whether you need a simple city name retrieval system or a sophisticated CASS postal coding system, we have it for you!

    The ZIP/CITY system is based on 5-digit ZIP Codes. You can retrieve city names, state names, county names, area codes, time zones, latitude, longitude, and more just by knowing the ZIP Code. We supply information on all the latest area code changes. A nearest dealer locator function is also included. ZIP/CITY includes software, data, monthly updates, and unlimited support. The cost is $495 per year.

    PER/ZIP4 is a sophisticated CASS certified postal coding system for assigning ZIP Codes, ZIP+4, carrier route, and delivery point codes. PER/ZIP4 also provides county names and FIPS codes. PER/ZIP4 can be used interactively, in batch, and with callable programs. PER/ZIP4 includes software, data, monthly updates, and unlimited support. The cost is $3,900 for the first year, and $1,950 for renewal.

    Just call us and we’ll arrange for 30 days FREE use of either ZIP/CITY or PER/ZIP4.

    WorksRight Software, Inc.
    Phone: 601-856-8337
    Fax: 601-856-9432
    Email: software@worksright.com
    Website: www.worksright.com

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Sponsored Links

    ARCAD Software:  October 22 Webcast! WDSc & RDi: Debugging with Don Yantzi
    BCD:  Presto instantly Web enables 5250 Green Screen Apps with NO RPG, Cobol or DDS code changes
    Vision Solutions:  A $20 gas card for completing a short i5/OS DR survey

    IT Jungle Store Top Book Picks

    Easy Steps to Internet Programming for AS/400, iSeries, and System i: List Price, $49.95
    Getting Started with PHP for i5/OS: List Price, $59.95
    The System i RPG & RPG IV Tutorial and Lab Exercises: List Price, $59.95
    The System i Pocket RPG & RPG IV Guide: List Price, $69.95
    The iSeries Pocket Database Guide: List Price, $59.00
    The iSeries Pocket Developers' Guide: List Price, $59.00
    The iSeries Pocket SQL Guide: List Price, $59.00
    The iSeries Pocket Query Guide: List Price, $49.00
    The iSeries Pocket WebFacing Primer: List Price, $39.00
    Migrating to WebSphere Express for iSeries: List Price, $49.00
    iSeries Express Web Implementer's Guide: List Price, $59.00
    Getting Started with WebSphere Development Studio for iSeries: List Price, $79.95
    Getting Started With WebSphere Development Studio Client for iSeries: List Price, $89.00
    Getting Started with WebSphere Express for iSeries: List Price, $49.00
    WebFacing Application Design and Development Guide: List Price, $55.00
    Can the AS/400 Survive IBM?: List Price, $49.00
    The All-Everything Machine: List Price, $29.95
    Chip Wars: List Price, $29.95

    Aviva Updates 5250 Emulator for Windows Vista Some Servers Take a Dive in IBM’s Third Quarter

    Leave a Reply Cancel reply

Volume 8, Number 35 -- October 15, 2008
THIS ISSUE SPONSORED BY:

Profound Logic Software
Group8 Security
Aldon

Table of Contents

  • Displaying Multiple Results Sets in Run SQL Scripts
  • A Practical Way to Add Exports to a Service Program
  • Admin Alert: Preventing Multiple IPs from Stopping Internet Traffic

Content archive

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

Recent Posts

  • Liam Allan Shares What’s Coming Next With Code For IBM i
  • From Stable To Scalable: Visual LANSA 16 Powers IBM i Growth – Launching July 8
  • VS Code Will Be The Heart Of The Modern IBM i Platform
  • The AS/400: A 37-Year-Old Dog That Loves To Learn New Tricks
  • IBM i PTF Guide, Volume 27, Number 25
  • 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

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