Example in ILE RPG: Program for packaging a product

This example shows you the steps necessary to package your product like IBM products.

     F*****************************************************************
     F*****************************************************************
     F*
     F*Program Name: SFTWPRDEX
     F*
     F*Language: ILE RPG
     F*
     F*Descriptive Name: Software Product Example
     F*
     F*Description: This example shows you the steps necessary to
     F*             package your product like IBM products.
     F*
     F*Header Files Included: QUSEC    - Error Code Parameter
     F*                       QSZCRTPD - Create Product Definition API
     F*                       QSZCRTPL - Create Product Load API
     F*                       QSZPKGPO - Package Product Option API
     F*
     F*****************************************************************
     F*****************************************************************
     F*
     FQPRINT    O    F  132        PRINTER OFLIND(*INOF) USROPN
     D*
     D* Error Code parameter include.  As this sample program
     D* uses /COPY to include the error code structure, only the first
     D* 16 bytes of the error code structure are available.  If the
     D* application program needs to access the variable length
     D* exception data for the error, the developer should physically
     D* copy the QSYSINC include and modify the copied include to
     D* define additional storage for the exception data.
     D*
     D/COPY QSYSINC/QRPGLESRC,QUSEC
     D*
     D* Create Product Definition API Include
     D*
     D/COPY QSYSINC/QRPGLESRC,QSZCRTPD
     D*
     D* Create Product Load API Include
     D*
     D/COPY QSYSINC/QRPGLESRC,QSZCRTPL
     D*
     D* Package Product Option API Include
     D*
     D/COPY QSYSINC/QRPGLESRC,QSZPKGPO
     D*
     D* Compile Time Array
     D*
     DOBJ_INFO         S             41    DIM(15) CTDATA PERRCD(1)
     D*
     DOBJ_INFO_I       DS                  BASED(OBJ_PTR)
     D OBJ_NAME                      10
     D OBJ_TYPE                      10
     D PRD_OPT_ID                     4
     D PRD_OPT_LD                     4
     D LP_ID                         13
     D*
     D* Change Object Information parameter
     D*
     DCOBJI            DS
     D NUMKEY                         9B 0 INZ(3)
     D KEY13                          9B 0 INZ(13)
     D LEN13                          9B 0 INZ(4)
     D PID13                          4
     D KEY12                          9B 0 INZ(12)
     D LEN12                          9B 0 INZ(4)
     D LID12                          4
     D KEY5                           9B 0 INZ(5)
     D LEN5                           9B 0 INZ(13)
     D LP5                           13
     D*
     D* Miscellaneous data
     D*
     DAPI_NAME         S             10
     DFIRST_ERR        S              1    INZ('0')
     DPROD_ID          S              7    INZ('0ABCABC')
     DPROD_NAME        S             20    INZ('ABC0050   ABC       ')
     DRLS_LVL          S              6    INZ('V3R1M0')
     DNBR_OPTS         S              9B 0 INZ(1)
     DNBR_LANGS        S              9B 0 INZ(1)
     DTEXT_DESC        S             50    INZ('ABC Product')
     DPUB_AUT          S             10    INZ('*USE')
     DNBR_ADD_LB       S              9B 0 INZ(0)
     DNBR_PE           S              9B 0 INZ(1)
     DNBR_FLDRS        S              9B 0 INZ(0)
     DOBJNAM           S             20
     C*
     C* Beginning of Mainline
     C*
     C* Initialize the error code parameter.  To signal exceptions to
     C* this program by the API, you need to set the bytes provided
     C* field of the error code to zero.  Because this program has
     C* exceptions sent back through the error code parameter, it sets
     C* the bytes provided field to the number of bytes it gives the
     C* API for the parameter.
     C*
     C                   EVAL      QUSBPRV = %SIZE(QUSEC)
     C*
     C* Create Product Definition Object - ABC0050
     C*
     C                   EXSR      PRDDFN     (1)
     C*
     C* Create Product Load Objects - ABC0050 (MRM) and ABC0029 (MRI)
     C*
     C                   EXSR      PRDLOD     (2)
     C*
     C* Change Object Description for all objects associated with
     C* the ABC Product.
     C*
     C                   EXSR      COBJD      (3)
     C*
     C* Package the ABC Product so that all the SAVLICPGM, RSTLIBPGM,
     C* and DLTLICPGM commands work with the product.
     C*
     C                   EXSR      PKGPO      (4)
     C*
     C* All done, product is ready to ship.
     C*
     C                   EVAL      *INLR = '1'
     C                   RETURN
     C*
     C* End of MAINLINE
     C*
     C*
     C*****************************************************************
     C*****************************************************************
     C*
     C* Subroutine: PRDDFN
     C*
     C* Descriptive Name: Create product definitions.
     C*
     C* Description: This subroutine will create the product definition
     C*              ABC0050 for the ABC product.
     C*
     C*****************************************************************
     C*****************************************************************
     C*
     C     PRDDFN        BEGSR
     C*
     C* Setup for Product Definition
     C* Fill Product Definition Information Parameter
     C*
     C                   EVAL      QSZPID = PROD_ID
     C                   EVAL      QSZRL = RLS_LVL
     C                   EVAL      QSZMFIL = 'ABCMSG'
     C                   EVAL      QSZFC = '*CURRENT'
     C                   EVAL      QSZCC = '*CURRENT'
     C                   EVAL      QSZRD = '941201'
     C                   EVAL      QSZAMR = '*NO'
     C                   EVAL      QSZRIDT = '*PHONE'
     C                   EVAL      QSZRIDV = '5072535010'
     C*
     C* Fill Product Load Parameter
     C*
     C                   EVAL      QSZOPT = '0000'
     C                   EVAL      QSZMID = 'ABC0001'
     C                   EVAL      QSZADN = '*NODYNNAM'
     C                   EVAL      QSZCL = '5001'
     C                   EVAL      QSZERVED00 = *BLANKS
     C*
     C* Fill Language Load List Parameter
     C*
     C                   EVAL      QSZLL00 = '2924'
     C                   EVAL      QSZOPT00 = '0000'
     C                   EVAL      QSZERVED01 = *BLANKS
     C*
     C* Create the Product Definition for the ABC Product
     C*
     C                   CALL      'QSZCRTPD'
     C                   PARM                    PROD_NAME
     C                   PARM                    QSZPI
     C                   PARM                    QSZPO
     C                   PARM      1             NBR_OPTS
     C                   PARM                    QSZLL
     C                   PARM      1             NBR_LANGS
     C                   PARM                    TEXT_DESC
     C                   PARM                    PUB_AUT
     C                   PARM                    QUSEC
     C*
     C* If an exception occurs, the API returns the exception in the
     C* error code parameter.  The bytes available field is set to
     C* zero if no exception occurs and greater than zero if an
     C* exception does occur.
     C*
     C                   IF        QUSBAVL > 0
     C                   EVAL      API_NAME = 'QSZCRTPD'
     C                   EXSR      ERRCOD
     C                   ENDIF
     C*
     C                   ENDSR
     C*
     C*****************************************************************
     C*****************************************************************
     C*
     C* Subroutine: PRDLOD
     C*
     C* Descriptive Name: Create product loads.
     C*
     C* Description: This subroutine will create the product loads,
     C*              ABC0050 and ABC0029, for the ABC product.
     C*
     C*****************************************************************
     C*****************************************************************
     C*
     C     PRDLOD        BEGSR
     C*
     C* Setup for Product Load for MRM Objects
     C* Fill Product Load Information Parameter
     C*
     C                   EVAL      QSZPID00 = PROD_ID
     C                   EVAL      QSZRL00 = RLS_LVL
     C                   EVAL      QSZOPT01 = '0000'
     C                   EVAL      QSZLT = '*CODE'
     C                   EVAL      QSZLID = '*CODEDFT'
     C                   EVAL      QSZRIDT00 = '*PRDDFN'
     C                   EVAL      QSZRIDV00 = *BLANKS
     C                   EVAL      QSZMTR = '*CURRENT'
     C                   EVAL      QSZERVED02 = *BLANKS
     C*
     C* Fill Principal Library Information Parameter
     C*
     C                   EVAL      QSZDL = 'ABC'
     C                   EVAL      QSZPL = 'ABC'
     C                   EVAL      QSZPEP = 'ABCPGMMRM2'
     C*
     C* Fill Preoperation Exit Programs Parameter
     C*
     C                   EVAL      QSZPEP00 = 'ABCPGMMRM1'
     C                   EVAL      QSZDL00 = 'ABC'
     C*
     C* Fill Additional Library List Parameter
     C*       None
     C*
     C* Fill Folder List Parameter
     C*       None
     C*
     C* Let's create the product load for the ABC Product - MRM Objects
     C*
     C                   CALL      'QSZCRTPL'
     C                   PARM      'ABC0050'     PROD_ID_NM       10
     C                   PARM                    QSZLI
     C                   PARM      *BLANKS       SEC_LANG         10
     C                   PARM                    QSZLI00
     C                   PARM                    QSZAL
     C                   PARM                    NBR_ADD_LB
     C                   PARM                    QSZPE
     C                   PARM                    NBR_PE
     C                   PARM                    QSZFL
     C                   PARM                    NBR_FLDRS
     C                   PARM                    TEXT_DESC
     C                   PARM                    PUB_AUT
     C                   PARM                    QUSEC
     C*
     C* If an exception occurs, the API returns the exception in the
     C* error code parameter.  The bytes available field is set to
     C* zero if no exception occurs and greater than zero if an
     C* exception does occur.
     C*
     C                   IF        QUSBAVL > 0
     C                   EVAL      API_NAME = 'QSZCRTPL'
     C                   EXSR      ERRCOD
     C                   ENDIF
     C*
     C* Setup for Product Load for MRI Objects
     C* Fill Product Load Information Parameter
     C*
     C                   EVAL      QSZLT = '*LNG'
     C                   EVAL      QSZLID = '2924'
     C*
     C* Fill Principal Library Information Parameter
     C*
     C                   EVAL      QSZPEP = 'ABCPGMMRI2'
     C*
     C* Fill Preoperation Exit Programs Parameter
     C*
     C                   EVAL      QSZPEP00 = 'ABCPGMMRI1'
     C*
     C* Fill Additional Library List Parameter
     C*       None
     C*
     C* Fill Folder List Parameter
     C*       None
     C*
     C* Let's create the product load for the ABC Product - MRI Objects
     C*
     C                   CALL      'QSZCRTPL'
     C                   PARM      'ABC0029'     PROD_ID_NM
     C                   PARM                    QSZLI
     C                   PARM      'ABC2924'     SEC_LANG
     C                   PARM                    QSZLI00
     C                   PARM                    QSZAL
     C                   PARM                    NBR_ADD_LB
     C                   PARM                    QSZPE
     C                   PARM                    NBR_PE
     C                   PARM                    QSZFL
     C                   PARM                    NBR_FLDRS
     C                   PARM                    TEXT_DESC
     C                   PARM                    PUB_AUT
     C                   PARM                    QUSEC
     C*
     C* If an exception occurs, the API returns the exception in the
     C* error code parameter.  The bytes available field is set to
     C* zero if no exception occurs and greater than zero if an
     C* exception does occur.
     C*
     C                   IF        QUSBAVL > 0
     C                   EVAL      API_NAME = 'QSZCRTPL'
     C                   EXSR      ERRCOD
     C                   ENDIF
     C*
     C                   ENDSR
     C*
     C*****************************************************************
     C*****************************************************************
     C*
     C* Subroutine: COBJD
     C*
     C* Descriptive Name: Change object descriptions for ABC Product.
     C*
     C* Description: This subroutine will change the object
     C*              descriptions for all objects that make up the
     C*              ABC Product.  Currently that is 15 objects.  They
     C*              are listed at the end of this program.
     C*
     C*****************************************************************
     C*****************************************************************
     C*
     C     COBJD         BEGSR
     C*
     C* Need to associate all objects with the ABC Product
     C*
     C     1             DO        15            I                 3 0
     C                   EVAL      OBJ_PTR = %ADDR(OBJ_INFO(I))
     C                   EVAL      OBJNAM = OBJ_NAME + 'ABC'
     C                   EVAL      LP5 = LP_ID
     C                   EVAL      PID13 = PRD_OPT_ID
     C                   EVAL      LID12 = PRD_OPT_LD
     C                   EVAL      TYPE = OBJ_TYPE
     C*
     C                   CALL      'QLICOBJD'
     C                   PARM                    RTN_LIB          10
     C                   PARM                    OBJNAM
     C                   PARM                    TYPE             10
     C                   PARM                    COBJI
     C                   PARM                    QUSEC
     C*
     C* If an exception occurs, the API returns the exception in the
     C* error code parameter.  The bytes available field is set to
     C* zero if no exception occurs and greater than zero if an
     C* exception does occur.
     C*
     C                   IF        QUSBAVL > 0
     C                   EVAL      API_NAME = 'QLICOBJD'
     C                   EXSR      ERRCOD
     C                   ENDIF
     C*
     C                   ENDDO
     C*
     C                   ENDSR
     C*
     C*****************************************************************
     C*****************************************************************
     C*
     C* Subroutine: PKGPO
     C*
     C* Descriptive Name: Package software ABC Product.
     C*
     C* Description: This subroutine will package the ABC Product.
     C*              It makes sure that all objects exist that are
     C*              associated with the product.
     C*
     C*****************************************************************
     C*****************************************************************
     C*
     C     PKGPO         BEGSR
     C*
     C* Setup for packing the ABC Product.
     C* Fill Product Option Information Parameter
     C*
     C                   EVAL      QSZOPT02 = '0000'
     C                   EVAL      QSZPID01 = PROD_ID
     C                   EVAL      QSZRL01 = RLS_LVL
     C                   EVAL      QSZLID00 = '*ALL'
     C                   EVAL      QSZERVED03 = *BLANKS
     C*
     C* Let's package the ABC Product.
     C*
     C*
     C                   CALL      'QSZPKGPO'
     C                   PARM                    QSZPOI
     C                   PARM      '*YES'        REPKG             4
     C                   PARM      '*NO'         ALWCHG            5
     C                   PARM                    QUSEC
     C*
     C* If an exception occurs, the API returns the exception in the
     C* error code parameter.  The bytes available field is set to
     C* zero if no exception occurs and greater than zero if an
     C* exception does occur.
     C*
     C                   IF        QUSBAVL > 0
     C                   EVAL      API_NAME = 'QSZPKGPO'
     C                   EXSR      ERRCOD
     C                   ENDIF
     C*
     C                   ENDSR
     C*
     C*****************************************************************
     C*****************************************************************
     C*
     C* Subroutine: ERROR
     C*
     C* Descriptive Name: Process API errors.
     C*
     C* Description: This subroutine will print a line to a spooled
     C*              file if any errors are returned in the error code
     C*              parameter.
     C*
     C*****************************************************************
     C*****************************************************************
     C*
     C     ERRCOD        BEGSR
     C*
     C* Process errors returned from the API.
     C*
     C* If first error found, then open QPRINT *PRTF
     C*
     C                   IF        FIRST_ERR = '0'
     C                   OPEN      QPRINT
     C                   EVAL      FIRST_ERR = '1'
     C                   ENDIF
     C*
     C* Output the error and the API that received the error
     C*
     C                   EXCEPT    BAD_NEWS
     C*
     C                   ENDSR
     OQPRINT    E            BAD_NEWS       1
     O                                              'Failed in API '
     O                       API_NAME
     O                                              'with error '
     O                       QUSEI
**CTDATA OBJ_INFO
ABCPGMMRM1*PGM      000050010ABCABCV3R1M0
ABCPGMMRM2*PGM      000050010ABCABCV3R1M0
ABCPGMMRI1*PGM      000029240ABCABCV3R1M0
ABCPGMMRI2*PGM      000029240ABCABCV3R1M0
ABCPGM    *PGM      000050010ABCABCV3R1M0
QCLSRC    *FILE     000029240ABCABCV3R1M0
ABCDSPF   *FILE     000029240ABCABCV3R1M0
ABCPF     *FILE     000029240ABCABCV3R1M0
ABCMSG    *MSGF     000029240ABCABCV3R1M0
ABC       *CMD      000029240ABCABCV3R1M0
ABCPNLGRP *PNLGRP   000029240ABCABCV3R1M0
ABC0050   *PRDDFN   000050010ABCABCV3R1M0
ABC0050   *PRDLOD   000050010ABCABCV3R1M0
ABC0029   *PRDLOD   000029240ABCABCV3R1M0
ABC       *LIB      000050010ABCABCV3R1M0