Example of Source Conversion

The example shows a sample RPG III source member which is to be converted to RPG IV. Figure 1 shows the source of the RPG III version.

Figure 1. RPG III Source for TEST1
     H                                                                    TSTPGM
     FFILE1   IF  E                    DISK                               COMM1
     FQSYSPRT O   F     132     OF    LPRINTER
     LQSYSPRT  60FL 56OL
     E                    ARR1    3   3  1               COMM2
     E                    ARR2    3   3  1
     IFORMAT1
     I              OLDNAME                         NAME
     I* DATA STRUCTURE COMMENT
     IDS1         DS
     I                                        1   3 FIELD1
     I* NAMED CONSTANT COMMENT
     I              'XYZ'                 C         CONST1                COMM3
     I                                        4   6 ARR1
     C           ARR1,3    DSPLY
     C                     READ FORMAT1                  01
     C           NAME      DSPLY
     C                     SETON                     LR
     C                     EXCPTOUTPUT
     OQSYSPRT E   01           OUTPUT
     O                         ARR2,3    10
**
123
**
456
To convert this source, enter:
CVTRPGSRC  FROMFILE(MYLIB/QRPGSRC) FROMMBR(TEST1)
           TOFILE(MYLIB/QRPGLESRC) INSRTPL(*YES)

The converted source is shown in Figure 2.

Figure 2. Converted (RPG IV) Source for TEST1
 1 .....H*unctions+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Comments+++++++++
 2      H DFTNAME(TSTPGM)
 3 .....F*ilename++IPEASFRlen+LKlen+AIDevice+.Functions++++++++++++++++++++++++++++Comments+++++++++
 4      FFILE1     IF   E             DISK                                         COMM1
 5      FQSYSPRT   O    F  132        PRINTER OFLIND(*INOF)
 6      F                                     FORMLEN(60)
 7      F                                     FORMOFL(56)
 8 .....D*ame+++++++++++ETDsFrom+++To/L+++IDc.Functions++++++++++++++++++++++++++++Comments+++++++++
 9      D ARR2            S              1    DIM(3) CTDATA PERRCD(3)
10      D* DATA STRUCTURE COMMENT
11      D DS1             DS
12      D  FIELD1                 1      3
13      D  ARR1                   4      6
14      D                                     DIM(3) CTDATA PERRCD(3)              COMM2
15      D* NAMED CONSTANT COMMENT
16      D CONST1          C                   CONST('XYZ')                         COMM3
17 .....I*ilename++SqNORiPos1+NCCPos2+NCCPos3+NCC..................................Comments+++++++++
18 .....I*.............Ext_field+Fmt+SPFrom+To+++DcField+++++++++L1M1FrP1MnZr......Comments+++++++++
19      IFORMAT1
20      I              OLDNAME                     NAME
21 .....C*0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....Comments+++++++++
22      C     ARR1(3)       DSPLY
23      C                   READ      FORMAT1                                01
24      C     NAME          DSPLY
25      C                   SETON                                        LR
26      C                   EXCEPT    OUTPUT
27      OQSYSPRT   E            OUTPUT           01
28      O                       ARR2(3)             10
29 **CTDATA ARR1
30 123
31 **CTDATA ARR2
32 456
Note the following about the converted source:
  • The new specification types are H (control), F (file), D (definition), I (input), C (calculation), and O (output); they must be entered in this order.

    The converted source contains specification templates for the new types, since INSRTPL(*YES) was specified on CVTRPGSRC.

  • The control, file, and definition specifications are keyword-oriented. See lines 2, 4 - 7, and 9 - 16.
  • The ILE member has a new specification type, definition. It is used to define standalone fields, arrays and named constants as well as data structures.
    In this example,
    • ARR2 is defined as a standalone array (Line 9)
    • Data structure DS1 is defined as a data structure with two subfields FIELD1 and ARR1 (Lines 11 - 14)
    • Constant CONST1 is defined as a constant (Line 16)

    The input (I) specifications are now used only to define records and fields of a file. See Lines 19 - 20.

  • The extension (E) specifications have been eliminated. Arrays and tables are now defined using definition specifications.
  • Record address file (RAF) entries on extension specifications have been replaced by the keyword RAFDATA on the File Description specification.
  • The line counter specifications have been eliminated. They have been replaced by the keywords FORMLEN and FORMOFL on the file description specification. See Lines 6 and 7.
  • All specification types have been expanded to allow for 10-character names for fields and files.
  • In RPG IV, data structures (which are defined using definition specifications) must precede the input specifications.

    Note that in the converted source, the data structure DS1 (Line 11) has been moved to precede the specification containing the FORMAT1 information (Line 19).

  • In RPG III, named constants can appear in the middle of a data structure. This is not allowed in RPG IV.

    In the converted source, CONST1 (Line 16) has been moved to follow data structure DS1 (Line 11).

  • If a specification is moved, any comment that precedes it is also moved.

    In the converted source, the comments above CONST1 and DS1 were moved with the following specifications.

  • In RPG III, to define an array as a data structure subfield, you define both the array and a data structure subfield with the same name. This double definition is not allowed in RPG IV. Instead you specify the array attributes when you define the subfields using the new keyword syntax.

    In this example, ARR1 is defined twice in the OPM version, but has been merged into a single definition in converted source. See Lines 13 and 14.

    The merging of RPG III array specifications may result in the reordering of the array definitions. If the reordered arrays are compile-time arrays, then the loading of array data may be affected. To overcome this problem, RPG IV provides a keyword format for the ** records. Following **, you enter one of the keywords FTRANS, ALTSEQ, or CTDATA. If the keyword is CTDATA, you enter the array or table name in positions 10 - 19.

    In this example, the array ARR2 now precedes array ARR1, due to the merging of the two RPG III specifications for ARR2. The Conversion Aid has inserted the keywords and array names in the converted ** records, which ensures the correct loading of the compile-time data. See Lines 29 and 31.

  • Note that array syntax has changed. The notation ARR1,3 in RPG III is ARR1(3) in RPG IV. See line 28.