PMS AS400 Interview Notes
PMS AS400 Interview Notes
Table of Contents:
Basic ............................................................................................................................................................ 13
1. Define library? .................................................................................................................................. 13
2. Define object? .................................................................................................................................... 13
3. What is the difference between OPM, EPM and RPGLE?.......................................................... 14
4. What are the disadvantages of using CL over RPG? .................................................................. 14
5. How you can read and write single command in CL? ............................................................... 14
6. How to retrieve a date in CL? ........................................................................................................ 15
7. How to copy a record in existing object to another object?........................................................ 15
8. How you will avoid multiple users updating the same records? ............................................. 16
9. Explain WRKOBJPDM and DSPOBJD? ........................................................................................ 16
10. How to create RPG, RPGLE, CL, CLLE, PF, LF, PRN, and display file?.............................. 16
11. What are the advantages of using AS/400 system? ................................................................ 17
12. What are the various types of Security in AS/400? ................................................................ 18
13. Explain user profile and group profile? .................................................................................... 19
14. What is Lock? How you achieve in AS/400? ........................................................................... 21
15. How you will release the lock? .................................................................................................. 21
16. Explain about RTNCSRLOC? ..................................................................................................... 21
17. How you execute CL command in RPGLE? ............................................................................ 21
18. What's new in V4R4 and RPG IV? ............................................................................................. 21
19. Can you clear up the confusion in the different releases of RPG IV and OS/400 and ILE?
22
ILE Concepts ........................................................................................................................................... 25
1. Integrated Language Environment (ILE)...................................................................................... 25
2. What is a Module? ........................................................................................................................... 30
3. What is a Service Program? ............................................................................................................ 30
4. What is a binding Directory? .......................................................................................................... 31
5. Why Import and Export? ................................................................................................................ 31
Page 1 of 228
6. What is Activation Group? ............................................................................................................. 31
7. Name Some ILE API’s? And tell something about them?.......................................................... 32
8. What are activation groups? ........................................................................................................... 34
9. How do I create and use a service program ................................................................................. 34
10. Modules - How to write and reuse them .................................................................................. 37
11. What are the ILE RPG coding programming considerations? .............................................. 39
12. What Opcodes are added in ILE? .............................................................................................. 41
13. What are the behavioral differences b/w OPM RPG/400 and ILE? .................................... 41
14. ILE advantages over RPG? ......................................................................................................... 42
15. Define binder program? .............................................................................................................. 42
16. How to the create module? ......................................................................................................... 42
17. What are the differences in CALL, CALLB and CALLP? ...................................................... 44
18. What is the difference between Bind by value and Bind by reference? ............................... 44
19. Define pass by value and pass by reference? ........................................................................... 45
20. What are Program Entry Procedure (PEP) and User Entry Procedure (UEP)? ................... 45
21. Define Copybook in RPGLE? ..................................................................................................... 45
22. How to create a service program and what are the steps involved in this? ........................ 46
23. Explain procedure used in RPGLE? .......................................................................................... 47
Database .................................................................................................................................................... 48
1. Define source physical file? ............................................................................................................ 48
2. Physical Files and Logical File........................................................................................................ 48
3. List the differences between physical file and logical file. ......................................................... 48
4. What are the four levels of entries in physical file? .................................................................... 49
5. What are the six levels of entries in logical file? .......................................................................... 50
6. Explain JDUPSEQ and JDFTVAL. ................................................................................................. 50
7. What are the different between non-join logical files and join logical files. ............................ 51
8. How many record formats can have physical & logical file. ..................................................... 51
9. What is the advantage open query file?........................................................................................ 51
10. Explain non-join logical file? ...................................................................................................... 52
11. It is possible to insert record to JOIN LF? ................................................................................. 53
12. Explain join logical file? .............................................................................................................. 53
Page 2 of 228
13. Explain self join?........................................................................................................................... 59
14. Explain normalization? ............................................................................................................... 62
15. Explain the command ADDPFCST? .......................................................................................... 62
16. How to send the message to the screen SNDPGMMSG? ....................................................... 63
17. How you can list all the LF of a PF? .......................................................................................... 63
18. What is use of DSPFFD and DSPFD? ........................................................................................ 63
19. Explain inner join or natural join and left outer join? ............................................................. 63
20. How to create a trigger in AS/400? ........................................................................................... 68
21. How will be establishing REFERENTIAL INTEGRITY in as/400 systems? ....................... 69
22. What RUNSQLSTM will do? ...................................................................................................... 70
23. What is a field reference file?...................................................................................................... 70
24. What are the various ways creating access path?.................................................................... 71
25. How many record formats PF, LF, DSPF and SFL? ................................................................ 71
26. Define KLIST? ............................................................................................................................... 71
27. Define PLIST? ............................................................................................................................... 71
28. Define composite key?................................................................................................................. 71
29. Is it possible to create a logical file whose Physical file is not in same library? .................. 71
30. Can you delete the record space permanently in PF through CL? ....................................... 72
31. What is the difference between adding keys & constraints into a physical file? ................ 72
32. How to insert more than one record to a pf at a time? (Bulk insert to a pf) ........................ 72
33. How to see number of logical files depending on a pf? Can we declare more than 20
logical files from a single pf? Is it possible? ........................................................................................ 72
34. I want to change the attribute of field or want to add new field in existing PF but
condition is format level identifier should not change, is it possible? ............................................. 72
35. Maximum how many fields we can create under a record format of PF? ........................... 73
36. How can we write LF using flat file?......................................................................................... 73
37. Why we create the Physical File Member? ............................................................................... 74
38. CHGPF to compile the PF without using the data: ................................................................. 74
39. Multi format Logical file Example: ............................................................................................ 74
40. Access Path – PF and LF.............................................................................................................. 75
41. Tell me the differences between DB2 CLI (call Level Interface) and embedded SQL? ...... 76
Page 3 of 228
42. General points in DB2/400 ......................................................................................................... 76
43. File pointer – after a failed chain operation.............................................................................. 83
44. What are Triggers? ....................................................................................................................... 83
45. What is the purpose of USROPN keyword? ............................................................................ 83
46. What is LEVEL CHECK? ............................................................................................................ 83
OVRDBF .................................................................................................................................................... 84
1. What exactly the OVRDBF does?................................................................................................... 84
OPNQRYF ................................................................................................................................................. 85
47. What is the open query file? ....................................................................................................... 85
48. What is the different between OPNQRYF and SQLRPG?...................................................... 85
49. What are the various steps in creating OPNQRYF? ................................................................ 85
50. How the records are accessed for using OPNQRYF? ............................................................. 88
51. What is the difference between FMTDTA and OPNQRYF? .................................................. 88
52. List out the Differences between a LF and command OPNQRYF? ...................................... 89
53. OPNQRYF - Short explanation with samples in CLP ............................................................. 89
54. OPNQRY Example ....................................................................................................................... 95
SQLRPGLE ................................................................................................................................................ 96
55. SQLRPGLE Example ................................................................................................................... 97
56. SQL Cursor:................................................................................................................................... 97
57. Sample imbedded SQLRPGLE program ................................................................................ 100
58. Embedded SQL:.......................................................................................................................... 103
Journal ..................................................................................................................................................... 103
59. What is the journal? ................................................................................................................... 103
60. What are the various steps creating journal? ......................................................................... 104
61. Explain Commitment Control? ................................................................................................ 104
62. Can anybody tell why Journaling is compulsory before Commitment Control? ............. 104
63. Commitment control Implementation and controlling commitment control from external
program. .................................................................................................................................................. 104
Data Areas, Queues, Arrays & Structures: ......................................................................................... 105
1. What is the data area?........................................................................................................................ 105
2. Define LDA, GDA, and PIP? ........................................................................................................ 106
Page 4 of 228
3. What is the data queue? ................................................................................................................ 107
4. Explain QSNDDTAQ and QRCVDTAQ? ................................................................................... 108
5. What are the mandatory parameters for declaring a Data queue? ......................................... 108
6. What is the command to create menu? ....................................................................................... 108
7. What is the difference between CALL and Transfer Control (TFRCTL)?.............................. 108
8. Explain Multi Dimensional Array? ............................................................................................. 108
9. Define data structure and types of data structure? ................................................................... 108
10. How do I declare an array with a dynamic number of elements? ...................................... 111
11. Data structure array basics ........................................................................................................... 112
12. Clear up the confusion over multiple-occurrence data structures ............................................... 112
13. Data area, Data Queue and Message Queue:............................................................................... 113
14. Group Jobs and Group data area: ................................................................................................. 114
15. Data Structure Array and Example: .............................................................................................. 115
16. Difference between Data area and data queue: .......................................................................... 115
17. Difference between data-structure array and multi occurrence data structure.......................... 116
18. RPG data structure arrays improvement over multiple-occurrence data structures ................... 116
19. Compile time array, pre run time array run time array ................................................................ 116
20. RNF7701 data structure not allowed ............................................................................................ 117
DEBUG................................................................................................................................................ 117
1. How to Debug a Batch ILE RPG? ....................................................................................................... 117
2. Debug value of pointer? ................................................................................................................... 118
3. How do I debug ILE programs? STRISDB doesn't work!.................................................................... 118
4. How can I debug an ILE program in batch? ...................................................................................... 119
5. How can I debug an OPM program in batch? ................................................................................... 120
6. How can I tell if my program is running in batch or interactive?...................................................... 121
7. How to debug jobs in MSGW without ending it? ............................................................................. 123
8. How do you do debugs for ILE programs and Handle Exceptions? .................................................. 124
Programming Concepts......................................................................................................................... 124
1. General RPG IV Program Cycle .......................................................................................................... 124
2. What are Static bind and Dynamic binds? ........................................................................................ 126
3. CRTBNDRPG & CRTRPGPGM ............................................................................................................. 126
Page 5 of 228
4. Hidden Fields:.................................................................................................................................... 126
5. Last statement of any RPG pgm is LR? .............................................................................................. 126
6. Is Constant can be define as a key field? .......................................................................................... 127
7. Which keyword is used both in subfile and subfile control record format of a DSPF? .................... 127
8. Define interactive jobs and batch jobs?............................................................................................ 127
9. WHAT IS THE DIFFERENCE BETWEEN 'COLHDG' AND 'ALIAS'? ......................................................... 127
10. What's the difference between CONST and VALUE?.................................................................... 128
11. CL – EOF: ....................................................................................................................................... 128
12. Level Check Error: ......................................................................................................................... 128
13. Significance of Return and *INLR = *ON. ...................................................................................... 128
14. *Entry – significance of factor 1, factor 2 and result fields..................................................... 129
15. EDTCDE & EDTWRD, OVERLAY, RSTDSP, Command Attention key and Command Function Key
and Validity check: .................................................................................................................................... 129
16. What is the difference between CA and CF keys? ........................................................................ 129
17. What is PSDS? ............................................................................................................................... 129
18. What is the file information data structure? ................................................................................ 132
19. CL Parameter Basics ...................................................................................................................... 139
20. Calling program TSTCALL code:..................................................................................................... 144
21. Display Program References (DSPPGMREF).................................................................................. 145
22. Difference between *Omit and *no pass: .................................................................................... 147
23. What do we mean by externalizing? ............................................................................................ 148
24. What will FOR opcode will do? ..................................................................................................... 148
25. What are the various stages for a job after it is submitted? ........................................................ 150
26. What is an activation group? ........................................................................................................ 150
27. What are the statements that are affected by activation group? ................................................ 150
28. How to see source of copybooks include in a program while compiling or debugging? ............. 150
29. Explain keyword in ILE?................................................................................................................. 150
30. How you can schedule a job to run periodically? ......................................................................... 151
31. How you can import and export a data type between 2 programs?............................................ 151
32. Navigation between two screens ................................................................................................. 151
33. Define indicator & MOVEA?.......................................................................................................... 152
Page 6 of 228
34. Define ITER / LEAVE/DO/Dow? ..................................................................................................... 152
35. Explain Assume and Overlay? ....................................................................................................... 152
36. Why externalize? .......................................................................................................................... 152
37. What is the disadvantage of using Validity Check keyword? How to overcome these
disadvantages? ....................................................................................................................................... 153
38. Chain: ....................................................................................................................................... 153
39. Which of the following operations does NOT zero the field FLDA defined as 4,0? ........ 153
40. How can you check for a records existence without causing and I/O (CHAIN/READ)?
With the help of File Information Data Structure, we can check existence of records in a physical
file. The code is described below: ........................................................................................................ 153
41. What is the difference between UDATE and the system date? ........................................... 154
42. Describe the difference between the DOWxx and DOUxx operations? ............................ 154
43. Define the purpose of the ITER operation?............................................................................ 154
44. List the steps/commands necessary to accomplish the following: ..................................... 154
45. What is the purpose of the following? .................................................................................... 154
FORDHDR1 IF E K DISK ORDHDRF KRENAMEORDHDRF1 ..................................................... 154
In order to rename the record format of a data base file in a program, we can use the
above steps. Purpose of renaming is: If the record format name is similar in two files
and if both are used in a same program, the program will not compile. Hence we have
to rename either of the file. ............................................................................................................. 154
46. What is the purpose of the following C/COPY QRPGSRC,ORDERR ............................... 154
47. What is the purpose of the following? A CSRLOC (F1ROW F1COL) ................................ 155
48. What is the difference between SFLCLR and SFLINZ? .............................................................. 155
50. How can you detect and handle a record lock situation? .............................................................. 155
51. How can you detect overflow for a print program that prints multiple lines per cycle? ............... 155
52. How would you design the process for a nightly, high volume check producing process that needs
to select only records that are flagged to be processed? ........................................................................... 155
53. How would you join 3 separate fields, a first name, middle initial and last name together
as 1 field with proper spacing? You can describe in either RPG and/or RPG ILE (Integrated
Language Environment) ....................................................................................................................... 155
Page 7 of 228
54. When PGMA calls PGMB for the first time PGMB executes the *INZSR. PGMB uses the
RETRN operation to return to PGMA. When PGMA call PGMB the second time is the *INZSR
executed? ................................................................................................................................................. 156
55. Show 2 ways to convert a date from YYMMDD to MMDDYY (MULT operation not
acceptable) ............................................................................................................................................... 156
57. Define the purpose of Factor 1 the Operation Code and *IN15 in following code HI LO EQ C
*YMD Test(D) yymmddDate 15 .............................................................................................................. 156
58. Describe the function of SETLL operation in RPG language? ............................................. 157
59. Describe the function of SETGT operation in RPG language? ............................................ 157
74. List and explain the different type of data structures? .................................................................. 158
76. What is the difference between access path and Dynamic select? ................................................ 159
77. Why would you prefer OPNQRYF than logical file? ................................................................... 159
78. What is the difference between Packed decimal and Zoned decimal? ......................................... 159
79. What is default data type (if you define decimals '0') in Physical file? ........................................ 159
Page 8 of 228
80. What is default data type for the fields(sub fields) defined in data structures in RPG? ............... 159
81. When do you explicitly open files and close files in an RPG program? ....................................... 159
83. What is Job, What are the attributes of a Job? .............................................................................. 160
86. How can a data area be locked after being updated? .................................................................... 160
92. Can more than one subfile record be displayed on one line? ........................................................ 160
93. How do you specify the number of records to roll in a subfile? ................................................... 161
94. How will you display a particular page in subfile? ....................................................................... 161
95. How to pick up the changed records every time in a subfile after the first change made? ........... 161
97. How to toggle between single line and Multi - line display of a particular record in a subfile? .. 161
98. Explain the difference between defining Subfile and Message-subfile? ...................................... 161
99. What are the different types of variables available in CL? ........................................................... 161
102. What are the different types of messages in CL? ...................................................................... 161
104. What is the maximum length of a variable name in CL? .......................................................... 162
Page 9 of 228
107. When will DUMP and DEBUG opcodes be ignored? .............................................................. 162
112. In which specification the report layout can be defined? .......................................................... 162
114. How many printer files can be defined in F specs? .................................................................. 162
116. How do you specify page overflow indicator for printer files in RPG? ................................... 163
118. Can an indexed file be accessed in arrival sequence in RPG program? ................................... 163
121. Can you specify a display file to be used in the following modes Input, Output, or Combined
modes? 163
123. What are all the compiler directive statements? ....................................................................... 163
124. During execution, an RPG/400 program automatically follows a sequence of operations for
each record that is processed. The built-in program cycle includes the following logical steps. ............. 163
125. What are the different Opcodes available in RPG for Database access? .................................. 163
129. What are the uses of FACTOR1, FACTOR2 and RESULT field for the RPG
operation code PARM?........................................................................................................................ 164
130. How will you find a string using PDM? ................................................................................. 164
Page 10 of 228
131. How do you read changed records backward in subfile? .................................................... 164
Both are same only difference is DFU allows you to add or change selected fields....... 164
133. What is the syntax for PLIST? .................................................................................................. 164
*ENTRY PLIST PARM ........................................................................................................................... 164
134. Which are the String Manipulation Opcodes? ....................................................................... 164
Page 11 of 228
7. Define indicator in CL? ................................................................................................................. 195
8. Message subfile in CL .................................................................................................................... 196
9. CL processing commands & program control commands? ..................................................... 196
10. How to CL code has to change to use a call procedure? ...................................................... 196
11. What are various steps accessing data area in CL? ............................................................... 196
12. What is the equivalent command to setll *loval in CL? ......................................................... 196
13. Various types of message available in CL. ............................................................................. 196
14. What will MONMSG command in do? .................................................................................. 198
15. What are the statements, which is not used in CLLE that is used in CLP? ....................... 199
16. How to create user define command?..................................................................................... 199
17. Info ............................................................................................................................................... 200
18. What's the difference between CHAIN and SETLL? Is there a performance advantage?
200
19. How do I debug a remote (i.e. "batch") job from an interactive job? .................................. 201
20. What is the new E operation extender used for? ................................................................... 203
21. Why doesn't the %CHAR built-in function work with numeric values?........................... 204
22. How does the CONST keyword work with Procedure parameters? ................................. 204
Built-in Functions ................................................................................................................................... 205
1. RPG IV - Built-in Functions .......................................................................................................... 205
2. Figurative constants in RPGLE .................................................................................................... 213
3. Explain ADDDUR, SUBDUR, EXTRCT and TEST? .................................................................. 213
4. Explain Compile time array, lookup, sort-a, x-foot, and Run time array? ............................ 219
5. What is the different between READE and CHAIN Opcodes? ............................................... 223
6. Explain Build in function in ILE? ................................................................................................. 223
@ References: ........................................................................................................................................... 227
Page 12 of 228
Basic
1. Define library?
A Library is a collection of objects.
Type *LIB that is used to group related object and to find objects by name.
A library is a directory to a group of objects.
The number of objects contained in a library and the number of libraries on the
system are limited only by the amount of storage available.
All libraries are placed in the system library QSYS.
Libraries provide a method for organizing objects.
A library is an open-ended directory.
A library can never become ‘FULL’ as if has no finite size.
Libraries themselves are objects.
A library contain the object name, type, and the address
Library list
System library- 15 (QSYSLIB)
QSYS
QHLPSYS
QUSRSYS
Product library –2
Current library –1
User library - 25 (QUSRLIB)
QGPL
QTEMP
MYLIB
When you logon the first library to be load is QSYS. The system library is loaded
at the first time.
2. Define object?
Everything that can be stored or retrieved on the system is known as an
“OBJECT”.
Objects exit to make users independent of the implementation used in the
machine.
The create object instruction establish the object’s name and its type.
All objects are structured with a common object header, and a type dependent
functional portion.
A user is not concerned with the space his object occupies.
The system allocate space automatically
WRKOBJPDM is used to display all object in such a library
The library the object name and its type is Unique.
Page 13 of 228
3. What is the difference between OPM, EPM and RPGLE?
We can able to read only records but we cannot able to write or update or delete
records.
We can have only one file to be used in a CL program
We cannot able to use printer files in CL
We cannot able to use subfile in a CL program
SKANDASAMO/CLP
ADD
0001.00 PGM
0006.00 ENDPGM
Page 14 of 228
****************** End of data **********************************
OUTPUT
FIRST NUMBER: 12
SECOND NUMBER: 12
----------
RESULT= 0000024
----------
CPYF take F4
Lib-name :SKANDASAMO
Lib-name :SKANDASAMO
:*FIRST
Replace :*ADD
:*NO
:*CHAR
Sql command :
FILED EMPNO
CONDITION *GT
Page 15 of 228
VALUE 40
8. How you will avoid multiple users updating the same records?
The displaying the records in the screen we will be getting the timestamp along
with the actual data. Store this in output data structure and while updating check whether
the previous time stamp is the same timestamp before updating. If the record is updated by
another user than the time stamp will be changed and if it does not matches then throw the
error message ‘Record is already updated by another user’ else update the records with
current time stamp.
Program 1
Store the time stamp and this time stamp will come as an input to the second program
Program2
Here wstmst1 contains the input time stamp and check this matches with the
database. If matches update else send error message.
WRKOBJPDM
If we want to list all the source PF or files of particular type the WRKOBJPDM
with file type as PF-SRC for source PF IOR *file for listing all the files extra can be
given.
DSPOBJD
If we know library name and object name and we want to know the source PF
where it is residing then DSPOBJD with option as *services instead of basic will
give the source PF name.
10. How to create RPG, RPGLE, CL, CLLE, PF, LF, PRN, and display file?
Page 16 of 228
PRN - by using CRTPRTF command
DSPF -by using CRTDSPF command
Page 17 of 228
12. What are the various types of Security in AS/400?
AS/400 is designed for business that requires levels of security ranging from
nothing at all to full government certifiable security. By setting a system value, we can
configure five increasing level of security.
No security
Password security
Resource security
OS security
Certifiable security
When AS/400 is configured, three system values dealing with security need to be
specified. These values are QAUDJRL, QMAXSIGN & QSECURITY.
QSECURITY:
This system value determines the level of security enforcement. S/38 and the
original AS/400 only had three of system security. At VIR3 of OS/400 the fourth level of
security was added, and the fifth level of security was added at V2R3. The valid values
for QSECURITY are 10,20,30,40,50.
QMAXSIGN:
This system value determines the maximum number of sign on attempts
allowed. If the number of unsuccessful attempts to sign on to the system exceeds this
number, the terminal or device that attempted the sign on is varied off.
QAUDJRL:
AS/400 supports an optional security auditing function. If this function is
specified, certain security events are journal. The specific events that are logged in the
security audit journal are determined by the value specified in the QAUDJRL system
value and the level of system security specified.
Page 18 of 228
Level 30: Resource security
Password security is active and user must specify given authority to
resources. This level is recommended because the system doesn’t give the user authority
to access the entire object on the system after the user sign on.
User class
When identifying a user on the system you can specify the user class in the
user profile. AS/400 has five user classes that determine the level of system’s access
a user is permitted. The five user classes, starting the highest level of access, are
Page 19 of 228
Security officer (*SECOFR)
Security administrator (*SECADM)
Programmer (*PGMR)
System operator (*SYSOPR)
User (*USER)
Authorization of objects
Object authority, or the right to user to use or control an object comes in two
categories.
Object rights
Data rights
Object rights
Object rights are concerned with the object itself.
Object rights assign a user the following authority
Operational rights (*OPER)
Object management rights (*OBJMGT)
Object existence rights (*OBJEXT)
Operational right (*OPER)
The authority to use an object, looks at its description, and restores it. A
user must have operational rights to a program to execute it.
Object management rights (*OBJMGT)
The authority to grant and revoke and user rights move and rename
object, and members to database file.
Object existence rights (*OBJEXT)
The authority to delete, free storage, save restore or transfer ownership of
an object.
Data rights
Data rights apply to the data contained within the object.
Types of data rights
Read (*READ)
The authority is to retrieve the contents of an object entry.
Add (*ADD)
The authority is to add entries to an object. For example adding records to
a database file requires ADD right for the library.
Update (*UPD)
The authority to change the entries in an object requires UPD right for the
file.
Page 20 of 228
Delete (*DLT)
The authority is to remove object in an object. For example deleting a
program from a library requires DLT right for the library. Deleting records for a
database that requires DLT rights the database file.
By using RCLRSC [Reclaim Resource] command we can release the resources only.
UNLOCK or CHAIN (N) command also helps to release the lock.
By using WRKOBJLCK command and take F4.
16. Explain about RTNCSRLOC?
Type Y (Yes) in the Select parameters prompts to define parameters for the
RTNCSRLOC keyword on the Define Return Cursor Location display.
The %CHAR built-in function has been fixed. It now functions like it was
supposed to in the first place. You can wrap a numeric value in %CHAR and a nicely
edited character form of the number is returned. The edited form includes the decimal,
trimmed off leading blanks, and a negative sign.
Page 21 of 228
The FOR loop provide free format version of DO operation code. With the FOR
operation, you can begin a loop operation and continue iterating through the loop until
a variable equals a limit value. The syntax for the FOR operation is enhanced with the
TO, BY and DOWNTO keywords. The TO operation indicators the upper limit for the
looping, while the BY keyword identifies the increment value for the loop counter.
Alternatively, you can specify the DOWNTO keyword to loop backwards from a large
value to a small value.
The OPENOPT keyword is added to the Header specification. This keyword can
be used along with its one and only keyword *INZOFL to cause overflow indicators to
be set off when their corresponding printer file is closed and then re-opened during the
program.
19. Can you clear up the confusion in the different releases of RPG IV and OS/400 and
ILE?
RPG IV is the next generation of the RPG language. RPG III is the original version of
AS/400 RPG/400. The name "AS/400 RPG/400" is that given to the IBM compiler package for
distribution on the AS/400. This compiler package compiles various versions of RPG, including
RPGII and at least two releases of RPGIII.As of OS/400 Version 3 release 1, IBM changed the
name of this compiler package to "AS/400 ILE RPG/400". The reason for this name change was
to identify that fact that the compile now includes a version of RPG that targets the Integrated
Language Environment (ILE), which is RPG IV.ILE was first shipped in OS/400 Version 2,
Release 3. However, only the C language compiler produced code that targeted this
environment.
First, a word about ILE, ILE is the new, "native" runtime environment for Programs, on
the AS/400. Under OS/400 Version 2 Release 3, IBM introduced a new program model. This
basically means that new features and interfaces became available. However, IBM did not just
port some runtime environment to the OS/400 operating system, it actually re-wrote code, and
wrote new code that, essentially, changed the way OS/400 works. This new code provides
support for a mixed set of high-level languages. Previously, RPG and CL had their own little
runtime environment, COBOL had its own; C had its own, and so on. Under ILE, all
programming languages run in ILE. The same "environment" is used for COBOL, C, RPG and
CL. However, to take advantage of ILE, new compilers needed to be created. As for RPG, rather
than convert the existing RPGII and RPGIII compilers, IBM, who was designing a new version
of RPG anyway, decided to target ILE with the new compiler. This would simultaneously
provide a new version of RPG and an ILE targeted compiler.
Page 22 of 228
Names Are Important
A good friend of mine once said, "Names are important" in the programming world. If a
field is called "Rhinoceros", does it represent its use or purpose? Okay, so perhaps in traditional
RPG "Iguana" is a better choice for this example. (Shorter name) During the development of
RPG IV, two distinct issues arose. First, the internal name for RPG IV was "ILE RPG". This was
not a code name, but rather the name IBM used to refer to the new compiler. After all, it was
targeting ILE; why not refer to it as "ILE RPG"? Second, the re-architecture of RPG came into
question. Unfortunately, the internal name "ILE RPG" began to be leaked out to the public.
Several magazine writers and IBMers not involved in the development of RPG IV continued to
use the term "ILE RPG" when referring to RPG IV. I suppose these people still refer to the
AS/400 as SilverLake or perhaps even Olympic.
Then when IBM announced the compiler package or product name as "AS/400 ILE
RPG/400" it only added to the confusion. IBM dropped the ball when promoting the RPG IV
name. They are, after all, set up to market their products with their product names. The name of
one programming language included in a product that contains nearly seven full compilers isn't
high priority.
RPG IV is the version of RPG that targets ILE. OS/400 V3R1 compatible RPG IV can also
target what is now called "the original program model" or simply OPM. OPM is just a name that
has been given to the original runtime environment of RPG and CL under OS/400. This is the
environment in which RPGIII and CL run. Under ILE, however, the original native environment
is emulated, that is, ILE isn't an environment at all, it is native OS/400, whereas, OPM is now an
environment under ILE. Some very clever programming and design went into this, don't you
think? Not very many other operating systems, if any, provide this kind of continuity.
RPG IV was first shipped with OS/400 Version 3, Release 1. This is now referred to as
RPG IV release 1. But don't worry about remembering releases of RPG IV. Under OS/400
Version 3, Release 6, IBM enhanced RPG with procedures, many more built-in functions, and
several new data types. This is referred to as RPG IV release 2. Then, OS/400 Version 3, Release
2 was announced. It brought the original release of RPG IV (on the CISC boxes) up to the same
level as RPG IV under V3R6. Are you confused yet? Me too! Under OS/400 Version 3, Release
7, IBM added a couple of enhancements, most notably they increased the length of a field name
to a number so large not even magazine authors that don't write real-world code could
complain about it anymore. They also added one or two new data types, rounding out RPG IV
so that it supports all AS/400 data types, except variable length fields. This version of RPG IV is
known as RPG IV Release 3.
The following table identifies the current releases of RPG IV. Note that RPG IV releases
do not necessarily coincide with releases of the operating system.
Page 23 of 228
RPG IV OS/400 Version/Release CISC or RISC
Release
1 V3 R1 CISC
2 V3 R6 RISC
2 V3 R2 CISC
3 V3 R7 RISC
4 V4 R2 RISC
4 V3 R5 (speculation) CISC
See note 1
5 V4 R3 RISC
NOTE 1: It is speculated that IBM may ship a final "clean up" release of OS/400 for CISC that
would included a large level of compatibility with OS/400 V4 R5.
The release levels of RPG IV are only important if you want to keep track of that kind of
thing. One disappointing issue is that unless you stay on the most current release of OS/400,
you don't get all the cool new features in RPG IV. Even if you stay current, you can't target prior
releases if you use any of the new features. In fact, even if you use a new feature that doesn't
depend on an operating system enhancement, it can't be used for back releases. This is because
of the way the TGTRLS (target release) feature has been implemented. Basically, if you're on V4
R2 and you do a TGTRLS(V3R2M0) the compiler calls the actual compiler for V3 R2. It doesn't
have a built-in syntax checker that says "This feature requires an OS/400 upgrade so don't allow
it, or this one is okay so accept it." It is calling the same "binary" compiler code that is on any old
V3 R2 system. This means, for example, that if you want to take advantage of the new compiler
directives, but you often have to target a prior release, you can’t use those directives. For
Page 24 of 228
example, /IF DEFINED does nothing for the executable code that's generated, but is not
supported when TGTRLS(V3R2M0) is specified. ;( Bummer!)
So now we know about RPG IV release levels and how the term "ILE RPG" got into our
vocabulary. So let's clear up another term, the name of the RPG language. The big one is the
term "RPG/400". There is not programming language called "RPG/400". The language most
often called "RPG/400" is RPGIII. However, back in the System/38 days, the System/38 RPG
language was called RPGIII. When the AS/400 was announced, programmers wanted to give
themselves an advantage on their résumé. So they began calling AS/400 RPGIII, "RPG/400".
Then to make matter worse, when RPG IV was announced, programmers thought that the
number "IV" in "RPG IV" was less than the "400" in "RPG/400". So they decided to call RPG IV,
"ILE RPG". Well let's set the record straight. The table below lists the RPG language names, their
incorrect name, and the proper name.
ILE Concepts
ILE is an architectural change to language compilers and the runtime characteristics of AS/400
programs. It is an extension to the architecture which means that your existing programs
continue to run without changing and recompiling. ILE is available with Version 2 Release 3 of
OS/400.
Integrated Language Environment is tightly integrated into the Operating System/400. The key
benefits for the new ILE environment are:
Page 25 of 228
• Language Integration: Application programs are developed using the language mix best
suited to perform each required function.
• Reusability: Code from supported languages is divided into smaller, reusable, more logical
modules that compile faster and require less maintenance over their life.
• Performance: Capability is provided to optimize code in compute-intensive applications
and to reduce the time to perform inter-program calls.
Integrated Language Environment increases developer productivity by providing the capability
to divide code into smaller, more logical units that compile faster.
The system binder combines the compiled modules to create the application program. In
addition, the separation of compilation and bind steps provides more flexibility packaging the
application.
The new source level debug tool that supports the ILE languages provides enhanced capability
over the system debugger with the new feature to debug at the source or listing level of the
program. Step, breakpoint, and conditional breakpoint functions have been provided.
Expressions are entered and evaluated using the syntax of the programming language being
debugged. The current system debug facility remains unchanged for programs developed
outside ILE.
ILE offers numerous benefits not found on previous releases of the AS/400 system. These
benefits include:
In addition, ILE offers common run-time routines used by the ILE-conforming languages.
Many of the application program interfaces (APIs) are also provided as bind able (service)
programs. This allows your applications to use APIs and to get faster ILE call performance.
These off-the-shelf components provide such services as:
Date manipulation
Message handling
Math routines
Activation Groups
Page 26 of 228
Service Programs
An ILE compiler does not produce a program that can be run. Instead, it produces a module
object (*MODULE) that can be combined, or bound, with other modules to form a single run
able unit, or program. ILE programs are called just as you call programs in your current
applications.
A benefit of this binding process is that it helps to reduce the overhead associated with calling
programs by reducing the number of external calls.
Before ILE, only dynamic (or external) program calls were available to the application
programmer. With ILE, two kinds of calls are available:
The performance of dynamic calls in ILE programs is fairly close to existing call performance.
However, bound calls offer better performance than dynamic calls. Thus, the binding capability
and the improved call performance that results may encourage you to develop your
applications with a more modular design.
2. Modularity
• Faster compilation because the units of code to compile are smaller (Especially
recompiling during development).
• Better programmer work load distribution.
• Opportunities to both purchase and sell individual modules of code.
• Increased reusability: Modules written for a specific function can be bound into several
program objects.
• Simplified maintenance: Maintenance may be required in only a single module.
3. Multiple-Language Integration
With your current application, you can mix different language programs, such as RPG, COBOL,
and C. However, to access code written in another language, your current application must
perform a dynamic call to a separate program. The performance cost of the dynamic call to a
program and the inconsistencies between language behaviors sometimes complicate the mixing
of languages.
With ILE, modules written in any ILE language can be bound to modules written in the same or
any other ILE language. For example, a module of code written in ILE C/400 (perhaps a
floating-point calculation) can be bound with modules written in ILE RPG/400, ILE
COBOL/400, ILE C/400, or ILE CL.
Page 27 of 228
This produces a better performing, and more easily managed application. In addition, you can
acquire modules written in a variety of languages, without needing to produce the code
yourself. The APIs that IBM provides for ILE are just the beginning. Vendors have more
freedom to sell (and application programmers to buy) libraries of routines for any commonly
used function, such as tax calculations. They can be written in any language and can be bound
for better performance.
The ILE compilers have some significant new function included as part of the language. This is
particularly true for ILE RPG/400, which is based on the RPG IV language definition. Many
long-standing requests from RPG programmers have been addressed in the ILE RPG/400
compiler, including the following:
For many programmers, the primary motivation for moving to ILE is to get access to the
function that ILE language support provides.
5. Reusable components
ILE allows you to select packages of routines that can be blended into your own programs.
Routines written in any ILE language can be used by all AS/400 ILE compiler users. The fact
that programmers can write in the language of their choice ensures you the widest possible
selection of routines.
The same mechanisms that IBM and other vendors use to deliver these packages to you are
available for you to use in your own applications. Your installation can develop its own set of
standard routines, and do so in any language it chooses.
Not only can you use off-the-shelf routines in your own applications. You can also develop
routines in the ILE language of your choice and market them to users of any ILE language.
ILE allows you to use better control over your application and the resources it uses. You can
specify that a given ILE program run in a particular area within a job. This area within a job is
called an activation group. You can assign a name to the activation group within the job. Then,
ILE programs and service programs can be created to use the named activation group. Thus,
you can use activation groups to set up logical boundaries within the job to separate the
applications.
Page 28 of 228
Within these boundaries, an activation group has exclusive use of the resource, such as open
data paths for the files used in the application.
Using activation groups to isolate applications can also make it easier to end an application in a
job. It aids in cleaning up its resources (such as open files and active programs) without
disturbing resources associated with other applications active in the job. RPG programmers
might think of this technique as a kind of application-level LR indicator. For example, it is a
way to end an entire application rather than ending one program at a time.
7. Code Optimization
The new ILE compilers and the associated OS/400 translator have more advanced optimization
techniques built into them. In some cases, these new levels of optimization may lead to
improved performance of existing code. At compilation time, the programmer can select the
desired level of optimization for each piece of code.
8. Tool Availability
The majority of tools for developers in the computer industry today are written in the C
language. With ILE binding capability and improved optimization, these C language
applications run faster. In addition, they perform better than they did with the previous C/400
compiler.
Therefore, we anticipate that many tool vendors will begin to add their tools to the AS/400 to
attract a new marketplace for their products.
In addition to the increased opportunity to optimize your applications with the current ILE
compilers, you can look forward to even more significant enhancements. The move toward
object-oriented programming languages and visual programming tools increases the need for
the capabilities provided by ILE.
2. A sub procedure is a procedure specified after the main source section. It can only be called
using a bound call. Sub procedures differ from main procedures in several respects, the main
difference being that sub procedures do not (and cannot) use the RPG cycle while running.
Page 29 of 228
3. A module object is a non runable object that is the output of an ILE compiler. A module
object is represented to the system by the symbol *MODULE. A module object is the basic
building block for creating run able ILE objects.
4. All ILE programs and service programs are activated within a substructure of a job called an
activation group. This substructure contains the resources necessary to run the programs.
5. A service program is a collection of runable procedures and available data items easily and
directly accessible by other ILE programs or service programs. In many respects, a service
program is similar to a subroutine library or procedure library.
Service programs provide common services that other ILE objects may need; hence the name
service program. An example of set of service programs pro-vided by OS/400 is the run-time
procedures for a language. These run-time procedures often include such items as mathematical
procedures and common input/output procedures.
6. A binding directory contains the names of modules and service programs that you may need
when creating an ILE program or service program. Modules or service programs listed in a
binding directory are used only if they provide an export that can satisfy any currently
unresolved import requests. A binding directory is a system object that is identified to the
system by the symbol *BNDDIR.
2. What is a Module?
Modules are objects of *MODULE type that are created by the compiler when the create
RPG Module (CRTRPGMOD) command is performed. A module can be composed of a
main procedure (also referred to as main program) and/or one or more sub procedures.
The term “procedure” often designates a sub procedure or a main procedure. A module is
sometimes called “compilation unit” as it comes from compilation of one source member.
Modules are not executable; they only serve as building blocks for program creation.
The process of program creation is called binding. Bound programs are executable objects
of *PGM type. To bind modules into a program, the Create Program (CRTPGM) command
is used. If an RPG IV program does not call sub procedures, or external modules, the Create
Bound RPG Program (CRTBNDRPG) command will do for both compilation and binding.
This is the case, for example, of an RPG IV program resulting from converting an RPG III
program by the CVTRPGSRC command.
A module is a non-executable program and it contains one or more procedures. If you have
modules without procedure then it means that it is having only one default procedure and
in case we can use CALLB. We are creating a RPGLE module by CRTRPGMOD and a CL
module by CRTCLMOD commands.
If you have procedures that are called by more than one program, you could bind them
individually to each of the programs. In such a case, they would occupy space in each
Page 30 of 228
program and would be difficult to maintain. If you group the procedures in a service
program instead, the procedures occur only once and can be easily maintained. Service
programs are objects of *SRVPGM type which are created by the Create Service Program
(CRTSRVPGM) command. A service program is simply a collection of modules especially
those containing sub procedures.
Service programs cannot be directly called; however, the procedures contained in it may be
called by ILE programs.
Service programs are built by binding, much like programs, but they need to be further
bound to a program before they are used. This is done by the CRTPGM command. Service
programs can also be bound to other service programs. The top service program in such a
group is eventually bound to a program using the CRTPGM command.
Binding directories are objects of *BNDDIR type. Binding directories can be used as an
additional source of exports. A binding directory contains a list of modules and service
programs that are candidates for automatic binding. Not all items of the list in the binding
directory are necessarily bound. Only those required by imports that cannot otherwise be
resolved are bound. Modules and service programs listed in a binding directory often contain
standard procedures, for example mathematical functions or other system procedures. We can
create our own binding directories using special CL command CRTBNDDIR.
A service program makes its own modules and procedures available to external users through a
mechanism called export. The external users are modules and sub procedures in external
programs and other service programs that use (call) the modules and sub procedures of the
service program to call them. The external users are also called “public” or “clients”.
Main procedures of modules comprising the service program are exported automatically
(implicitly), the programmer do not need to use any special specifications to make a main
procedure available to external users. A service program exports its own sub procedures by
specifying the EXPORT keyword in the sub procedure definition. However, in order to bring
this specification in effect, the binding command (CRTSRVPGM) specifies which of the
exported procedures are actually made available to external users. Besides modules and sub
procedures, variables may be exported (by specifying the EXPORT keyword). Exported
modules, sub procedures and variables are collectively called exports. Exports are used in other
procedures where they are referred to. The references are also called imports as opposed to the
exports that are sometimes called definitions.
Page 31 of 228
Activation groups are temporary storage structures placed inside jobs (which themselves are
also temporary structures). There are three types of activation groups:
• Default
• named
• New
Default activation groups exist automatically and are never deleted. There are two default
activation groups. Many system programs run in the default activation group 1. RPG IV
programs created with the parameter DFTACTGRP(*YES) of the CRTBNDRPG command run
in the default activation group.
The other types of activation groups are specified by the parameter ACTGRP in program and
service program creation commands - CRTPGM and CRTSRVPGM. Thus, the type of an
activation group is determined by the program or service program at creation time.
An activation group is created when the program is started. An activation group may include:
The variables types of programs running in the activation group: Static variables are those
defined in a main procedure. They come from external sources such as DDS or SQL
specifications, or they are defined as RPG variables (fields, indicators). One more place you will
find static variables is as local variables in sub procedures declared with the STATIC keyword.
Automatic variables are local variables defined in sub procedures.
ODP are temporary objects representing open files to programs. Data buffer and pointer to a
record are part of the ODP.
System or user programs (modules) handling error messages. Programmers can write their own
modules to handle error messages coming from any procedure in the call stack, no matter in
which programming language the procedure is written. Notice that the “program stack” has
been renamed to “call stack”.
The List Module Information (QBNLMODI) API lists information about modules. The
information is placed in a user space specified by you. This API is similar to the Display Module
(DSPMOD) command. You can use the QBNLMODI API to:
Page 32 of 228
• List the symbols that are defined external to the module
• List objects that are referenced when the module is bound into an ILE program or service
program
2. The List Service Program Information (QBNLSPGM) API gives information about service
programs, similar to the Display Service Program (DSPSRVPGM) command. The information is
placed in a user space specified by you. You can use the QBNLSPGM API to:
• List data item imports that are resolved by weak exports that were exported to the activation
group
3. The List ILE Program Information (QBNLPGMI) API gives information about ILE programs,
similar to the Display Program (DSPPGM) command. The information is placed in a user space
specified by you. You can use the QBNLPGMI API to:
• List data item imports that are resolved by weak exports that were exported to the activation
group
You can, for example, list signatures of service programs bound in a program using the
QBNLSPGM API to get the "old" signatures. You can also list all "new" signatures of these
service programs using the QBNLPGMI API and compare the two lists if they match. If there is
some mismatch, you can trigger a new binding of the program (by performing the CRTPGM
command). Be prepared to inspect lists of lists in some cases because the information retrieved
by these APIs is organized hierarchically.
Page 33 of 228
8. What are activation groups?
Activation group is the environment where the ILE jobs are executed. You can specify the
activation group in CRTPGM or CRTSRVPGM command.
You cannot create the activation group by command CRTACTGRP.
*ENTMOD: The program entry procedure module (ENTMOD parameter) is checked. If the
module attribute is RPGLE, CBLLE, or CLLE, then ACTGRP is QILE or QILETS.QILE is used
when STGMDL (*SNGLVL) is specified, and QILETS is used when STGMDL (*TERASPACE) is
specified.
*NEW : When the program gets called, a new activation group is created.
*CALLER: When the program gets called, the program is activated into the caller's activation
group.
Name : Specify the name of the activation group to be used when this program is called.
A small sample service program, with source, and instructions for how to create and use it is
given here.
a. Create the 6 source members below, changing MYLIB to your library name in the entire
source.
b. Use CRTRPGMOD to create the two srvpgm modules SRVSAMP1 and SRVSAMP2.
c. Use CRTCLPGM to create the CL program SRVSAMPCRT.
d. Call SRVSAMPCRT to create the srvpgm MYLIB/SRVSAMP.
e. Create a binding directory
===> CRTBNDDIR MYLIB/SRVSAMPBND
f. Add your service program to the binding directory
===> ADDBNDDIRE MYLIB/SRVSAMPBND OBJ((MYLIB/SRVSAMP *SRVPGM))
g. Create your test program. Since it has the BNDDIR keyword in the
H spec, it will automatically find your service program.
===> CRTBNDRPG MYLIB/SRVSAMPTST SRCFILE(MYLIB/QRPGLESRC)
h. Try calling your test program. Enter a value like 06.03.31 or 060331
i. Try adding a new procedure to module SRVSAMP1.
- say a procedure to get a numeric value similar to get Answer
- add the prototype to SRVSAMPPR
- code the procedure in SRVSAMP1
- add an EXPORT line to QSRVSRC SRVSAMPBND
- call your CL to create the srvpgm again
- reclaim the activation group that your test program runs in
(Use DSPPGM to see what activation group it is)
Page 34 of 228
- call your test program again to make sure it still runs ok with the new version of the service
program
j. Add some code to your test program to call the new procedure, and recompile and test.
Source files:
D chkDate pr n
D extproc('chkDate')
D input 10a const varying
D output d
D formatParm 10a const varying
D options(*nopass)
/free
Page 35 of 228
ans = getAnswer ('Give a date in ymd format');
ok = chkDate (ans : date : '*YMD');
if ok;
dsply ('That was ok, date was ' + %char(date));
else;
dsply 'Oops, was not valid';
endif;
*inlr = '1';
P getAnswer b export
D getAnswer pi 25a varying
D question 25a const varying
D answer s 25a varying
/free
dsply question ' ' answer;
return answer;
/end-free
P getAnswer e
P chkDate b export
D chkDate pi n
D input 10a const varying
D output d
D formatParm 10a const varying
D options(*nopass)
Page 36 of 228
if sepPos > 0;
sep = %subst(input : sepPos : 1);
haveSep = *on;
endif;
if format = '*ISO';
if haveSep;
standardSep = %xlate(sep:'-':input);
output = %date(standardSep : *iso);
else;
output = %date(input : *iso0);
endif;
begsr *pssr;
return *off; // some error occurred
endsr;
/end-free
P chkDate e
Here we explore the concept of modules which helps us to reuse the procedures without
applying the service program concept.
Name of the program that binds all the modules is TSTMOD. There won’t be any source for
TSTMOD before CRTPGM. After program creation if you debug this program and see it will
have the source of the entry module (here PGMENTMOD)
There are three modules PGMMOD1, PGMMOD2 and PGMENTMOD where PGMENTMOD is
the entry module (it contains the code to call the exportable procedures present in PGMMOD1
and PGMMOD2).
Page 37 of 228
CRTRPGMOD MODULE (SHAILESH/PGMENTMOD) SRCFILE
(SHAILESH/TESTPGMS)
2. Then create the program (CRTPGM) by binding all the modules like this.
Program . . . . . . . . . . . . > TSTMOD
Library . . . . . . . . . . . > SHAILESH
Module . . . . . . . . . . . . . > PGMMOD1
Library . . . . . . . . . . . > SHAILESH
> PGMMOD2
> SHAILESH
+ for more values > PGMENTMOD
> SHAILESH
Text 'description' . . . . . . . *ENTMODTXT
Additional Parameters
Program entry procedure module > PGMENTMOD
Library . . . . . . . . . . . > SHAILESH
Source code:
PGMMOD1:
D ADD PR
D VAR1 5S 0 VALUE
D VAR2 5S 0 VALUE
D SUM 6S 0
P ADD B EXPORT
D ADD PI
D VAR1 5S 0 VALUE
D VAR2 5S 0 VALUE
D SUM 6S 0
PGMMOD2:
D SUB PR
D VAR1 5S 0 VALUE
D VAR2 5S 0 VALUE
D DIFF 5S 0
Page 38 of 228
C EVAL *INLR = *ON
P SUB B EXPORT
D SUB PI
D VAR1 5S 0 VALUE
D VAR2 5S 0 VALUE
D DIFF 5S 0
PGMENTMOD:
D VAL1 S 5S 0 INZ(99999)
D VAL2 S 5S 0 INZ(99999)
D TOTAL S 6S 0 INZ
D BALANCE S 5S 0 INZ
D ADD PR
D VAL1 5S 0 VALUE
D VAL2 5S 0 VALUE
D TOTAL 6S 0
D SUB PR
D VAL1 5S 0 VALUE
D VAL2 5S 0 VALUE
D BALANCE 5S 0
C TOTAL DSPLY
C CALLP ADD(VAL1: VAL2: TOTAL)
C TOTAL DSPLY
C BALANCE DSPLY
C CALLP SUB(VAL1: VAL2: BALANCE)
C BALANCE DSPLY
Coding Considerations
This section presents some considerations that you should be aware of before you begin
designing applications with multiple-procedure modules. The items are grouped into the
following categories:
Page 39 of 228
* General
* Program Creation
* Main Procedures
* Sub procedures
1. General Considerations
* When coding a module with multiple procedures, you will want to make use of
/COPY files, primarily to contain any prototypes that your application may require. If
you are creating a service program, you will need to provide both the service program
and the prototypes, if any.
* Maintenance of the application means ensuring that each component is at the most
current level and that any changes do not affect the different pieces. You may want to
consider using a tool such as Application Development Manager to maintain your
applications.
For example, suppose that another programmer makes a change to the /COPY file that
contains the prototypes. When you request a rebuild of your application, any module or
program that makes use of the /COPY file will be recompiled automatically. You will
find out quickly if the changes to the /COPY file affect the calls or procedure interfaces
in your application. If there are compilation errors, you can then decide whether to
accept the change to prototypes to avoid these errors, or whether to change the call
interface.
2. Program Creation
* If you specify that a module does not have a main procedure then you cannot use the
CRTBNDRPG command to create the program. (A module does not have a main
procedure if the NOMAIN keyword is specified on a control specification.)
This is because the CRTBNDRPG command requires that the module contain a program
entry procedure and only a main procedure can be a program entry procedure.
* Similarly, when using CRTPGM to create the program, keep in mind that a
NOMAIN module cannot be an entry module since it does not have a program entry
procedure.
* A program that is created to run in the default OPM activation group (by specifying
Page 40 of 228
* Because the main procedure is the only procedure with a complete set of specifications
available (except P specification), it should be used to set up the environment of all
procedures in the module.
* A main procedure is always exported, which means that other procedures in the
program can call the main procedure by using bound calls.
* The call interface of a main procedure can be defined in one of two ways:
However, a prototyped call interface is much more robust since it provides parameter
checking at compile time. If you prototype the main procedure, then you specify how it
is to be called by specifying either the EXTPROC or EXTPGM keyword on the prototype
definition. If EXTPGM is specified, then an external program call is used; if EXTPROC is
specified or if neither keyword is specified, it will be called by using a procedure call.
* You cannot define return values for a main procedure, nor can you specify that its
parameters be passed by value.
* Any of the calculation operations may be coded in a sub procedure. However, all files
must be defined globally, so all input and output specifications must be defined in the
main source section. Similarly, all data areas must be defined in the main procedure,
although they can be used in a sub procedure.
* The control specification can only be coded in the main source section since it controls
the entire module.
* A sub procedure can be called recursively. Each recursive call causes a new invocation
of the procedure to be placed on the call stack. The new invocation has new storage for
all data items in automatic storage, and that storage is unavailable to other invocations
because it is local. (A data item that is defined in a sub procedure uses automatic storage
unless the STATIC keyword is specified for the definition.)
13. What are the behavioral differences b/w OPM RPG/400 and ILE?
Compared to OPM, ILE provides RPG users with improvements or enhancements in the
following areas of application development:
* Program creation
Page 41 of 228
* Program management
* Program call
* Source debugging
Each of the above areas is explained briefly in the following paragraphs and discussed further
in the following chapters.
MAIN
0004.00 C SETON LR
SKANDASAMO/RPGILE
ADD
Page 42 of 228
*************** Beginning of data *******************************
0002.00 C Z-ADD 4 A 40
0002.01 C Z-ADD 5 B 40
0004.00 C A ADD B C 40
0005.00 C C DSPLY
0006.00 C SETON LR
SKANDASAMO/RPGILE
SUB
002.00 C Z-ADD 10 A 40
002.01 C Z-ADD 5 B 40
004.00 C A SUB B C 40
005.00 C C DSPLY
006.00 C SETON LR
SKANDASAMO/RPGILE
MUL
0002.00 C Z-ADD 10 A 40
0002.01 C Z-ADD 5 B 40
0004.00 C A MULT B C 40
0005.00 C C DSPLY
0006.00 C SETON LR
CRTPGM Take F4
Page 43 of 228
Library . . . . . . . . . . . > SKANDASAMO Name, *CURLIB
> ADD
> SKANDASAMO
> SUB
> SKANDASAMO
> SKANDASAMO
OUTPUT
DSPLY 9
DSPLY 5
DSPLY 50
Where as CALLB and CALLP are static calls. A module is a non-executable program and
it contains one or more procedures. If you have modules without procedure then it means that
it is having only one default procedure and in case we can use CALLB.
A module is having more than one procedure then we can give explicitly the procedure
name to be called in case of CALLP out of these three CALLP is the most efficient one. (Using
the CALLB, CALLP a program or module is bind in the program so it is static).
18. What is the difference between Bind by value and Bind by reference?
Here the entire modules to be bounded In this case we are binding the programs
are physically copied into the main by using service programs, which
program object. contain a reference to the module that
has been called, and the modules are not
physically copied into the program
object.
Page 44 of 228
The program will be executed even when The program will not execute when the
you delete the entire module that has bind modules are deleted.
been called.
Bind by value is faster than bind by It is not as faster as bind by value. (All
reference. (All the modules to be bind in the modules can’t bind the main
the main program, so it is fast) program it is refer the pointer)
Pass by reference:
Pass by reference we are passing the address of the parameters and not the actual
value and so the changes in the called procedure will affect the value in the calling
programs. In OPM programs we are using only call by reference.
Pass by value:
Pass by value we are passing the value of the parameter, changes made to the
formal arguments in the called function have no effect on the values of the actual
arguments in the calling function it is used in c program.
In RPGLE we have the option to pass the parameter by value by giving the
keyword VALUE.
20. What are Program Entry Procedure (PEP) and User Entry Procedure (UEP)?
If we are binding many modules together to form a program then we have to specify
which module has to take control first when it has been called and that module is called as PEP
for that program.
User entry procedure (UEP) is the first statement that takes the control when a program
has been called. For example in C programs main () will be executed first when it has been
called and likewise in RPG the statement coded in C Spec will take the control first.
SKANDASAMO/RPGILE
COP
0002.00 C DSPLY A 50
Page 45 of 228
0002.01 C EXSR ADD
0004.00 C SETON LR
SKANDASAMO/RPGILE
COPY
0000.01
0002.00 C ADD 5 A
0003.00 C A DSPLY
0004.00 C ENDSR
OUTPUT
13
DSPLY 18
22. How to create a service program and what are the steps involved in this?
The service program means most commonly used modules are grouped
(binding) together to form it is called service program.
A service program is not bound to its caller until activation time
While creating service program we can create a binder program where we can refer the
modules (or) procedures (or) even data types to be used by the program which is using service
program.
Page 46 of 228
Service programs can be maintained independently of the programs that use the
functions. In most cases, changing a service programs does not cause a program using
the function to be changed or re-created.
Disadvantages of service programs
Service programs are less desirable for a function you may or may not need. The
reason is that it is slower to call a main program that refer to a service program
Page 47 of 228
We can call the procedure by using CALLP command if it is not having any
return type and by an expression if it returns any value.
Database
Physical files hold the actual data of a database file. The data is written in arrival sequence.
Physical files are not required to have keyed fields. If a physical file has key fields, this is the
order that an RPG program will read the data if the File Spec in the program indicates to read
the data in keyed sequence. Also, with a keyed field, an RPG program can CHAIN, SETLL,
READE and READP.
A simple logical file is a different view of the physical file. It is actually a list of pointers to the
physical file. Most of the time, a logical file is nothing more than a way of accessing the physical
file with different key fields.
Logical file does not occupies any memory space and logical file be derived from physical file.
One or more logical file can be derived from a single physical file. A logical file can contain up
to 32 record formats. It selects records dynamically. It cannot exist without a physical file. We
can filter the data with criteria by using select and omit command. CRTLF command is used to
create a LF. It accesses the data by creating access path.
A logical file does not contain any data but provides the ‘VIEWS’ of the data to satisfy
end-user’s needs. There are two types, 1. Non - join logical file, 2. Join logical file With the
standard AS/400 supplied tools, it is hard to see the logical file. One way is to use the copy file
CPYF to copy the logical file to a new physical file. Then, look at the physical file... it will be in
the same order as the logical file. The AS/400 Database is full featured. Logical files can join
multiple files and select and create new fields. Maximum number of fields included in a PF is
8000. Maximum no of key fields included is 120.
Page 48 of 228
1. Occupies the portion of memory. It’s Does not occupy any memory space. Does
containing data. not contain any data.
2. A physical file contains one record A logical file can contain up to 32 record
format and can contain many members formats but only one member.
4. The PF cannot be deleted without If the LF is deleted then the PF need not be
deleting the associated LFs. deleted.
5.CRTPF command is used to create such CRTLF command is used to create such
object type object
6.The object type is PF The object type is LF
(I). File level entries (optional): File level entries give the system information of the
entire file. (UNIQUE, LIFO, FIFO, FCFO, REF)
UNIQUE: A record cannot be entered or copied into a file if its key value is same
as the key value of a record already existing in the file.
REF: This keyword is used to specify the name of the file from which the field
descriptions are retrieved.
(ii). Record format level entries: Record format level entries give the system
information about specific record format in the file. For a PF the record format
name is specified along with an optional text description. (FORMAT, TEXT)
(i) FORMAT:
This record-level keyword specifies that the record format being define is to
share the field specifications of a previously defined record format. The name of
the record format being defined must be the name of the previously defined
record format.
The format of this keyword is:
Page 49 of 228
FORMAT (LIB-NAME / FILE-NAME)
(ii) TEXT:
This record level keyword is used to supply a text description of the record
format and it is used for documentation purposes only.
TEXT (‘description’)
(iii) Field level entries: The field names and field lengths are specified along with
and optional text description for each field. (ALIAS, ALWNULL, CCSID,
CHECK, CHKMSGID, CMP, COLHDG, COMP, DATFMT, DATSEP, DFT,
EDTCDE, EDTWRD, REFFLD, REFSHIFT, TEXT, TIMEFMT, TIMESEP,
VALUES, VARLEN)
(iv) Key field level entries: The field names used as key fields are specified.
(DESCEND, SIGNED, ABSVAL, UNSIGNED, ZONE, NOALTSEQ, DIGIT)
(i) File level entries (optional): File level entries give the system information of the
entire file. You can specify whether the key is same as physical file.
(ii) Record format level entries: Record format level entries give the system
information about specific record format in the file. For examples, for a logical
file when a record format is described we can specify the physical file it is based
on. Example: Jfile, PFile.
(iii) JOIN Level entries: Join level entries give the system information about PF
used in a JOIN LOGICAL FILE. (It is not applicable to NON JOIN LOGICAL
FILES).
Join, JFLD,
(iv) Field level entries (optional): The field level entries give the system information
about individual fields in the record format. Example: JRef
(v) Key field level entries: The key field level entries give the system information
about the key fields of a file. The field names used as key fields are specified.
(vi) Select / Omit level entries: These entire give the system information about
which records are to be returned to the program when processing the file. These
specifications apply to logical file only.
Examples: Range(field), values(recordformat)
JDUPSEQ:
Page 50 of 228
This join –level keyword is used to specify the order in which records with
duplicate join fields are presented when the JLF is read.
This keyword has no effect on the ordering of records with unique keys.
If *DESCEND is not specified then the default is sequencing in ascending order.
JDFTVAL:
When this file-level keyword is used the system provides default values for all
for fields when a join to a secondary file does not produce any records.
If this keyword is not specified a record in the primary file for which
there is no corresponding record in the secondary file is skipped.
7. What are the different between non-join logical files and join logical files.
1-32 record format is specified Only one record format can be specified
8. How many record formats can have physical & logical file.
Page 51 of 228
10. Explain non-join logical file?
Non-join logical files can either be a simple logical file, which contains only one record
format or a multiple record format logical file, which contains more than one record format.
Logical files can be derived from 1 to 32 physical files and so a logical file can have a
maximum of 32 record formats.
Each record format is always associated with one or more physical file.
The same PF can be used in more than one record format.
Specify the entries in single or multiple format logical files:
1. File-level entries (optional): (REFACCPTH, DYNSLT)
REFACCPTH: The access path information for this logical file is to be copied from another
PF or LF.
Format of the keyword is:
DYNSLT: This keyword is selection and omission tests in the file. This keyword
specifies dynamic select/omit.
PFILE: The physical files containing the data to be accessed through the
PFILE--- it is applicable only for non-join logical file in record level entries.
Page 52 of 228
11. It is possible to insert record to JOIN LF?
NO, insertion, updating or deleting of records is not possible in JOIN LF.
A join-logical file is a logical file that combines two or more PF. In the record format not
all the fields need to exist in all the PF.
SELECT OMIT
SEU==> SELOMIT
FMT PF.
Page 53 of 228
*************** Beginning of data *******************
0001.00 R RECSEL
0002.00 EMPNO 5P 0
0004.00 K EMPNO
EMPNO EMPNAME
SEU==> SELOMILF
FMT LF...
0002.00 K EMPNO
Page 54 of 228
Display Report
EMPNO EMPNAME
SEU==> SELOMILF
FMT LF
0002.00 K EMPNO
EMPNO EMPNAME
Page 55 of 228
****** ******** End of report ********
SEU==> SELOMIT
FMT PF.
0001.00 R RECSEL
0002.00 EMPNO 5P 0
0004.00 K EMPNO
EMPNO EMPNAME
000001 20 SHYAM
000002 30 RAM
000003 40 TOM
000004 50 RAMESH
000005 60 SHYAM
000006 70 SHYAM
000007 80 TOM
000008 90 TOM
SEU==> SELOMILF1
FMT LF
0002.00 K EMPNO
Page 56 of 228
0003.00 S EMPNO CMP (GT 50)
EMPNO EMPNAME
000001 20 SHYAM
000002 60 SHYAM
000003 70 SHYAM
000004 80 TOM
000005 90 TOM
SEU==> SELOMILF1
FMT LF.
0002.00 K EMPNO
EMPNO EMPNAME
000001 50 RAMESH
000002 60 SHYAM
000003 70 SHYAM
000004 80 TOM
000005 90 TOM
Page 57 of 228
****** ******** End of report ********
SEU==> SELOMILF1
FMT LF
0002.00 K EMPNO
EMPNO EMPNAME
000001 20 SHYAM
000002 30 RAM
000003 40 TOM
000004 50 RAMESH
000005 60 SHYAM
000006 70 SHYAM
000007 80 TOM
000008 90 TOM
SEU==> SELOMILF1
FMT LF
Page 58 of 228
0002.00 K EMPNO
EMPNO EMPNAME
000001 20 SHYAM
000002 30 RAM
000003 40 TOM
000004 50 RAMESH
000005 60 SHYAM
000006 70 SHYAM
000007 80 TOM
000008 90 TOM
A physical file can be joined to itself to read records that are formed by combining two
or more records from the PF itself.
SEU==> SEJOIN
FMT PF
0001.00 R EMP
0002.00 EMPID 5P 0
Page 59 of 228
0003.00 EMPNAME 20A
0004.00 MGRID 5P 0
0005.00 K EMPID
SEU==> SELJOIN
FMT LF
0002.00 J JOIN (1 2)
Page 60 of 228
0007.00 COLHDG ('MANAGER')
SEU==> SELJOIN1
FMT LF
0002.00 J JOIN (1 2)
Page 61 of 228
Columns . . . 1 71 Edit KSENTHILS/EXAMPLE
SEU==> SELJOIN1
FMT LF
0002.00 J JOIN (1 2)
It is the process of segregating and decomposing information held within a system into
logically grouped, related. Uniquely identifiable entities
ADDPFCST is a command that is used to define the Constraint on your physical file. The
constraint has several types. These are REFCST, UNQCST and PRIKEY. By the by, this
command is helps to define Update rules and Delete rules.
Page 62 of 228
16. How to send the message to the screen SNDPGMMSG?
BY passing unique message ID message data and message file.
SNDPGMMSG syntax
SNDPGM MSG MSGID (MSG0001) MSGF (MSGSUB)
17. How you can list all the LF of a PF?
By using DSPDBR command it is to list all the files, which are related to a PF. It displays
all the LF that is referring the PF and also lists the child table if it is having a relation
through ADDPFCST.
18. What is use of DSPFFD and DSPFD?
DSPFD (display file description)
It is used to display the details about the file when it is created.
DSPFFD (display file field description)
It is used for listing details about individual fields.
19. Explain inner join or natural join and left outer join?
Inner join
Inner join means the matching records in between the joining file will be
selected.
Columns . . . 1 71 Edit KSENTHILS/EXAMPLE
SEU==> JPF01
FMT PF
0001.00 R JP1REC
0002.00 EMPNO 5S 0
0004.00 K EMPNO
SEU==> JPF02
FMT PF.
0001.00 R JP2REC
Page 63 of 228
0002.00 EMPNO 5S 0
0004.00 K EMPNO
Display Report
EMPNO EMPNAME
EMPNO EMPSAL
SEU==> JOFILE
FMT LF.
0002.00 J JOIN (1 2)
0005.00 EMPNAME
0006.00 EMPSAL
0007.00 K EMPNO
Page 64 of 228
000001 1,001 SHYAMBABU 100.00
Left outer join all the records from primary file and matching records from the
secondary file will be selected.
Columns . . . 1 71 Edit KSENTHILS/EXAMPLE
SEU==> JOOUT
FMT LF.
0001.00 JDFTVAL
0003.00 J JOIN (1 2)
0006.00 EMPNAME
0007.00 EMPSAL
0008.00 K EMPNO
SEU==> SEQ1
FMT PF.
Page 65 of 228
*************** Beginning of data ***********************
0001.00 R SEQREC1
0002.00 EMPNO 5P 0
0005.00 K EMPNO
SEU==> SEQ2
FMT PF
0001.00 R SEQREC2
0002.00 EMPNO 5P 0
Page 66 of 228
****** ******** End of report ********
SEU==> JDFTSEQ
FMT LF
0002.00 J JOIN (1 2)
0006.00 EMPNAME1
0007.00 ADDRESS
0008.00 TEL
JOIN DESCEND
SEU==> JDFTSEQ
FMT LF
0002.00 J JOIN (1 2)
Page 67 of 228
0003.00 JFLD (EMPNAME1 EMPNAME)
0006.00 EMPNAME1
0007.00 ADDRESS
0008.00 TEL
The first is the event that will cause the trigger to fire. A trigger event can be
an insert, an update, or a delete a record from the file.
The second attribute to define is when to fire the trigger-before or after the
event.
The third attribute to define is the identification of the trigger program to by
run.
We can infer that up to six triggers can be defined for each PF.
PF PF001
LIB SKANDASAMO
Page 68 of 228
TRIGGER EVEVT *UPDATE *UPDATE *INSERT *DELETE
PROGRAM PGM001 NAME
LIB SKANDASAMO
Update rule
Restrict inconsistent updates
Page 69 of 228
CASCADE: If we want to delete a record from the parent file and its parent
key is matching records in a dependent file, the DBMS will delete all the
matching records of the dependent file.
SETNULL: If we delete a record from the parent file and parent key is
matching some records in a dependent file, the DBMS will set to null the
matching keys in the dependent file.
SETDEFAULT: This is like previous case, but matching occurrences in the
foreign key are set to their default values. The default value for the foreign
key has to match a record in the parent file.
RESTRICT: The DBMS will prevent any attempt to delete records in the
parent file if its key is matching some records in the dependent file.
NO ACTION: This has the same meaning as restrict, but different timing.
When we use *NOACTION and an invalid delete operation is about to take
place, DB2 /400 will delay any error message until the end of the operation
itself, allowing for instance the activation of a before trigger attached to the
PF.
If *restrict is in use, the exception message is sent immediately.
Deleting records in a dependent file is always permitted.
Update rule
RESTRICT: We cannot change the value in a parent key if the old values are
matching some records in the dependent file.
The remaining portion of the record can always be updated.
We cannot update a foreign key in a dependent file if the new value
for the key is not null and does not match any value of the parent key.
NO ACTION: This is same as * restrict but with different timing
considerations. Refer above; where we describe no action delete operations.
Inserts
There is no insert rule to be chosen, but referential integrity prevents any
insert in the dependent file if the new record has no match in the parent file
and its foreign key is not null.
If we want to execute set of SQL statement then we can write all the SQL statement
to be including with the source.
Type as SQL
Only insert, update and delete and no select is allowed.
Then use STRSQLSTM to execute the program
RUNSQLSTM SRCFILE (LIB/TEST) SRCMBR (SQL01) COMMIT (*NONE)
Page 70 of 228
24. What are the various ways creating access path?
Access path means the records are to be retrieved from a file. The records can be
retrieved from a PF or a LF either ARRIVAL SEQUENCE or by KEYED SEQUENCE. For LF you
can also select records using select or omit keywords
Arrival sequence access path
Sequentially, where each record is taken from the next sequential physical
position in the file.
Directly by relative records number, where the record number is identified
by its position from the start of the file.
Keyed sequence access path
It is based on the contents of the key fields as defined in DDS. This type of access
path is updated in the contents of a key field is changed.
There are three ways of bounding the access path
Immediate
Access path is always maintained for every opening in a file.
Rebuild
Access path is maintained when the file is open and various updates are
recorded and the access path is rebuilt every time when the access path is closed.
Delayed
Access path is maintained when the file is opened and updates recorded. When
the file is closed all the updates to the records are closed together but it is not rebuild.
When the recorded update percentage exceeds 25% then rebuild of records take place.
25. How many record formats PF, LF, DSPF and SFL?
PF- 1, LF- 32, DSPF-1024 SFL-512
26. Define KLIST?
KLIST operation is a declarative operation that gives a name to list of KFLD. This KLIST
can be used as a search argument to retrieve records from files that have a composite key.
27. Define PLIST?
The declarative PLIST operation defines symbolic name for a parameter list to be
specified in a CALL operation.
28. Define composite key?
It is a key for a file, which is composed of more than one field.
29. Is it possible to create a logical file whose Physical file is not in same library?
Yes...for that u have to specify the actual data path in keyword PFILE
Like
A R A1 PFILE (AMIT/A2)
A K CODE
Then this will create the LF A1 for A2 PF...
Yes, just put the user library in which you want to create on top and followed by other library in
which physical file is located.
Page 71 of 228
Provided the first library should not have physical file.
Then try to create the logical.
30. Can you delete the record space permanently in PF through CL?
USING THE COMMAND 'RGZPFM' The Reorganize Physical File Member (RGZPFM)
command compresses (removes deleted records from) one member of a physical file in the
database, and it optionally reorganizes that member.
31. What is the difference between adding keys & constraints into a physical file?
During the time of compilation of a file, constrains are being removed, from the file .but at the
time of compilation keys are not removed in case from pf.
Constraints has no affects on members of a pf but keys has affect on members of pf
A key field defines the order in which the records of a PF member will be sorted (ascending or
descending).
On the other hand, a constraint, such as UNIQUE, defines which key field values or records are
valid /allowable to be written into a file. UNIQUE prevents a record with duplicate key field
values to be written into a PF.
32. How to insert more than one record to a pf at a time? (Bulk insert to a pf)
33. How to see number of logical files depending on a pf? Can we declare more than 20
logical files from a single pf? Is it possible?
There is one more way to see the logical USING DBU is just type 'DBR' and press enter.
34. I want to change the attribute of field or want to add new field in existing PF but
condition is format level identifier should not change, is it possible?
Whenever a file is changed (by adding or deleting a field), Format level identifier is also
changed, even if u are using CHGPF. All the programs that are this file needs to be compiled
Page 72 of 228
again. You can avoid recompiling programs by setting Format Level Check parameter to *NO in
command CRTPF. But this is not a good method, since it may affect the program.
35. Maximum how many fields we can create under a record format of PF?
We can give max of 8000 fields in rec format of a PF. But it also depends on the no. of bytes
occupied by the record format. Because rec. format of PF may occupy at max 32766 bytes.ie if
there is only one field which occupy 32766 bytes then we can't define a new field in record
format. So it depends on the no. of bytes occupied by the field defined in the record format.
BLDINDEX MLR?WS?,28,8,ML.RETUR,,DUPKEY
BLDINDEX ML.HIS?WS?,9,6,ML.INVHS,,DUPKEY,,17,5
Ignored-%
Page 73 of 228
Prefer disk locn A1,A2,A3,A4,block number
MEMBER IS USE TO STORE THE DATA, EACH FILE MUST HAVE MEMBER.
You have added some fields to a physical file that has lots of records. You don’t want to lose the
data, but you have to compile that to include those fields. In that case, make use of CHGPF.
It gives you the result similar compilation (including the added fields) without losing the data.
Here SFL001PF is the PF and TESTPGMS is the source physical file.
Note: CHGPF cannot be used to achieve the result similar to compilation in case of deletion of
some fields. You have to compile the PF to exclude the deleted fields.
In SQL there is a command called ALTER which performs similar functions (like ADD
constraint, DROP constraint, ADD field, ALTER field and DROP field) as CHGPF.
But here also we get error message when we try to alter or delete the fields just like the CHGPF
scenario.
A FIELD1
A FIELD2
A K FIELD1
A FIELD1
A FIELD2
A K FIELD1
In the program, you can chain with the file name and you'll get records from both physical files,
or the format name and you'll get records only from the specific PFILE. If you want to update or
write a record with this logical file, you must use the format name.
Limitation: Even though logical files allow multiple record formats, we cannot have different
record formats for the same physical file (as the record format of the LF has to be the same as
Page 74 of 228
PF). Record formats of many physical files can be present in one LF making it multi format LF.
We can have up to 32 record formats in the same LF.
If you want to access the same PF with different set of keys you have to go for multiple simple
logical files like the one shown below.
LF1:
A FIELD1
A FIELD2
A K FIELD1
LF2:
A FIELD2
A FIELD3
A K FIELD2
Here we want to access the PF, File1 with 2 sets of keys. Field1 & Field 2 is one set and Field 2 &
Field 3 is the other set. But we cannot mention 2 record formats with these keys in the same
logical file. We have to write 2 separate logical files LF1 and LF2 in order to have 2 different
record formats for that PF, File1.
In a program, a record is deleted from a physical file. In the same program, the file is read again
(the file is not closed and the delete operation is not committed as well). In that case, we will be
accessing the deleted record also, since the refresh has not taken place on that PF. Only after
Commit (in case the file is not user open only commit or ending the program can refresh the
file) or explicit close, data refresh happens. It will not free up the space though. The record will
be empty but will occupy space. Only RGZPFM can free up the space occupied by the deleted
record.
But in the case of LF, refresh happens immediately if we associate them with the keywords that
can rebuild/refresh the access path. Say for example, we have *IMMED for rebuild, as soon as
the operation happens the file will get refreshed. It will not wait for the commit or close or
program ending to happen.
Note: After deleting record 2, and not issuing RGZPFM, if we are trying to access the PF with
RRN as key starting from the first record, the deleted record 2 will not be processed even
though the space is still occupied (i.e., it is not treated as a data record). The compiler treats it as
empty space and skips the record.
Page 75 of 228
41. Tell me the differences between DB2 CLI (call Level Interface) and embedded SQL?
An application that uses an embedded SQL interface requires a pre-compiler to convert the SQL
statements into code, which is then compiled, bound to the database, and executed. In contrast,
a DB2 CLI application does not require pre-compilation or binding, but instead uses a standard
set of functions to execute SQL statements and related services at runtime. This difference is
important because, traditionally, pre-compilers have been specific to a database product, which
effectively ties your applications to that product. DB2 CLI enables you to write portable
applications that are independent of any particular database product. This independence means
a DB2 CLI application does not have to be recompiled or rebound to access different database
products, but rather selects the appropriate one at runtime. DB2 CLI can execute any SQL
statement that can be prepared dynamically in embedded SQL. This is guaranteed because DB2
CLI doesn't actually execute the SQL statement itself, but passes it to the DBMS for dynamic
execution.
2. The major parts of a file are Record format and Access path.
3. Record format in a file describes the way the data is actually stored.
4. Access path describes the order in which the records are to be retrieved.
5. We have two types of access patch Keyes sequence access path and Arrival sequence
access path.
6. Access Path maintenance specifies how access paths are maintained for closed files.
While file is open the system maintains the access path changes.
7. In general we have three types of access path maintenance, *IMMED , *DLY and
*REBLD
8. *IMMED must be specified for files that require UNIQUE keys. (Immediate access path
maintenance mainly for files used as interactively)
9. *REBLD the access path is completely rebuilt each time a file member is opened. This
cannot be specified for file if its access path is being journal.
10. *DLY the maintenance of the access path is delayed until the PF member is opened for
use. Updates to the access path are collected from the time the member is closed until it
is opened again. When it is opened, only the collected changes are merged into the
access path.
11. In CHGPF command we have the keyword *LVLCHK (Level Check). This specifies
whether the levels of record format identifiers are checked to verify that the current
record format identifier is the same as that specified in the program that opens the
physical file. The level identifiers of the record formats are checked when the file is
Page 76 of 228
opened. If the level identifiers do not match, an error message is sent to the program
requesting the open, and the file is not opened.
12. For physical file and for logical the file type should be “FILE”. Attribute for physical file
should come as “PF-DATA”, logical file come as “LF” and for source physical file
attribute should come as “PF-SRC”
13. Let’s say one scenario, your source physical file name is “QDDSSRC” and inside this
source physical file when you try to create a physical file with name same as that of
source physical file “QDDSSRC” what will happen? The source physical file will get
deleted.
15. DESCEND keyword is used to arrange records from the highest to the lowest key field
values.
17. REF keyword specifies the name of file contains the referenced fields.
18. REFFLD keyword copies the field description from the referenced file.
19. FORMAT keyword shares the field description with the existing record format.
20. DFT keywords provide the default value for the fields.
24. EDTCDE and EDTWRD keyword edit code and edit word.
29. For physical file the default maximum number of member is one, the maximum
members we can attain is *NOMAX
30. For physical file the default value of initial number of records which we can add to
database is 10000 and maximum increments in a physical file are three.
31. Maximum number of key fields allowed in a PF is 120. Max number of fields in a PF is
8000.
Page 77 of 228
32. Members in physical file, the significance of member is it helps to classify data easier.
33. Example for member concept is, I want to keep data for a year in one file, and I
frequently want to process data for one month at a time. For this I can create one
physical file with twelve different members for each month.
34. We can copy data of a member to other member of same physical file. (We can’t compile
any new members)
35. Specific commands for physical file members, ADDPFM, CHGPFM, RMVM, INZPFM
(*DFT or *DLT), RGZPFM, DSPPFM.
36. Even if you delete the records in a PF through program, still the space used by the
deleted records not used by other purpose. Hence using RGZPFM command we can
compress the deleted record space.
37. How we can add a new field to a file which has thousands of data in it? CHGPF
command will help you to add new field without losing your current data.
39. DSPFD (Display file description) with TYPE *MBRLIST will display all members
associated with the specified file. *TRG will give you the trigger program list.
40. An ODP (Open Data Path) is the path through which all input/output operations for the
files are performed. It connects the program to a file. If we do not specify the SHARE
(*YES) then a new data path is created every time a file is opened.
41. Logical file is used to arrange data from one or more PFs into different formats and
sequences. Logical files contain no data. Three different types of logical file we have,
Simple logical file, Multiform at logical file and Join logical file. A multi format logical
file is also known as Union file.
42. The record format name of logical file should/should not be same as that of physical file
which mentioned in PFILE keyword. PFILE keyword tells the physical file that the
logical file based on.
43. There are some keywords specific for LFs, CONCAT, DYNSLT, JFILE, JFLD, JOIN, JREF,
PFILE, RENAME, and SST.
44. Column 17 values, R – Record format name, K- Key field name, J – Join specification, S –
Select field name, O – Omit field name.
45. In LF the access path we can specify in three ways, keyed sequence access path, Arrival
sequence access path and REFACCPTH.
Page 78 of 228
47. In arrival sequence access path,
R CUSRCD PFILE(PFNAME)
50. In multi format logical file the maximum number of record format we can declare is 32.
52. We have two types of SELECT/OMIT, Access path SELECT/OMIT and Dynamic
SELECT/OMIT. Access path SELECT/OMIT is maintained by system when records are
added or changed. Dynamic SELECT/OMIT processing is done when records are read
by the program.
53. For a multi format logical file if you want to access a particular member of a physical
file. Then execute the OVRDBF command with the specific member name before reading
the logical file.
54. Dynamic SELECT/OMIT, when a program reads a records from the file, the system only
returns those records that meet the select/omit values. That is the actual SELECT/OMIT
processing is done when records are done by the program, rather than records are
added or changed.
56. Another method of selecting records is using QRYSLT parameter on the open query file
(OPNQRYF) command.
57. Join logical file is a logical file that combines fields from two or more physical file.
Cannot change physical file using join logical file. Can specify only one record format in
join logical file. The record format in join logical file cannot be shared. Commitment
control cannot be used with join logical file.
60. In Join logical file maximum of 31 secondary files can join. (Total 32 files.) Max of two
files can be joined at a time.
Page 79 of 228
JFLD(NBR NBR)
NBR JREF(PF1)
NAME
SALARY K
NBR
62. At least two physical files must be specified on JFILE keyword. The first file specified on
the JFILE is the primary file the other files are secondary files.
63. JOIN keyword identifies which two files are joined by the JOIN specification. If only two
physical files are joined by the join logical file, then JOIN keyword is optional.
64. JFLD keyword identifies the join fields that join records from physical files specified in
JOIN. JFLD must be specified at least once for each JOIN specification. Join fields except
character type fields must have the same attribute.
66. Example of join logical file, In this case the NBR filed comes from PF2, because relative
file number is specified.
R JOINREC JFILE(PF1 PF2)
J JOIN(PF1 PF2)
JFLD(NBR NBR)
NBR S JREF(2)
NAME
SALARY
67. Reference file does not contain any data. This is a physical file. It is used as a reference
for the field descriptions for other files.
68. OPNQRYF is like a temporary logical file. It will get automatically deleted when we
close this query file. OPNQRYF command opens a file that contains a set of database
records that satisfies a database query request. OPNQRYF never shares an existing
shared ODP in the job or activation group.
70. We can copy data from data path opened by OPNQRYF by CPYFRMQRYF.
71. Parameters in OPNQRYF commands, FILE – name of file that get processed by
OPNQRYF command. OPTION – open option used for query file example *INP, *OUT,
*UPD, *DLT, *ALL. QRYSLT – query select specifies the selection value. KEYFLD -
*ASCEND, *DESCEND. UNIQUEKEY – Specifies whether the query is restricted to
records with unique key values.
Page 80 of 228
73. Difference between PF and LF
Contain actual data Doesn’t contain data but it provides view from
PF
76. A trigger is a set of actions that are run automatically when a specified change operation
is performed on a specified physical database file. The change operation can be an insert,
update, or delete high level language statement in an application program.
77. On the AS/400 system, a set of trigger actions can be defined in any supported high
level language. (C, Cobol. RPG, PLI, SQL)
78. ADDPFTRG command adds a trigger to call a named trigger program to a specified
physical file. The trigger program can be specified to be called before or after a change
operation occurs. The change operation can be insert, update or delete. A maximum of
six triggers can be added to a physical file. Once a trigger is added to a physical file, all
members of that specified file are affected by trigger. example,
ADDPFTRG FILE (EMP)
TRGTIME(*AFTER) TRGEVENT(*INSERT) PGM(LIB2/INSTRG)
Page 81 of 228
79. The Remove Physical File Trigger (RMVPFTRG) command removes the association of
files and trigger program.
80. A trigger program cannot include the following commands, COMMIT, ROLLBACK,
and ENDCMTCTL.
81. A trigger program can call other programs or can be nested (that is, a statement in a
trigger program causes the calling of another trigger program.) The maximum trigger
nested level for insert and update is 200.
82. A double-byte character set (DBCS) is a character set that represents each character with
2 bytes. The DBCS supports national languages that contain a large number of unique
characters or symbols (the maximum number of characters that can be represented with
1 byte is 256 characters). Examples of such languages include Japanese, Korean, and
Chinese. There are two general kinds of DBCS data: bracketed-DBCS data and graphic
(non-bracketed) DBCS data. Bracketed-DBCS data is preceded by a DBCS shift-out
character and followed by a DBCS shift-in character. Graphic-DBCS data is not
surrounded by shift-out and shift-in characters.
83. The DB2/400 database supports the following physical file constraints, Referential
constraints, Primary key constraints and Unique constraints.
84. The Add Physical File Constraint (ADDPFCST) command adds all types of physical file
constraints. To add unique and primary key constraints, specify *UNQCST for the Type
parameter for a unique constraint and *PRIKEY for a primary key constraint. When
adding a primary key constraint, the specified key becomes the file's primary access
path.
85. The Remove Physical File Constraint (RMVPFCST) command removes a constraint.
86. Physical File Constraint Considerations and Limitations,
o A file must be a physical file.
o A file can have a maximum of one member, MAXMBR(1).
o A constraint can be defined when the file has zero members. A constraint cannot
be established until the file has one, and only one, member.
o There is a maximum of 300 constraint relations per file.
o Constraints cannot be added to files in the QTEMP library.
87. The CRTSRCPF command creates a physical file, but with attributes appropriate for
source physical files. For example, the default record length for a source file is 92 (80 for
the source data field, 6 for the source sequence number field, and 6 for the source date
field).
88. DB2/400 Database Data Recovery, we have the following methods.
Journal management, for recording data changes to files
Commitment control, for synchronizing transaction recovery
Page 82 of 228
92. In UDB/400 an SQL index is a single member logical file with keyed access.
93. SQL/400 refreshes records as rows and fields as columns.
94. The SQL related program variables, Known as the SQL communication area (SQLCA),
you should code in the working storage section to have the SQL compiler generate
SQLCA group and elementary items. EXEC SQL INCLUDE SQLCA END-EXEC.
SQLCA works as an error handler.
95. SQLCODE value less than zero means error, Value “100” means no rows found.
When the CHAIN operation is not completed successfully (for example, an error occurs or no
record is found), the file specified in factor 2 must be repositioned (for example, by a CHAIN or
SETLL operation) before a subsequent read operation can be done on that file.
Triggers is a self contained set of transact executable statements which can be invoked during
the operations such as insert, update, delete can be performed in a database file.
We can able to add trigger in a physical file: ADDPFTRG
To remove a trigger: RMVPFTRG
In the case of SQL/400 we can create trigger by....
>>STRSQL
>>CREATE TRIGGER TRG_Name after INSERT/DELETE/UPDATE On PF1
Insert Into PF2 Values ('RECORDS DELETED IN PF1')
>>Delete FROM PF1 Where Recordno = 10
>>SElect * FROM PF2.
In the above code, the records in the PF1 is deleted , at once the trigger trg_name is fired and the
given insert statement is activated in pf2.
The USROPN keyword causes the file not to be opened at program initialization. This gives the
programmer control of the file's first open. The file must be explicitly opened using the OPEN
operation.
For example, if a file is opened and later closed by the CLOSE operation, the programmer can
reopen the file (using the OPEN operation) without having specified the USROPN keyword on
the file description specification.
Whenever PF is compiled, the system generates unique code for identifying the file for future
reference.
When we compile the Program that uses the PF, it will use that unique code of the PF.
Page 83 of 228
If we call the program, it runs successfully. But if we change the PF and recompile the PF, the
system generates a new unique code for that PF. So, our program doesn’t have this unique code
and hence terminates abnormally with a Level Check error.
The solution of Level Check error is whenever it happens we have to either compile the PF with
Level Check parameter value *NO or we have to compile the program again.
OVRDBF
2) Say you want to use a different file (with the same record level) in a program.
To be theoretical,
The OVRDBF is used to
1) To temporarily change the attributes of a file like member, position of rrn ,sharing the Open
Data Path etc....
2) To Redirect the references made for one file to other file.
Page 84 of 228
Actually OVRDBF is used for multimember concept. A pf having multiple member and u need
to access one of the members from that, OVRDBF is used. Also, in CL u can access only 1 file at
a time. For more than 1 file also OVRDBF is used
OPNQRYF
It is a dynamic record selection. The OPNQRYF command acts as a filter between the
processing program and the database records. The database file can be a PF or LF. It will create
open data pathway to access (retrieve) data file.
If you want to specify any SQL operation within a CL we have to use OPNQRYF
Functions supplied by OPNQRYF are:
Dynamic record selection.
Dynamic keyed sequence access path
Dynamic keyed sequence access path over a join
Dynamic join
Handling missing records in secondary join files
Unique-key processing
Mapped field definitions
Group processing
Final total-only processing
Improving performance
Open query identifier (ID)
OPNQRYF SQLRPG
OPNQRYF will come along with OS/400 We need to have SQLRPG installed in
system and no need to have any as/400 system which involves additional
additional package needed to execute it cost to the programmers
OPNQRYF is faster as compared to It is slower
SQLRPG
OPNQRYF is nothing but a dynamic SQLRPG is imbedding SQL statements
logical files will be created and the directly within SQL statement
records
Page 85 of 228
If a PF is having 100 records and if we want to override the PF so that
it continues only the specific number of records we are using
OVRDBF
OPNQRYF
FILE (LIB / PF) QRYSLT (‘EMPNO *EQ ‘ *BCAT &A)
If you want to perform any SQL operation we have to declare in
OPNQRYF command only.
In case of OPNQRYF we can perform expression only based on
characters but not on numeric.
*BCAT
If you want to perform any charter expression are using *BCAT
expression which will provide a blanks in between the 2 variables.
%WLDCRD
It is similar to %LIKE in SQL
QRYSLT (‘EMPNAME *EQ %WLDCRD (“S* “)’)
It will fetch all the records whose empname starts from S.
*CT
It will fetch all the records, which conditions the particular
charter.
QRYSLT (‘EMPNAME *CT “S” ‘)
%RANGE
It will fetch the records within the specific range
QRYSLT (‘EMPNO *Eq %RANGE (100 110)’)
CALL PGM (LIB/NAME) PARM ()
DLTOVR
As we see early the main file logically overridden and after performing
the necessary operation, we have to delete the logical file so that the main
file contains the actual records for this DLTOVR will be used.
DLTOVR FILE (OPNPF)
CLOF
We have to close the file, which has been opened
CLOF OPNID (OPNPF)
You will copy overridden file records using CPYFRMQRYF
CPYFRMQRYF
Since OVRDBF is logical we cannot able to list the variables, which satisfy
the query condition. To see the records being selected we have to copy
from the source file to a temporary file for this CPYFRMQRYF will be
used
CPYFRMQRYF FROMOPNID (OPNPF) TOFILE (LIB/NAME)
MBR (*REPLACE) CRTFILE (*YES) FMTOPT (*NOCHK)
RUNQRY
We have copied the contents satisfy the query into a temporary file using
CPYFRMQRYF. If we run the destination file we got the actual records,
which satisfy the query.
RUNQRY QRYFILE (LIN/NAME)
Page 86 of 228
Example:
Database PF
SKANDASAMO/CLP
OPENF
0000.01 C UNIQUE
0001.00 C R OPNQFILE
0002.00 C OEMPNO 5S 0
0005.00 C ODOB 8S 0
0006.00 C K OEMPNO
Data file
Display Report
CL program
SKANDASAMO/CLP
OPNQFILE5
Page 87 of 228
0001.00 PGM
0011.00 ENDPGM
OUTPUT
FMTDTA OPNQRY
It will sort the records sequentially based It will sort the records based on the field
on the position of the record values.
Page 88 of 228
If any change in the attribute size of a PF If there is any change in the attribute size it
then we have to change the program will not affect the program specification
specification also. also.
LF creates a new object in the system while that is not the case for OPNQRYF.LF creates a
permanent data access path to the physical file that will be updated as and when and add,
update and delete operation is performed on file Whereas OPNQRYF creates a temporary
access data path that is shared by high level pgm for further processing of recs in file.
I agree with Vaiv20. Just want to add that OPNQRYF is used with keyword Share (*Yes) and
that's what makes the ODP available to high level pgms.
Also the usage of OPNQRYF is for adhoc jobs that are executed once in a while whereas LF is
used in case where the ODP is going to be used pretty regularly. So LF object would be
preferred when the usage is going to be regular.
OPNQRYF would be good where the job is going to be once in a while.
LF would make the job faster compared to OPNQRYF though it depends on what kind of
maintenance option you use for LF.
The main difference is: Logical file creates permanent object on the system. OPNQRYF creates
temporary access path.
CL-PROGRAM
ILLUSTRATED IN SAMPLES 1 - 3.
Page 89 of 228
INPUT........: DB-FILE: QRYSLTPF
FIELDS: UPUPRF 10 A
UPUID 10 P0
FIELDS: UPUPRF 10 A
UPUID 10 P0
PGM
Page 90 of 228
DCL VAR(&X) TYPE(*CHAR) LEN(1) + VALUE(' ')
ADDLIBLE LIB(JPHLIB)
/* USED IN SAMPLE 3. */
/*****************************************************************/
/*****************************************************************/
ONE:
OPNQRYF FILE((JPHLIB/QRYSLTPF)) +
QRYSLT(' +
*AND +
') +
Page 91 of 228
OPNID(BRUG)
GOTO CMDLBL(OUT)
/*****************************************************************/
/*****************************************************************/
TWO:
OPNQRYF FILE((JPHLIB/QRYSLTPF)) +
QRYSLT(' +
*AND +
') +
OPNID(BRUG)
GOTO CMDLBL(OUT)
/*****************************************************************/
/*****************************************************************/
THREE:
OPNQRYF FILE((JPHLIB/QRYSLTPF)) +
QRYSLT(' +
*AND +
') +
OPNID(BRUG)
Page 92 of 228
GOTO CMDLBL(OUT)
/*****************************************************************/
/*****************************************************************/
MBROPT(*ADD)
CLOF OPNID(BRUG)
DLTOVR FILE(*ALL)
GOTO CMDLBL(CHOISE)
/* LIBRARY-LIST IS RESTORED */
RCLRSC
RETURN
ENDPGM
DISPLAY-FILE:
A DSPSIZ(24 80 *DS3)
A R F0
A CF03(03 'Afslut')
A 1 69TIME
A 1 63'Time:'
A DSPATR(HI)
A 2 69DATE
A EDTCDE(Y)
A 2 63'Date:'
A DSPATR(HI)
Page 93 of 228
A PROMPT 1A I 24 4DSPATR(ND)
A 24 6'Enter=Run F3=Exit'
A COLOR(BLU)
A USER 10A I 4 35
A 6 12'User id . . . . . . :'
A DSPATR(HI)
A NR 10S 0I 6 35CHECK(FE)
A CHECK(RZ)
A 8 12'Sample . . . . . . :'
A DSPATR(HI)
A EX 1S 0I 8 35RANGE(1 3)
**********************************************************************
**********************************************************************
*_____________________________________________________________________
A R SELECT
*_____________________________________________________________________
A UPUPRF 10 TEXT('USER')
A COLHDG('USER')
A COLHDG('ID')
*_____________________________________________________________________
I hope this will help you understanding some of the basics in OPNQRYF.
Page 94 of 228
However there is a small thing usually wrapped in plastic or hidden on a CD called a manual.
This could be a great help but sometimes very hard to understand and with some stupid
examples that don't work. My samples can be typed in on your AS/400 and it works.
Don't hesitate to send a mail if you want more help or want to discuss some of the above
mentioned topics.
http://publib.boulder.ibm.com/iseries/v5r2/ic2924/info/dbp/rbafomst02.htm
http://publib.boulder.ibm.com/iseries/v5r2/ic2924/info/dbp/rbafomst199.htm#HDROPNQ
F
http://www.geocities.com/SiliconValley/Hills/6632/opnqryf.html
http://publib.boulder.ibm.com/html/as400/v4r5/ic2979/info/db2/rbafomst140.htm#Header_19
9
TESTPF data:
1 Agnie 1,234,567
2 Amudha 3,456,789
TESTPF1 data:
1 Agnie Coimbatore
3 Varun Bangalore
Format of OPNQRYRES – Note that it contains the fields of TESTPF as well as TESTPF1
PGM
Page 95 of 228
/* To select the records present in TESTPF & TESTPF1 and copy that to a new file (which
contains all the fields of TESTPF and TESTPF1 */
FORMAT(SHAILESH/OPNQRYRES) +
JDFTVAL(*NO)
CLOF OPNID(TESTPF)
FORMAT(SHAILESH/TESTPF) +
JFLD((TESTPF/EMPNO TESTPF1/EMPNUM)) +
JDFTVAL(*ONLYDFT)
CLOF OPNID(TESTPF)
FORMAT(SHAILESH/TESTPF1) +
JFLD((TESTPF1/EMPNUM TESTPF/EMPNO)) +
JDFTVAL(*ONLYDFT)
CLOF OPNID(TESTPF1)
ENDPGM
SQLRPGLE
Page 96 of 228
55. SQLRPGLE Example
D PGMEMPNAME S 25A
D EMPID S 5S 0 INZ(00003)
D TSTEMPNAME S LIKE(PGMEMPNAME)
C/EXEC SQL
C/END-EXEC
C/EXEC SQL
C/END-EXEC
C/EXEC SQL
C/EXEC SQL
C/END-EXEC
We have RPG programs that use SQL cursors to sequentially retrieve data. If a program cancels
and I call it again, the program resumes processing a cursor where it left off. I have to sign off
and back on in order to restart from the top. Why doesn't the program start over from the
beginning of the returned data set?
The behavior you're witnessing comes from three contributing factors. First, your program was
compiled to close the cursor when the activation group is destroyed. Second, your program is
running in the default activation group. Third, you are not checking the open of the cursor to
determine whether it succeeds or fails.
Fortunately, this is an easy problem to fix.
Page 97 of 228
Let's look at a program like the ones Lynne is talking about.
Fqsysprt o f 132 printer
F
D zInput ds inz
D zCustNumber 6p 0
D zLastName 8a
D zInitials 3a
D zBalanceDue 7p 2
D zCreditDue 7p 2
D Ratio s 3p 0
/free
exec sql
declare c1 cursor for
SELECT cusnum, lstnam, init, baldue, cdtdue
FROM qiws/qcustcdt
ORDER BY 1;
exec sql
open c1;
dow '1';
exec sql
fetch c1 into :zInput;
if sqlstt >= '02000';
leave;
endif;
eval(h) Ratio = zCreditDue / zBalanceDue * 100;
except pline;
enddo;
*inlr = *on;
/end-free
Oqsysprt e pline 1
O zCustNumber
O zLastName + 1
O zInitials + 1
O zCreditDue j + 1
O zBalanceDue j + 1
O Ratio j + 1
Notice the eval within the do-while loop. I've included this line of code in order to make the
program cancel.
Here's the result set from running the query. This is the data that the program reads as input.
CUSNUM LSTNAM INIT BALDUE CDTDUE
192837 Lee F L 489.50 .50
Page 98 of 228
389572 Stevens K L 58.75 1.50
392859 Vine S S 439.00 .00
397267 Tyron W E .00 .00
475938 Doe J W 250.00 100.00
583990 Abraham M T 500.00 .00
593029 Williams E D 25.00 .00
693829 Thomas A N .00 .00
839283 Jones B D 100.00 .00
846283 Alison J S 10.00 .00
938472 Henning G K 37.00 .00
938485 Johnson J A 3,987.50 33.50
The first time I call the program, I get the following output, followed by escape message
MCH1211, which tells me that the program attempted to divide by zero.
192837 Lee F L .50 489.50 0
389572 Stevens K L 1.50 58.75 3
392859 Vine S S .00 439.00 0
The second time I call the program, I get the following output before I get another MCH1211.
475938 Doe J W 100.00 250.00 40
583990 Abraham M T .00 500.00 0
593029 Williams E D .00 25.00 0
Notice that the second run of the program did not begin with the first record of the result set.
The program was compiled to close the cursor when the activation group is destroyed. The
system destroys named activation groups when the last program in the activation group ends.
However, the default activation group, which is intended for use only with OPM programs, is
destroyed only when the job ends. Therefore, the cursor remained open between invocations.
If I had checked the SQL status variable, SQLSTT, after the open during the first call, I would
have found that SQLSTT contained a value of five zeros, meaning that the open succeeded. But
SQLSTT would have had a value of 24502 after the open in the second call, meaning that the
cursor was already open in the activation group.
So, how do I fix the problem?
The simplest fix is to change the program so that it closes the cursor when the module ends. I do
that by adding the following code to the top of the calcs in the RPG program.
exec sql
set option closqlcsr=*endmod;
You should also consider running the program in a named activation group. You can easily do
this by adding an H spec to the program.
H dftactgrp(*no) actgrp(??????)
I'll leave it to you to think about what activation group name you should replace the questions
marks with. If an RPG program is a standalone application, you can use *NEW.
Also, I encourage you to check the status of the open and to end the program gracefully if it has
a value greater than or equal to 02000.
exec sql
open c1;
if sqlstt >= '02000';
// do something to handle the failed open
Page 99 of 228
57. Sample imbedded SQLRPGLE program
Sample imbedded, or embedded, SQLRPGLE program:
H ActGrp(*CALLER)
H DftActGrp(*NO)
D OpenCursor PR n
D FetchCursor PR n
D CloseCursor PR n
D MyLib s 10a
D MyFile s 10a
/free
*inlr=*on;
if not OpenCursor();
// ...
Else;
Dow FetchCursor();
EndDo;
CloseCursor();
EndIf;
return;
/end-free
P OpenCursor B
D OpenCursor PI like(ReturnVar)
D ReturnVar s n
C/EXEC SQL
C+ Naming = *Sys,
C+ Commit = *None,
C+ UsrPrf = *User,
C+ DynUsrPrf = *User,
C+ Datfmt = *iso,
C+ CloSqlCsr = *EndMod
C/END-EXEC
C/EXEC SQL
C+ System_Table_Name as file
C+ from qsys2/systables
C/END-EXEC
C/EXEC SQL
C+ Open C1
C/END-EXEC
/free
Select;
When SqlStt='00000';
return *on;
Other;
return *off;
EndSl;
/end-free
P OpenCursor E
/eject
D FetchCursor PI like(ReturnVar)
D ReturnVar s n
C/EXEC SQL
C/END-EXEC
/free
Select;
When sqlstt='00000';
ReturnVar=*on;
When sqlstt='02000';
ReturnVar=*off;
Other;
ReturnVar=*off;
EndSl;
return ReturnVar;
/end-free
P FetchCursor E
/eject
P CloseCursor B
D CloseCursor PI like(ReturnVar)
D ReturnVar s n
C/EXEC SQL
C+ Close C1
/free
Select;
When sqlstt='00000';
ReturnVar=*on;
Other;
ReturnVar=*off;
EndSl;
return ReturnVar;
/end-free
P CloseCursor
Static:
Dynamic:
Journal
62. Can anybody tell why Journaling is compulsory before Commitment Control?
Commitment ctrl is use to save /rollback the group of changes and Journaling is use to save the
changed records in Journal receiver.
1. CRTJRNRCV
2. CRTJRN
DAREA
0001.00 DS S 10A
0004.00 C *LOCK IN S
0006.00 C OUT S
0008.00 C SETON LR
OUTPUT
SKANDASAMS/TEST
TESTEX19
0001.00 DA S 4S 0
0003.00 C *LOCK IN A
0005.00 C OUT A
0006.00 C A DSPLY
0007.00 C SETON LR
OUTPUT
DSPLY 5
DSPLY 6
QUEUE NAME
LIB NAME
LENGTH
DATA
WAIT
6. What is the command to create menu?
CRTMNU – Create Menu
7. What is the difference between CALL and Transfer Control (TFRCTL)?
CALL TFRCTL
1.Call will transfer the control according Transfer Control (TFRCTL) will remove the
with the CALL STACK CALL STACK and transfer the control to
the calling program.
2. The CALL is used to different types of TFRCTL is only used in CL programs.
programs.
Ex: RPGILE/400, CL/400, C/400,
COBOL/400.
0005.02 DRES S 2S 0
0012.00 C A TAG
0014.00 C SETON LR
0019.00 C DUMP
0020.00 C GOTO A
0021.00 C ENDSR
Output
DSPLY 102
DSPLY *DETC
DSPLY 0
DSPLY COMING
In RPG IV, the new (V3 R7) ALLOC, REALLOC and DEALLOC operation codes can be
used to allocate memory. This means that at run time, you can go out to the system and ask it to
assign storage to the program that was not allocated to the program when it was evoked.
These operation codes can be used to allocate memory up to 16MB. The allocation can be
assigned to a pointer variable. In RPG IV, pointers have the data-type of asterisk (*). All that is
needed is to allocate memory to a pointer that is used with the BASED keyword of the desired
dynamic array. The example that follows illustrates this technique:
.....DName+++++++++++EUDS.......Length+TDc.Functions++++++++++++++++++
D DynoArr S 7P 0 Dim(10000) based( pDynoArr)
D nSize S 10i 0
.....CSRn01..............OpCode(ex)Extended-factor2++++++++++++++++++
C Eval nsize = %size(DinoArr) * 64
.....CSRn01Factor1+++++++OpCode(ex)Factor2+++++++Result++++++++Len++DcHiLoEq
C Alloc nSize pDynoArr
** We now have enough storage allocated for 64 elements.
To increase or decrease the number of elements in the dynamic array, use the REALLOC
operation code. Simply change the number of bytes that need to be allocated, and call
REALLOC with the new size in Factor 2 and the original pointer variable in the Result field.
REALLOC allocates new storage of the size specified, and copies the original data to that new
location. Then it frees ("deallocates") the original storage.
If you are not on V3 R7, you can still use dynamic memory by calling one of the system
APIs or linking into the QC2LE binding directory and calling the C runtime MALLOC and
DEALLOC functions.
It's all pretty straightforward. If MyDS is a data structure array of 10 elements, then MyDS(5)
will access the fifth element of that data structure array. But how do you access the subfields?
That requires a bit more discussion.
When you define a data structure array, you not only use the Dim keyword, but you must also
specify the qualified keyword. The Qualified keyword was introduced in V5R1, and it allows you
to specify the name of a data structure subfield qualified by the name of the data structure. For
example, if data structure MyDS is defined with the qualified keyword and it contains a subfield
named Subfield1, then you would use the following notation to access the subfield:
MyDS.Subfield1
If data structure MyDS is also defined with the Dim keyword, then something like the following
notation is used to access subfields in a specific element:
MyDS(5).Subfield1
In this example, you would be accessing the subfield named Subfield1 in the fifth element in the
data structure array MyDS.
More precisely, multiple-occurrence data structures are, and have always been, data structure
arrays; they were just implemented poorly and given a goofy IBM name. Of course, this was the
result of the six-character limit on field names and on the Result Field column. Under the
covers, data structure arrays and multiple-occurrence data structures are implemented almost
identically. You see, a data structure is a high-level language (HLL) construct; there is no such
thing as a data structure down at the machine interface (MI) level. That means all data
structures must be implemented in a simulated fashion, regardless if they are simple data
structures, multiple-occurrence data structures or data structure arrays. Interestingly, the MI
language does contain arrays -- and fairly sophisticated ones at that. So, once a data structure is
defined at the MI level, making it into an array is fairly straightforward.
Thankfully, we (i.e., the RPG language) have evolved to where we can actually call data
structure arrays "arrays" instead of "multiple-occurrences." Unfortunately, most, if not all, of
the documentation has not. I have yet to find one definitive statement that explains, for
example, that multiple-occurrence data structures are often interchangeable with data
structure arrays, such as when passed as parameters.
Another good example of the documentation being out of date is the SQL Reference. In the "ILE
RPG," it discusses using multiple-occurrence data structures for multiple-record fetches.
However, it makes no mention of using data structure arrays as an alternative, never mind that
using data structure arrays is actually a better alternative.
Data area size is defined while creation and if the data of the same size is put on the data area
the previous data would get overwritten. For example we have a data area of size 512. First
time you have moved the value of size 512. If you try to move some other data of the same size
(512) the second time, then the first data would be lost since it gets overwritten by the latest
one. But data will be present in the data area even after several retrievals.
On the other hand, we define the size of the data the data queue can hold at the time of
creation. The data queue will grow as and when new data comes in. The number of data in the
data queue is not fixed while creation and the number of data it can hold depend upon the
system space. It is just like the normal queue, it grows when new data comes in. We just set the
size of one data and not the size of the data queue.
For example you have created a data queue of size 100. If you move data for the first time it
will be stored in the first position. Then if you move the second data it will be stored in the
After the data is retrieved once (via receive data queue command) it will be lost. It will be
present in the data till the first retrieval.
In the message queue the message will be present even after several retrievals.
Group data area is created by the system when an interactive job becomes a group job.
Group job is nothing but another job with the same job name but with a different job number.
You will have 2 sessions in the same session itself.
Example:
Assume that you have a session with the Job: QPADEV0008 and the Number: 946578 (Do a
Shift+F3 to get this information after logging in). After creating multiple jobs the job name will
be the same but we will have different job numbers for each session.
DSPDTAARA *LDA
But DSPDTAARA *GDA will give an error message (DTAARA(*GDA) not valid because job not
group job) since this job is not an interactive job.
Now try DSPDTAARA *GDA. It will work, because the interactive job is now changed to a group
job.
Now we have one group job TSTGRPJOB. We are creating another group job like this to explore
the group job concept.
Give the command TFRGRPJOB GRPJOB(*SELECT) and press Enter. Then Press F6 to Start a new
group job.
Note: Instead of QCMD you can give a program name as well. After the program ends the job
will end and control will come back to the previous job from where the TFRGRPJOB is issued.
If you Signoff from any group job session then all the jobs will be ended since signing off from
that job closes the *GDA which internally ends all the jobs present in that group.
Note:
If you do it with Shift + Esc + 1 we can have 2 sessions only with the same job name.
Shift + Esc + 1 will take you to sign on screen. You can login to go to the second session
(meaning second job with the same job name and a new job number), you will be in the same
session even now. If you sign off from that session you will go the first session (place where you
gave Shift + Esc + 1) and not to the Sign on screen – But it is not a group job, we are just
accessing 2 sessions from the same session itself and there is no provision of switching between
the sessions. After completing the work in the second session you have to signoff to come to
the first session. It is just an option to have one more session inside the same session rather
than opening a new session. That’s all.
But with group job concept we can have up to 32 sessions in the same session. With transfer
group job command we can go to different sessions.
D Ds_Fld1 5A
D Ds_Fld2 5S 0
17. Difference between data-structure array and multi occurrence data structure
Data-structure array: Subfield names can contain more than six characters.
MODS: Subfield names cannot contain more than six characters.
18. RPG data structure arrays improvement over multiple-occurrence data structures
In case you haven't yet heard the news, the ILE RPG compiler now supports -- as of V5R2 data
structure arrays. That is, you can now specify the Dim keyword on the definition of a data
structure to dimension that data structure. Just as you can dimension a stand-alone field to
create an array of that type of field, you can now dimension a data structure to create an array
of that kind of data structure.
19. Compile time array, pre run time array run time array
Compile time array is the array which is declared with all the actual values in the program using
CTDATA
Run time array: values are loaded in the array during execution time
You define array on "D" Specification you can load data into an array at compile, with value
entered at end of the program is called = Compile time array.
You define array on "D" Specification you can load data into a array at compile, with value
obtained from a File is called = Pre-Runtime Array
Arrays can be loaded with values during the program execution this is called = Runtime Array
The file used as input must be a sequential program described file. DURING INITIALIZATION,
BUT BEFORE ANY INPUT, CALCULATION, OR OUTPUT OPERATIONS ARE PROCESSED the array is
loaded with initial values from the file. By modifying this file, you can alter the array’s initial
values on the next call to the program, WITHOUT RECOMPILING the program.
FWMERLGP if a e k disk
dQ e DS EXTNAME(WMERLGP:WMERLG:*INPUT)
d QUALIFIED
d next_eid pr 11s 0
d $err s n
/free
setgt *hival wmerlgp;
// read into a ds so as not to disturb the
// global file fields
readp wmerlg Q;
// RNF7701 here!
The answer is that the compiler wants you to use LIKEREC instead of EXTNAME.
Try
dQ Ds LikeRec(WMERLG : *Input )
DEBUG
6. Start servicing the submitted job using STRSRVJOB JOB (number/user/name) (Start
Service job), where "number", "user' and "name" are attributes retrieved from the
submitted job.
8. You are now in the display module source. Don't try to debug or add breakpoints. It's too
early. The job must be active before. Leave this screen using F12.
10. When the job is activated, the start service job window comes. Use F10 to enter debug
command.
11. Use DSPMODSRC (Display module source) command to go back to the source and add
breakpoint wherever you want, using F6
12. Use F12 to resume the job, and F12 once again to go back to the start service job
window.
14. The process breaks at the first breakpoint installed and gives you the control.
16. When the job is finished, you receive a 'Job being serviced ended' message.
When debugging ILE RPG code, to see what a pointer is pointing to, you can use :x or :c when
using the EVAL debugger command on the pointer itself. This means you can debug a pointer's
value without having an RPG BASED variable.
This shows the first 10 bytes that "ptr" is pointing to, as character data: ===> EVAL ptr:c 10
This shows the first 10 bytes that "ptr" is pointing to, in hex: ===> EVAL ptr:x 10
This is useful when the pointer is pointing to data that is not readable as character data—
After that, the basic sequence of events is to STRDBG, set the breakpoints, hit F3 back to the
command line and call your program.
Detailed steps:
1. STRDBG - you may need to specify UPDPROD(*YES), but please be very careful
debugging in a production environment!
2. Set breakpoints. Position the cursor on a line where you want a breakpoint. Press F6.
The debugger will stop before this line is executed. Set as many as you need.
3. If you are debugging a service program, press F14 to see a screen where you can add the
service program (*SRVPGM) to the list of modules under debug control. Use option 5 on
the module line to enter the source and set breakpoints. Press F14 to get back to the
original source.
4. Exit the STRDBG session and get back to the command line.
5. Call your program the way you normally would; from a menu or command line. You
don't necessarily need to call the program under debug; if it's the third one in a series,
you can call the first one and let the programs progress as normal.
There are a few differences between STRISDB and STRDBG: STRISDB WATCH has no equivalent.
WATCH under STRDBG will break when a watched variable changes.
You don't display variables with the "D" command; it's EVAL under STRDBG. To see a variable in
hex, do an eval varname:x. You don't set a value with "c", you use EVAL; eval varname = 'OPEN'.
Look at the help for commands on the command line for a quick reference of the available
commands. Check the language reference manual for details of how to use the debugger with
your target language.
1. Submit your program to batch. The job MUST be held. You can either hold the job queue
(HLDJOBQ) or hold the individual job (HLDJOB) or specify HOLD(*YES) on the SBMJOB
command.
2. WRKSBMJOB/WRKUSRJOB/WRKACTJOB and find your submitted job. Note that the
SBMJOB command gives you an informational message with the job name/number.
You can follow the steps in How can I debug an ILE program in batch? And use the old (no
source) debugger STRDBG.
Mike Barton suggests compiling the program with OPTION (*SRCDEBUG) and then using
STRDBG OPMSRC(*YES), which should work with the steps given above.
STRISDB won't work unless the job is running, so you can't put it on hold and enter your break
points.
Page 120 of 228
Martin Rowe contributed the following idea: Insert a simple CL program into your RPG that
waits for you to answer a message. This way, the job is running, but not processing yet.
(RPG400-L 24 May 2001)
Here is an adaptation of his idea:
Here's the RPG program you're trying to debug:
H 1
C CALL 'DBGWAIT'
C Z-ADD1 X 50
C SETON LR
I've inserted "CALL 'DBGWAIT'" and re-compiled.
Here's the source for DBGWAIT:
pgm
sndusrmsg msgid(CPF9898) +
msgf(QCPFMSG) +
msgdta('Paused for debug') +
msgrpy(&reply)
endpgm
STRISDB PGM (BATCHOPM) UPDPROD (*NO) INVPGM (*NO) SRVJOB (*SELECT) you’ll see a list
of all active jobs on your system. Select the one you're trying to debug. You'll get a message
saying that the program is in debug mode. Answer the "paused for debug" message, and the
source will pop up after the call to DBGWAIT.
Here's a program that uses the QUSRJOBI API. After calling the API, the Job Type field (QUSJT04)
will contain a B for batch or I for interactive. If you don't pass the internal job name (don't pass
anything) it will retrieve information about the current job.
DQUSI020000 DS
D* Qwc JOBI0200
D QUSBR01 1 4B 0
D* Bytes Return
D QUSBA01 5 8B 0
D* Bytes Avail
D QUSJN03 9 18
D* Job Name
D QUSUN03 19 28
D* User Name
D QUSJNBR03 29 34
Page 121 of 228
D* Job Number
D QUSIJID01 35 50
D* Int Job ID
D QUSJS05 51 60
D* Job Status
D QUSJT04 61 61
D* Job Type
D QUSJS06 62 62
D* Job Subtype
D QUSSN 63 72
D* Subsys Name
D QUSRP01 73 76B 0
D* Run Priority
D QUSSPID00 77 80B 0
D* System Pool ID
D QUSCPUU00 81 84B 0
D* CPU Used
D QUSAIOR 85 88B 0
D* Aux IO Request
D QUSIT 89 92B 0
D* Interact Trans
D QUSRT 93 96B 0
D* Response Time
D QUSFT 97 97
D* Function Type
D QUSFN15 98 107
D* Function Name
D QUSAJS 108 111
D* Active Job Stat
D QUSNDBLW 112 115B 0
D* Num DBase Lock Wts
D QUSNIMLW 116 119B 0
D* Num Internal Mch Lck Wts
D QUSNDBLW00 120 123B 0
D* Num Non DBase Lock Wts
D QUSTDBLW 124 127B 0
D* Wait Time DBase Lock Wts
D QUSTIMLW 128 131B 0
D* Wait Time Internal Mch L
D QUSNDBLW01 132 135B 0
D* Wait Time Non DBase Lock
D QUSERVED45 136 136
D* Reserved
D FormatName S 8 Inz('JOBI0200')
D InJobName S 26
D IntJobName S 16
D JobName S 26 Inz('*')
D Outcount S 5 0
D ReceiveLen S 10i 0 Inz(187)
c *entry Plist
c Parm InJobName
c If %parms > 0
c Eval JobName = InJobName
c Endif
Create the program EMPRPT so that you can debug it using the source debugger. The DBGVIEW
parameter on either CRTBNDRPG or CRTRPGMOD determines what type of debug data is
created during compilation.
The parameter provides six options which allow you to select which view(s) you want:
* *STMT — allows you to display variables and set breakpoints at statement locations using a
compiler listing. No source is displayed with this view.
* *COPY — creates a source view and a view containing the source of any
/COPY members.
The program will be created in the library MYLIB with the same name as the source member on
which it is based, namely, EMPRPT. Note that by default, it will run in the default named
activation group, QILE. This program object can be debugged using a source view.
STRDBG EMPRPT
Programming Concepts
Figure shows the specific steps in the general flow of the RPG IV program cycle. A program cycle
begins with step 1 and continues through step 7, then begins again with step 1.
During the last time a program goes through the cycle, when no more records are available, the
LR (last record) indicator and L1 through L9 (control level) indicators are set on, and file and
data area cleanup is done.
1 All heading and detail lines (H or D in position 17 of the output specifications) are processed.
2 The next input record is read and the record identifying and control level indicators are set
on.
3 Total calculations are processed. They are conditioned by an L1 through L9 or LR indicator, or
an L0 entry.
4 All total output lines are processed (Identified by T at position 17 of output specifications).
5 It is determined if the LR indicator is on. If it is on, the program is ended.
6 The fields of the selected input records are moved from the record to a processing area. Field
indicators are set on.
Dynamic Bind:
Suppose pgm A is calling pgm B. In current scenario, pgm A will get compiled irrespective of
pgm B object (*pgm), is there or not. It will give an error at runtime, but not at compile time
since this is a dynamic bind.
Static bind:
Suppose pgm A is calling pgm B. In current scenario, pgm A will not get compiled if pgm B
object (*pgm) not there. It will give an error at compile time since this is a static bind.
CRTBNDRPG: Here the module is been created internally (a temporary one) and the *PGM is
been created.
CRTRPGPGM: Here the module a permanent one is created and the *PGM is been created.
4. Hidden Fields:
In the hidden fields, the fields that are been hidden have the previously entered values below
and on F5 the values previously entered will be available on the field.
Not necessary. We can write the codes after SETON LR also and it will execute that too. The
main difference is that the program will end after the last line of coding you did and will clear all
the access path and variables to blanks or zeros.
But when you give RETURN then the program will not execute the below coding part and will
end as soon as the RETURN is encountered, but here it will not clear the access path and the
variables. If you run the program again you will find the last value in the variable.
While writing a program Last statement of RPG program need not be LR. It is the last
executable statement. I.e. after all processing is done LR (Last Record indicator) will be set on.
NOTE: In a program that does not contain a primary file; you can set the LR indicator on as one
method to end the program.
LR is generally set on after all processing is done i.e. at the end of the program but there is no
hard and fast rule for that.
No, But you can give a constant Value in physical file field and you can specify that field as a key
field.
In PF
7. Which keyword is used both in subfile and subfile control record format of a DSPF?
SETOFF 03 'Exit'
SETOFF 12 'Cancel'
In Interactive jobs user interaction to called job. But in batch jobs user interaction not required
(actions taken by System).
Interactive job using "CALL" command (CALL PROGRAMNAME) to run program and you can't
use your pc until program ends. Batch job using "SBTJOB" command
(SBMJOB"CALL/PROGRAMNAME") to run program and you can use your pc and the program
will run in the batch (QBATCH) you can see this use WRKACTJOB command.
Both (COLHDG & ALIAS) are used to identify fields. COLHDG & ALIAS is the Description of fields.
The difference is that in ALIAS we can access data based on that ALIAS name, while COLHDG is
not allowed. Suppose in PF field name as DES78, give ALIAS as Description78, then user can
access data from using Description78.
If you pass a parameter by value, you are free to change the variable defined by the procedure
interface (you might want to change blanks to zeroes, double quotes, strip leading zeroes). For
a CONST parameter you would have to copy to a local variable first.
The point is that in both cases the caller is assured that his variable won't be changed by the
called procedure, but the called procedure can use VALUE parameters as work variables,
whereas CONST parameters are not allowed to be used in any way except "read-only."
When a parameter is passed by reference, the called procedure receives a pointer to the
parameter. When a parameter is passed by value, the called procedure receives the actual
value. Since a call to a program always passes parameters by reference (on the Iseries at least),
VALUE is not allowed on program prototypes (EXTPGM keyword), but CONST is allowed.
11. CL – EOF:
When the end of file is reached, message CPF0864 is sent to the procedure or OPM program.
The CL variables declared for the record format are not changed by the processing of the RCVF
command when this message is sent. You should monitor for this message and perform the
appropriate action for end of file. If you attempt to run additional RCVF commands after end of
file has been reached, message CPF0864 is sent again.
All the files will have a value for Level Check after compilation if the parameter Level check
(*yes) is given. If the file is modified and compiled again, it will get a new value for level check.
If the parameter Level Check(*yes) is given for the file and the program using that file is not
compiled after the file is modified and compiled, then the program will encounter level check
error at the time of execution.
If *INLR = *ON is specified in a program, it instructs the compiler that all the operations should
be terminated (i.e., if file is opened implicitly it should be closed, data movement to/from data
area should happen etc) before exiting the program. Even if there are any executable
statements following that they will be executed once.
Now, *INLR = *ON, followed by RETURN will terminate the operations and return to the caller.
Any executable statements that follow these 2 statements will not be executed.
http://publib.boulder.ibm.com/infocenter/iadthelp/v7r0/index.jsp?topic=/com.ibm.etools.iseri
es.langref.doc/evferlsh320.htm
15. EDTCDE & EDTWRD, OVERLAY, RSTDSP, Command Attention key and Command
Function Key and Validity check:
• OVERLAY
It allows a record format to be displayed on screen retaining the previous displayed
record formats.
• CF transfers the changed data and CA transfers only the indicator value.
The Program Status Data Structure is the way the RPG compiler informs the program what is
happening at runtime. This is explained in the RPG reference under File and Program
Exception/Errors. For V5R1 English, here is the link:
http://publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c092508380.htm#HDRPROGXPE
D SDS
D PROC_NAME *PROC * Procedure name
D PGM_STATUS *STATUS * Status code
D PRV_STATUS 16 20S 0 * Previous status
D LINE_NUM 21 28 * Src list line nu
D ROUTINE *ROUTINE * Routine name
D PARMS *PARMS * Num passed parms
D EXCP_TYPE 40 42 * Exception type
D EXCP_NUM 43 46 * Exception number
D PGM_LIB 81 90 * Program library
D EXCP_DATA 91 170 * Exception data
D EXCP_ID 171 174 * Exception Id
D DATE 191 198 * Date (*DATE fmt)
D YEAR 199 200S 0 * Year (*YEAR fmt)
D LAST_FILE 201 208 * Last file used
D FILE_INFO 209 243 * File error info
D JOB_NAME 244 253 * Job name
D USER 254 263 * User name
D JOB_NUM 264 269S 0 * Job number
D JOB_DATE 270 275S 0 * Date (UDATE fmt)
D RUN_DATE 276 281S 0 * Run date (UDATE)
D RUN_TIME 282 287S 0 * Run time (UDATE)
D CRT_DATE 288 293 * Create date
D CRT_TIME 294 299 * Create time
D CPL_LEVEL 300 303 * Compiler level
D SRC_FILE 304 313 * Source file
D SRC_LIB 314 323 * Source file lib
D SRC_MBR 324 333 * Source file mbr
D PROC_PGM 334 343 * Pgm Proc is in
D PROC_MOD 344 353 * Mod Proc is in
D CURR_USER 358 367 * Mod Proc is in
* Status codes
* Normal Codes
* Code Condition
* 00000 No exception/error occurred
* 00001 Called program returned with the LR indicator on.
* Exception/Error Codes
* Code Condition
* 00100 Value out of range for string operation
* 00101 Negative square root
The File information data structure is the way the RPG runtime environment informs the
program about the status of a file, seen from the operating system perspective. Sometimes
called a feedback data structure, it is updated after every I/O operation (RPG IV) or after a block
of records is transferred (RPG/400).
Information can be found in the RPG reference under File and Program Exception/Errors. For
V5R1 English, here is the link:
http://publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c092508377.htm#HDRFILEXPE
D* Disk
D FDBK_SIZE 367 370I 0 * Size of DB fdbk
D JOIN_BITS 371 374I 0 * JFILE bits
D LOCK_RCDS 377 378I 0 * Nbr locked rcds
D POS_BITS 385 385 * File pos bits
D DLT_BITS 384 384 * Rcd deleted bits
D NUM_KEYS 387 388I 0 * Num keys (bin)
D KEY_LEN 393 394I 0 * Key length
D MBR_NUM 395 396I 0 * Member number
D DB_RRN 397 400I 0 * Relative-rcd-num
D KEY 401 2400 * Key value (max
D* * size 2000)
D* ICF
D ICF_AID 369 369 * AID byte
D ICF_LEN 372 375I 0 * Actual data len
D ICF_MAJOR 401 402 * Major ret code
D ICF_MINOR 403 404 * Minor ret code
D SNA_SENSE 405 412 * SNA sense rc
D SAFE_IND 413 413 * Safe indicator
D RQSWRT 415 415 * Request write
D RMT_FMT 416 425 * Remote rcd fmt
D ICF_MODE 430 437 * Mode name
D* Display
D DSP_FLAG1 367 368 * Display flags
D DSP_AID 369 369 * AID byte
D CURSOR 370 371 * Cursor location
D DATA_LEN 372 375I 0 * Actual data len
D SF_RRN 376 377I 0 * Subfile rrn
D MIN_RRN 378 379I 0 * Subfile min rrn
D NUM_RCDS 380 381I 0 * Subfile num rcds
* Status codes
* Normal Codes
* Code � Device � RC � Condition
* 00000 � � � No exception/error.
* 00002 �W � n/a � Function key used to end display.
* 00011 � W,D,SQ � 11xx � End of file on a read (input).
* 00012 � W,D,SQ � n/a � No-record-found condition on a CHAIN, SETLL, and SETGT
* 00013 �W � n/a � Subfile is full on WRITE operation.
* Exception/Error Codes
* Code � Device � RC � Condition
* 01011 � W,D,SQ � n/a � Undefined record type (input record does not match rec
* � � � indicator).
* 01021 � W,D,SQ � n/a � Tried to write a record that already exists (file bein
* � � � key is duplicate, or attempted to write duplicate rela
* � � � subfile).
* 01022 �D � n/a � Referential constraint error detected on file member.
* 01023 � D,SQ � n/a � Error in trigger program before file operation perform
* 01024 � D,SQ � n/a � Error in trigger program after file operation performs
* 01031 � W,D,SQ � n/a � Match field out of sequence.
* 01041 � n/a � n/a � Array/table load sequence error.
* 01042 � n/a � n/a � Array/table load sequence error. Alternate collating s
* 01051 � n/a � n/a � Excess entries in array/table file.
* 01071 � W,D,SQ � n/a � Numeric sequence error.
* 01121(4) � W � n/a � No indicator on the DDS keyword for Print key.
* 01122(4) � W � n/a � No indicator on the DDS keyword for Roll Up key.
* 01123(4) � W � n/a � No indicator on the DDS keyword for Roll Down key.
* 01124(4) � W � n/a � No indicator on the DDS keyword for Clear key.
When a variable is declared within a CL program, the system assigns storage for that variable
within the program automatic storage area (PASA). If you subsequently use the variable as a
parameter within a CALL command, the system does not pass the value of that variable to the
called program, but rather a pointer to the PASA of the calling program. This is known as
parameter passing by reference.
PgmA: Pgm
EndPgm
EndPgm
Hopefully, you've noticed that the first parameter is declared to be larger in PgmB than it was in
PgmA. Although you might expect &i_Var1 to contain 'AB ' after the call, the following is what
the input parameters in PgmB actually contain:
&i_Var1 = 'ABYZ'
&i_Var2 = 'YZ'
&i_Var1 shows the contents of the first parameter, and the second, because the second
parameter is immediately adjacent to the first within the storage area. If the second parameter
was not contiguous to the first, then the last two bytes of &i_Var1 would show whatever
happened to be in the storage area at that time.
You can think of &i_Var1 as a 4-byte "window" into the storage area of the calling program. It's
passed a pointer that tells it where the view begins, and it accesses anything in storage from
that point up to the parameter's declared length.
Looking at Literals
There are several ways that a program can be called, other than from another program.
Examples include the command line, SBMJOB, job scheduler etc. In the case of an interactive
call from the command line, you specify the parameters as literals, ie:
PgmC: Pgm
EndPgm
We have invalid pointers because PgmC is no longer running. If you've ever tried this
personally, you know that it doesn't happen in practice. The reason for that is that the system is
converting those variables to literals before issuing the CALL command. It’s very sneaky, but
effective.
Now that we've seen some examples of where literals are used, and why, it's time to talk about
the PASA again. When we discussed the basics of CL parameter passing, we learned that the
called program expects to receive a pointer to a storage area within the PASA for each input
parameter. This requirement hasn't changed. So now we have a situation where the CALL
command is passing literals, but the called program is still expecting pointers.
Obviously, it's time for the system to perform some more magic behind the scenes. In order to
accommodate the requirements of the called program, the system creates a space in
temporary storage for each literal being passed, and moves the value of the literal into that
storage space. Now it can pass pointers to the called program, and everyone is happy.
Except you that is, because none of this changes the fact that you're getting "garbage" in the
input variables of your called program! Fair enough. I'm getting to that now, but you needed
the background in order to understand the next part.
Now that you know the system is creating variables behind the scene, you might wonder how it
knows what size those variables need to be. The answer is that it doesn't. Instead, the designers
have imposed some specific rules about how literals are transformed to variables, and thereby
passed as parameters.
CL supports only three basic data types: character, decimal, and logical. For the purposes of this
discussion, you can consider the logical data type equivalent to the character type, because it's
treated in the same manner.
The simplest rule is the one that handles decimal literals. All decimal literals will be converted
to packed decimal format with a length of (15 5), where the value is 15 digits long, of which 5
digits are decimal places. Therefore, any program that you expect to call from the command
line, or SBMJOB etc., needs to declare its numeric input parameters as *DEC(15 5).
Character literals are a little bit more complicated, but still fairly straightforward. There are two
rules to remember. The first is that any character literal up to 32 characters in length will be
converted to a 32 byte variable. The value is left justified, and padded on the right with blanks.
The second rule is that character literals longer than 32 bytes are converted to a variable of the
same length as the literal value itself, as in the following example:
Call PgmB 'This is a long character literal that will exceed 32 bytes.' the associated storage space
for that literal would contain:
'This is a long character literal that will exceed 32 bytes.'
Finally, since the logical data type follows the same rules as the character type, and the only
possible values for a logical data type are '0' or '1', we know that a logical literal will always be
created as a 32 byte, left justified, padded character variable.
Parameter Problems
In the beginning of this explanation, you learned that it was important for the parameter
declarations to match between a called program and its caller. Then you discovered that the
system sometimes has to take it upon itself to declare the parameters of the caller on your
behalf. If the two declarations don't match, we have the potential for trouble.
In the case of a decimal value, the result is immediate and obvious; you get a data decimal
error. Character variables are more difficult to debug because they don't generate any
Page 142 of 228
immediate errors. What actually happens depends upon the length of the parameter in the
called program. If the length of the parameter in the called program is less than the length of
the parameter being passed, the extra characters are effectively truncated, as follows:
EndPgm
Things get nasty when the declared length of the variable is longer than what is being passed
in. Using the same example as we've just seen above:
EndPgm
In this case, the system will still allocate 32 bytes of storage and assign
'ABCDEFGxxxxxxxxxxxxxxxxxxxxxxxxx' to it, but because &i_Var1 is now declared to be 34 bytes
long, SomePgm will see more storage than it was intended to. It will see the 32 bytes that were
allocated for it, plus two additional bytes. It's those two additional bytes that can cause the
infamous "unpredictable results" which IBM's documentation often refers to.
If the extra bytes contain blanks, chances are that you won't notice a problem, but if they
contain something else, your input parameter will contain "garbage".
As you can see, when dealing with literals, the magic number for character parameters is 32. If
the called program declares the parameter to be less than or equal to 32, you'll never see
"garbage" in the parameter. Once you cross that 32 byte threshhold, you need to take extra
care to ensure that the size of the literal being passed is equal to the declared size of the input
parameter.
Things to Remember
And last, but not least: the called program "sees" as much storage as it declares for an input
parameter, regardless of whether or not the caller actually allocated that much storage for it.
How to easily create a CMD object to start your CL program and avoid these errors:
http://faq.midrange.com/data/cache/576.html
D Result S 5A Inz('A')
D Factor1 S 5A Inz('B')
D Factor2 S 5A Inz('C')
D Var1 S 5A Inz('X')
C Call 'TSTENTRY'
C Factor1 Parm Factor2 Result
C *Entry Plist
C Fact1 Parm Fact2 Res
C Eval *Inlr = *on
Soon after entering TSTENTRY - Factor 2 gets moved to Result. Factor 1 and Factor 2 gets
cleared
Factor1 = ' '
Factor2 = ' '
Result = C
Before leaving TSTENTRY - Result is moved to Factor 1. Now Result is not cleared after value is
moved.
Factor1 = C
Factor2 = ' '
Result = C
After returning to the calling program TSTCALL - Factor 1 gets moved to Factor 2. Factor 1 gets
cleared.
Factor1 = ' '
Factor2 = C
Result = ' '
CL
*FILE, *PGM, and *DTAARA
CLE
*SRVPGM
CLLE
*FILE, *PGM, *DTAARA, and *SRVPGM
RPG
*FILE, *DTAARA, and *PGM
RPGLE
*FILE, *PGM, *DTAARA, and *SRVPGM
If the information is written to a database file, the database file will have a record format
named QWHDRPPR. The fields in record format QWHDRPPR are the same as the fields in the
IBM-supplied format QWHDRPPR in file QADSPPGM in the library QSYS. The following
information is contained in the database file:
Note: This command lists which objects are referenced when the object is created or updated
using UPDPGM or UPDSRVPGM. The referenced object names and libraries listed may be
different than the actual names of the objects, since this information is stored when the
program is created. Entries can be added as the ILE program or service program is updated
using UPDPGM or UPDSRVPGM, but entries are never removed. If the object has been moved
since the program was created, or an override was in effect during creation, the names listed
may differ from the actual names.
Restrictions:
1. The user must have object operational authority for the program.
2. Also, of the libraries specified by the library qualifier, only the libraries for which the
user has read authority are searched for the programs.
Examples:
DSPPGMREF PGM(LIBRARY1/*ALL) OUTPUT(*OUTFILE)
OUTFILE(LIB2/FILE2)
Omitting Parameters:
When calling a program or procedure, you may sometimes want to leave out a parameter. It
may be that it is not relevant to the called procedure.
The primary difference between the two methods has to do with how you check to see if a
parameter has been omitted. In either case, an omitted parameter cannot be referenced by the
called procedure; if it is, unpredictable results will occur. So if the called procedure is designed
to handle different numbers of parameters, you will have to check for the number of
parameters passed. If *OMIT is passed, it will 'count' as a parameter.
Passing *OMIT
You can pass *OMIT for a prototyped parameter if the called procedure is aware that *OMIT
might be passed. In other words, you can pass *OMIT if the keyword OPTIONS (*OMIT) is
specified on the corresponding parameter definition in the prototype. When *OMIT is specified,
the compiler will generate the necessary code to indicate to the called procedure that the
parameter has been omitted.
Note:
*OMIT can only be specified for parameters passed by reference.
To determine if *OMIT has been passed to an ILE RPG procedure, use the %ADDR built-in
function to check the address of the parameter in question. If the address is *NULL, then *OMIT
has been passed. You can also use the CEETSTA (Check for Omitted Argument) bind able API.
Ex:
*------------------------------------------------------------------
* CEETSTA (Test for omitted argument) -- ILE CEE API
* 1. Presence flag Output Binary(4)
* 2. Argument number Input Binary(4)
*------------------------------------------------------------------
D CEETSTA PR EXTPROC('CEETSTA')
You can specify both *NOPASS and *OMIT for the same parameter, in either order, that is,
OPTIONS (*NOPASS:*OMIT) or OPTIONS (*OMIT:*NOPASS).
As an example of OPTIONS (*NOPASS), consider the system API QCMDEXC (Execute Command)
which has an optional third parameter.
*-------------------------------------------------------------
* This prototype for QCMDEXC defines three parameters:
* 1- a character field that may be shorter in length
* Than expected
* 2- Any numeric field
* 3- An optional character field
*-------------------------------------------------------------
D qcmdexc PR EXTPGM('QCMDEXC')
D cmd 3000A OPTIONS(*VARSIZE) CONST
D cmdlen 15P 5 CONST
D 3A CONST OPTIONS(*NOPASS)
By externalizing we mean that all READ, CHAIN, and other database operations are located in
separate routines and programs that require I/O make requests to these routines to perform
the operation on their behalf.
0001.00 di s 5p 0 inz(1)
0002.00 dn s 5p 0 inz(10)
0004.00 c i dsply
0005.00 c endfor
0007.00 c i dsply
0008.00 c endfor
0008.01*for(I=5;I<40;i=i+10)
0010.00 c i dsply
0011.00 c endfor
0013.00 c i dsply
0014.00 c endfor
0015.00 c seton lr
OUTPUT
DSPLY 1 DSPLY 10
DSPLY 2 DSPLY 9
DSPLY 3 DSPLY 8
DSPLY 4 DSPLY 7
DSPLY 5 DSPLY 6
DSPLY 6 DSPLY 5
DSPLY 7 DSPLY 4
DSPLY 8 DSPLY 3
DSPLY 9 DSPLY 2
DSPLY 5 DSPLY 5
DSPLY 15 DSPLY 15
DSPLY 25 DSPLY 25
DSPLY 35 DSPLY 35
25. What are the various stages for a job after it is submitted?
Job queue, Active job, and OUTQ are the three stages after the job has been submitted.
28. How to see source of copybooks include in a program while compiling or debugging?
While compiling the program give *list instead of *source which will expand all the copybooks.
31. How you can import and export a data type between 2 programs?
If you are using an export statement when declaring a variable then the data type can be imported in any
modules that is bind either by value or by reference. So in this case we can pass values in between modules
instead of using PLIST and *ENTRY.
EX21
0006.00 C 03 LEAVE
0007.00 C IF *IN08=*ON
0009.00 C LEAVE
0010.00 C ENDIF
0011.00 C ENDDO
0014.00 C 03 LEAVE
0015.00 C IF *IN07=*ON
0017.00 C LEAVE
0018.00 C ENDIF
0020.00 C 03 LEAVE
0021.00 C ENDDO
0022.00 C SETON LR
Assume
Type Y (Yes) to select the ASSUME keyword. It causes the AS/400 system to assume that this
record appears on the display when the file is opened. Use this keyword to receive data that a previous
program has left on the display.
Overlay
Type Y (Yes) to allows the overlaying of fields on the record without erasing the entire display.
Note: If you type anything other than Y or blank, your entry will be ignored. You must specify the
OVERLAY keyword to select the other keywords on this display, with the exception of PUTOVR.
Why would you want to do this? Perhaps we can best answer that question by posing one of
our own. Suppose that during discussions with your users, it becomes apparent to you that the
business needs have changed. After having studied the new requirements for a while, you
realize that you need to redesign the database to accommodate these changes.
Would you:
• Decide that doing the right thing is just too much work, and just "hack" the database one
more time.
Externalizing the I/O operations of databases provides one way of helping to ensure that your
applications can adapt quickly and (relatively) painlessly to changing business needs. Instead of
coding a READ, CHAIN, or whatever at each point in the program where database access is
required, you invoke a routine to perform the I/O for you.
37. What is the disadvantage of using Validity Check keyword? How to overcome these
disadvantages?
38. Chain:
39. Which of the following operations does NOT zero the field FLDA defined as 4,0?
40. How can you check for a records existence without causing and I/O (CHAIN/READ)?
With the help of File Information Data Structure, we can check existence of records in
a physical file. The code is described below:
In File description continuation line (IPFK)
KINFDS RCDS
41. What is the difference between UDATE and the system date?
UDATE supports two-digit year. The format is *MDY (MMDDYY).
*DATE (system date) supports four digit year. The format is *MDYY (MMDDYYYY).
42. Describe the difference between the DOWxx and DOUxx operations?
DOWxx : If the condition becomes true, then only the group of instructions allowed
executing.
DOUxx : Irrespective of condition, it will execute at least one time.
FORDHDR1 IF E K DISK
ORDHDRF KRENAMEORDHDRF1
In order to rename the record format of a data base file in a program, we can use the above
steps. Purpose of renaming is: If the record format name is similar in two files and if both are
used in a same program, the program will not compile. Hence we have to rename either of the
file.
Using this record level keyword, you can specify cursor location on an output operation to the
record format you are defining. The program sends output after setting the cursor location.
50. How can you detect and handle a record lock situation?
If you try to read the locked record, we can get system defined message i. e. , the
program will ended abnormally. With the help of File Information Data Structure we can
handle record lock situation. Generally it will happen, when the same file of type " U"
used in different programs.
51. How can you detect overflow for a print program that prints multiple lines per
cycle?
You specify the indicators OA through OG and OV in 33 - 34 columns in a printer file.
This indicator automatically set on whenever overflow occurs on a type of page.
52. How would you design the process for a nightly, high volume check producing
process that needs to select only records that are flagged to be processed?
With the help of OPNQRYF Clp command, we can select the records from the data base
file. The process involves following steps:
53. How would you join 3 separate fields, a first name, middle initial and last name
together as 1 field with proper spacing? You can describe in either RPG and/or RPG
ILE (Integrated Language Environment)
54. When PGMA calls PGMB for the first time PGMB executes the *INZSR. PGMB uses
the RETRN operation to return to PGMA. When PGMA call PGMB the second time is
the *INZSR executed?
If you specify RETRN in called program, the *INZSR will not execute again.
55. Show 2 ways to convert a date from YYMMDD to MMDDYY (MULT operation not
acceptable)
PGM
DCL VAR(&VAR1) LENGTH(6) TYPE(*CHAR) VALUE('YYMMDD')
DCL VAR(&RCVD) LENGTH(6) TYPE(*CHAR)
DCL VAR(&VAR2) LENGTH(4) TYPE(*CHAR)
DCL VAR(&VAR3) LENGTH(2) TYPE(*CHAR)
CHGVAR VAR(&VAR2) VALUE(%SST(&VAR1 3 4))
CHGVAR VAR(&VAR3) VALUE(%SST(&VAR1 1 2))
CHGVAR VAR(&RCVD) VALUE(&VAR2 *CAT &VAR3)
SNDMSG MSG(&RCVD) TOUSR(*USRPRF)
ENDPGM
a. Cost = $110. 00
b. Tax = 20%
c. MarkUp= 05%
d. Sale = 10%
57. Define the purpose of Factor 1 the Operation Code and *IN15 in following code
HI LO EQ
C *YMD Test(D) yymmddDate 15
The SETLL operation positions a file at the next record with a key or relative record number
that is greater than or equal to key or relative record number specified in factor1.
The SETGT operation positions a file at the next record with a key or relative record
number that is greater than key or relative record number specified in factor 1.
Specifies whether the level identifiers of the record formats in the physical file are
checked when the file is opened by the program.
76. What is the difference between access path and Dynamic select?
Dynamic select occurs whenever the program reads file. But access path occurs before
the file is read (but not necessarily). Because access path maintenance performed on the
file.
78. What is the difference between Packed decimal and Zoned decimal?
Packed decimal: One digit occupies 1 byte.
Zoned decimal: One digit occupies 2 bytes.
79. What is default data type (if you define decimals '0') in Physical file?
Packed decimal
80. What is default data type for the fields(sub fields) defined in data structures in
RPG?
Zoned decimal
81. When do you explicitly open files and close files in an RPG program?
If you specify the letter ' U ' at column 73-74, you need to be open and close files
explicitly in a RPG program.
92. Can more than one subfile record be displayed on one line?
Yes, by using SFLLIN keyword.
95. Howto pick up the changed records every time in a subfile after the first change
made?
Seton SFLNXTCHG keyword indicator and update the subfile record.
97. How to toggle between single line and Multi - line display of a particular record in a
subfile?
Using SFLDROP keyword.
116. How do you specify page overflow indicator for printer files in RPG?
Specify an indicator in position 33-34 of F specification.
118. Can an indexed file be accessed in arrival sequence in RPG program? Yes.
121. Can you specify a display file to be used in the following modes Input,
Output, or Combined modes? Yes.
125. What are the different Opcodes available in RPG for Database access?
READ, CHAIN, WRITE, UPDAT, DELET, SETLL, SETGT, READE, READP, REDPE, OPEN, CLOSE,
FORCE, NEXT, UNLCK.
309. How can database records be read without lock ?
Put 'N' in position 53 of C specs.
129. What are the uses of FACTOR1, FACTOR2 and RESULT field for the RPG operation
code PARM?
By using FNDSTRPDM.
NOT POSSIBLE.
132. What is the difference between normal UPDDTA to PF and updating using
DFU program?
Both are same only difference is DFU allows you to add or change selected fields
Sub Procedures:
Yes
P, D, C only.
• By reference (default)
To invoke a stored procedure we use the SQL CALL statement. This statement contains the
name of the stored procedure and any arguments passed to it. Arguments may be constants,
special registers, or host variables. Here is an example how to call stored procedure and pass
two arguments:
/Exec Sql
/End-Exec
Easiest way to return a completion status to the SQL program issuing the CALL statement is to
code an extra INOUT type parameter and set it prior to returning from the procedure. Another,
more complicated method of returning a completion status is to send an escape message to the
calling program (operating system program QSQCALL) which invokes the procedure.
Modules
ADTS CS (for Windows Ñ) is a workstation product that includes two server access
programs:
CODE/400 contains features to help edit, compile, and debug: RPG, ILE RPG,
COBOL, ILE COBOL, Control Language (CL), ILE C, and ILE CL host source programs; design
display, printer, and database host files; and manage the components that make up your
application. This enhances program development and moves the program development
workload off the host. The application, when built, runs on an AS/400. For RPG and ILE RPG
application development and maintenance, CODE/400 provides:
* Language sensitive editing— includes token highlighting, format lines, a full suite of
prompts, and online help.
* Program verification— performs, at the workstation, the full range of syntax and
semantic checking that the compiler does, without generating object code
* Source-level debugging
* A DDS design utility—allows you to easily change screens, reports, and database files
Visual Age for RPG offers a visual development environment on the workstation platform
for RPG application developers to develop, maintain, and document client/server
applications. Applications can be edited, compiled, and debugged on your workstation. The
applications, when built, are started on a workstation and can access AS/400 host data and
other AS/400 objects. Its integrated components allow application developers to preserve
their current skills and easily develop AS/400 RPG applications with graphical user
interfaces.
An ILE RPG module consists of a main procedure and zero or more sub procedures. (If there
are sub procedures, the main procedure is optional.) A main procedure is a procedure that
can be specified as the program entry procedure (and so receive control when an ILE
program is first called). The main procedure is defined in the main source section, which is
the set of H, F, D, I, C, and O specifications that begin a module. In V3R1, all ILE RPG
modules had a main procedure and no other procedures.
* Names that are defined within sub procedure are not accessible outside the sub
procedure.
Sub procedures can provide independence from other procedures because the data items
are local. Local data items are normally stored in automatic storage, which means that the
value of a local variable is not preserved between calls to the procedure.
Sub procedures offer another feature. You can pass parameters to a sub procedure by
value, and you can call a sub procedure in an expression to return a value.
Sub Files
Y=Yes Indicators/+
F3=Exit F12=Cancel
0007.00 C SETOFF 28
RPGLE Opcodes
EXFMT
If SFLDSP and SFLDSPCTL indicators are on, this opcode will send the
two subfile record formats to the display device and waits for the user’s
response.
WRITE – (SFL)
This opcode is used to add a record to the subfile record format
RRN value should be set with a non-existing value before adding the
record in the subfile record format.
WRITE (SFLCTL)
This keyword is used for clearing & display the subfile
SFLDROP (subfile drop)
This control record level keyword is used to assign a CA (command attention) or
CF (command function) key. The program first displays the subfile in truncated form;
subfile records are truncated to fit on one display line. When the user presses the
specified key, the program displays the records in the folded form.
Or
Subfile Initially Truncated - Help Type a command function (CF) or command
attention (CA) key number to assign a CF or CA key to specify if a subfile control record
requiring more than one display line should be truncated to one line, or should be
folded to display on two lines. When this keyword is specified, the subfile is first
displayed in truncated form. The operator presses the specified CF or CA key to switch
from truncated form to folded form or from folded form to truncated form.
NEWEMP
0001.00 UNIQUE
0002.00 R EMPNEW
0009.00 K EMPNOM
DATA FILE
Display Report
SKANDASAMO/SUBFILE
SUB04
0016.03 C ENDIF
0017.00 C 03 LEAVE
0018.00 C ENDDO
0019.00 C SETON LR
SKANDASAMO/SUBFILE
SELOADALL3
0003.00 F SFILE(SENWND1:RRN1)
0005.00 C SETON 28
0007.00 C SETOFF 28
0014.00 C 30 LEAVE
0015.00 C ENDDO
0016.01 C 03 LEAVE
0020.00 C ENDDO
0021.00 C SETON LR
Record . . . : MAIN1
Y=Yes
General keywords . . . . . . . . Y
Application help . . . . . . . .
Record . . . : MAIN1
Select parameters . . . . . . . . . . . . . . .
Select parameters . . . . . . . . . . . . . . .
Select parameters . . . . . . . . . . . . . . .
Select parameters . . . . . . . . . . . . . . .
Record . . . : MAIN1
1 of 1 Y +/-
F4 for list
CF03 03
CF04 04
TAKE 12 AND F4
Record . . . : MAIN1
Option Order Field Type Use Length Row/Col Ref Condition Overlap
70 AGE C 21 15 014
80 RECSD A H 10
90 EMPCUR A H 10
More...
Add H Hidden
Add M Message
Add P Program-to-system
SENWLT1
Y=Yes
General keywords . . . . . . . . Y
Subfile messages . . . . . . . . Y
Select parameters . . . . . . . . . . . Y
Select parameters . . . . . . . . . . .
Record . . . : SENWLT1
Keyword . . : WINDOW
-OR-
-OR-
Start line
Start position
Record . . . : SENWLT1
Y=Yes
General keywords . . . . . . . . Y
Indicator keywords . . . . . . . Y
Application help . . . . . . . .
Help keywords . . . . . . . . . .
Output keywords . . . . . . . . .
CF12 12
CF03 03
Y=Yes Indicators/+
More...
F3=Exit F12=Cancel
Keyword Number
Program-to-system field . . . . . .
OUTPUT
EMPLOYEE DETAILS
1.SELECT
000101 K.SENTHILKUMAR
000102 R.SHYAMSUNDAR
000103 B.MOHAN
000104 K.KUMAR
000105 A.ARUL
More...
EMPLOYEE DETAILS:
1.SELECT
000106 BALU
000107 SENTHIL
000108 RAJ
000109 HEMA
000110 VEL
More...
EMPLOYEE DETAILS
1.SELECT
000111 RAMESH
000122 SUDHA
123 KANDASAMY
WRKMSGF FILE/ANME
OPTION 12
PAGE DOWN
WRKMSGF
USING 8 SELETION
Y=Yes
General keywords . . . . . . . . Y
Indicator keywords . . . . . . . Y
Message record . . . . . . . . . Y
TEXT keyword . . . . . . . . . .
Keyword
Y=Yes
General keywords . . . . . . . . Y
Subfile messages . . . . . . . . Y
TEXT keyword . . . . . . . . . .
Y=Yes Indicators/+
F3=Exit F12=Cancel
Record . . . : MSGCTL1
Y=Yes
General keywords . . . . . . . . Y
Indicator keywords . . . . . . . Y
Overlay keywords . . . . . . . . Y
Record . . . : MSGCTL1
MSG
0006.00 ENDPGM
RMO
0014.00 C IF EMPNUMB=*ZEROS
CL Programming
1. CL commands?
1. WRKMBRPDM
2. CRTSRCPF
By using this command to create source physical file. Default PF size is 92.
3. DSPFD
4. DSPFFD
5. STRDFU
6. STRSDA
7. CRTMSGF
8. WRKMSGF
If you want to create or change or delete any message we can use this command.
9. CRTDTAARA
10. DSPDTAARA
11. CHGDATARA
12. DSPLIBL
13. ADDLIBLE
14. RMVLIBLE
15. CHGCURLIB
16. EDTLIBL
It is used to the edit of the library file. (Change library file it is temporary delete
the library file)
17. SNDBRKMSG
18. CRTPF
It is used to create a PF. Using this command we can set the maximum number of
records, whether delete or update operation is allowed or not, maximum storage
allocation, waiting time etc can be determined
19. CRTLF
20. STRRLU
To go into the RLU we are using this command. Default length of RLU is 132 if
you give it and creating it very first time else it set the page width value of last edited
RLU. We can give the page width value from 1 to 378 in page width option.
21. DSPSBS
22. CRTRPGPGM
23. CRTCLPGM
To create CL program
24. EDTOBJAUT
It is used to give authority to a particular source PF. For giving authority to other
user we must give authority to library, user profile and the source PF.
25. DSPOBJD
If we know library name and object name and we want to know the source PF
where it is residing then DSPOBJD with option as services instant of basic will give the
source PF name.
It describes various object descriptions like created Date, Created by, Source
Physical file, which it is being created, and so on.
26. STRSQL
Starts SQL.
27. WRKSPLF
28. DLTSPLF
29. CRTDUPOBJ
This command creates duplicate object. If you want to compile a PF having 1000
of records and when we compile it all the data will be lost else if you want to add or
delete a attribute data for other fields will have to copied. For that we a duplicate object.
30. CPYF
Records are being copied from PF to temporary file and after compiling it we
have to again copy back from temporary file to the original file. If we Add a attribute we
have to give *map and if we want to delete a attribute we have to give *drop in the map
entry field.
31. DLTF
After copying into the original file we have to delete the temporary file or if you
want to delete any file we are using this command. DLTF will only remove the object
33. RUNQRY
34. CRTCMD
35. CMPPFM
36. MRGSRC
It is used to merge a file with another file. We have to mention three files one is
the root file, which is just a root and does not contain any code even. The second file is
target file where we can have the ready-made we can copy the target source.
37. RTVCLSRC
If you delete a CL Source then we can retain the source if you are having the
object by using this command.
38. SBMJOB
If you want to submit the job in certain interval i.e. on a specified date and time
we can use this command.
39. DSPJOB
40. DSPUSRPRF
It will display all the entries regarding the particular user profile. It displays
information like what is the user. Profile name; date previously, user class, printing and
all.
41. CPYSRCF
42. WRKACTJOB
44. SNDMSG
45. DSPMSG
46. CHGCURLIB
47. ADDLIBLE
48. RMVLIBLE
49. CRTUSRPRF
It is used to display the rights given to a user. The system administrator can
change authority he can give the authority as a system administrator.
This is used to list all the files, which are related to a PF. It displays all the LF that
is referring the PF and also lists the child table if it is having a relation through
ADDPFCST.
51. DSPJOB
It will display all the jobs submitted within the specific interval and display the
entire user who worked on the system at that time
52. WRKMSGQ
It will list all the messages of different user in the job queue.
53. CPYSRCF
54. CPYTODKT
55. CPYTOTAP
56. STRDBG
If we want to debug a ILE program then we can use this command .We have to
create a ILE program by compiling with 15 which is CRTRPGMOD command and take
F10 give debugging values as *Source. This will create a module. Then we have the
create the program by giving program name and module name as the same and if we
are calling any other modules also in that include that in the CRTPGM command
(LIB/SPNAME)
Now the program as well as the module is created. Then we have to start the debug by
using the command.
It will show the source code of the program and we have to press F6 set the break
point and press F10 key and call the program
CALL PNAME
*BCAT->trailing blanks in the first character string is truncated. One blank is inserted,
and then the two character strings are concatenated. Any leading blanks of the second
operand are not truncated
*TCAT->All trailing blanks in the first character string is truncated, and then the two
character strings are concatenated. Any leading blanks of the second operand are not
truncated.
SKANDASAMO/CLP
STRING
Run
> kumar
> ''
> ''
DSPMSG
%SUBSTRING or %SST
The sub string built-in function produces a character string that is a
subset of an existing character string and can only be used with a CL program.
Or
%SWITCH
8. Message subfile in CL
Subfile cannot be used in CL but we can use message subfiles in CL.
9. CL processing commands & program control commands?
By using CALLPRC command. This is the bound call in CL that calls a procedure
within a module.
Immediate message
Predefined message
Immediate message
Which does the program or system user create when they are sent and are not permanently
stored in the system?
Control language
SNDUSRMSG
SNDPGMMSG
SNDMSG
SNDBRKMSG
Display files
ERRMSG
SFLMSG
Control language
SNDUSRMSG
SNDPGMMSG
RTVMSG
Display files
ERRMSGID
SFLMSGID
MSGCON
MSGID
COMPLETION and DIAGNOSTIC message
Using SNDPGMMSG command these of message can be sent to any
message queue.
DIAGNOSTIC message tell the calling program about errors detected
by the program. Completion message tell the result of work done by
the program.
STATUS messages
Using SNDPGMMSG command status message can be sent to it’s caller’s program
message queue or to the external message queue for the job. These messages tell the
receiving program the status of the work performed by the sending program.
ESCAPE message
Using SNDPGMMSG command escape message from a CL program can be sent to its
calling program. An escape message tells the calling program ended abnormally and why.
NOTTFY message
Notify message from a CL program can be sent to the message queue of calling program
or to the external message queue. A notify message tells the calling program about a
condition under which processing can continue.
Predefined message are stored in message file
To create a message file
CRTMSGF MSGF (MFILE) SIZE () AUT () TEXT ()
Create and maintain messages
ADDMSGD
CHGMSGD OR WRKMSGD
By using the CRTCMD command process the command definition statements to create
the command definition object. The CRTCMD command may be run interactively or in a batch
job.
SKANDASAMO/CLP
CMD1
0001.00 CMD
SKANDASAMO/CLP
DLIB
TYPE : CLP
0001.00 PGM
0002.00 DSPLIBL
0003.00 ENDPGM
17. Info
DEFAULT CL MSGID?
CPF0000
Dspf windows type?
WINDOW
What is the level check error?
The level check error means RPGLE program is compiled and PF or LF
are compile suppose the PF or LF compile after the compiling the RPGLE
program this type of error is called level check error.
If you want to copy a PF without making any modification to it then FORMAT
keyword is used.
Default access path maintenance is *IMMED
Maximum no of printer files included in a RPGLE program is 8
Maximum no of files declared in RPGLE is 50 and CL is l
Maximum no of key fields included is 120
Maximum no of fields included in a PF is 8000
Maximum no of arrays included is a RPG is 200
Maximum no of parameter passed in a RPG is 255 and CL 40
Total no of system library is 15 and user library is 25
While logging on the first library to be included is QSYS
QGPH and QTEMP are user library
Printer file default length is 132.
Default size of a member is CRTSRCPF command for ordinary files is 92.
18. What's the difference between CHAIN and SETLL? Is there a performance advantage?
More Details
The CHAIN operation performs a random GET operation to the database file. If the
operation is successful, the data in the record is copied to the input buffer. If the CHAIN
operation fails, a record-not-found condition is signaled, typically via Resulting Indicator 1. If
the database file has been opened for UPDATE, the CHAIN operation places a record lock on
the retrieved record. No other application can access this record for update while this lock is
applied. Furthermore, if another program has issued a lock to the recording being accessed, the
CHAIN operation will wait for the database time-out period. If the record is released during
that period, the CHAIN operation continues. If the other program does not release the record,
the CHAIN operation fails with an exception.
The CHAIN operation supports the NO LOCK operation extender (the old "half-adjust"
column). In RPG III you specify an N in the operation extender column, in RPG IV, you specify
CHAIN (n) for the operation code. Using NO LOCK allows you to access a record without a
record lock being applied, regardless of the way in which the file is open. The record's data,
however, is still copied to the input buffer when NO LOCK is specified.
The SETLL operation performs a quasi READ LESS THAN OR EQUAL operation. If the
operation is successful, a READ PRIOR is performed. The database record's data, however, is
not copied to the input buffer, nor is there a record lock applied to the accessed record. Hence,
SETLL is probably the operation code to use for testing the existence of a record. However, if
the record needs to be retrieved, CHAIN more effective.
Performance
If your requirement is to check for the existence of a record, traditionally the CHAIN
operation is used. However, since CHAIN copies the record's data to your program's input
buffer, there is additional overhead required for the CHAIN operation. The SETLL can be used
to effectively accomplish the same task as the CHAIN test. Use SETLL with resulting indicator 3
(equal). If this indicator is set on, a record exists whose key matches they value specified in
Factor 1. If your requirement is that the record eventually be updated, subsequent to the
existents test, you should consider using of CHAIN.
19. How do I debug a remote (i.e. "batch") job from an interactive job?
The ability to debug another job has been a long-standing requirement for AS/400, now
Iseries programmers. It isn't as difficult as it may seem. Whether you need to debug a batch job,
1. Determine the job name of number for the job you need to debug.
Use WRKACTJOB and note the Job name, number and user profile ID.
If debugging a CGI program, look in the job log of the job for CPF message
HTP2001.
2. Run the Start Service Job (STRSRVJOB) command specifying the job to be debugged
4. At this point the program in the remote job is under debug control from your job
You can now set break points (if you're debugging an RPG IV program, the
source will have already been displayed).
Press F12 from within the debugger to return to CMD entry after setting your
break points.
5. Evoke the program in the remote job. If you you're doing a web browser session, hit the
SUBMIT button.
6. You interactive job will "break" at the debug break points and you can debug application
normally.
1. From your debugging session, run the End Debug (ENDDBG) command
2. Then run the (End Service Job) ENDSRVJOB command
Your session is no longer controlling the remote job. The remote job continues normally.
To debug a CGI program that is evoked from a Web Browser session running from the standard
IBM HTTP Web Server, you need to do the following in addition to the above.
ENDTCPSVR *HTTP
WARNING!!! -- You MUST include *HTTP as the parameter for ENDTCPSVR
otherwise all TCP/IP server jobs (including telnet, ftp, smtp, etc.) will be ended.
And this is a bad thing. IBM sucks for making *ALL the default for
ENDTCPSVR.
The job whose joblog contains the CPF message HTP2001 is the one to be
debugged.
ENDTCPSVR *HTTP
Restart the HTTP server using the following CL command, unless your shop has another
process for starting the HTTP server:
STRTCPSVR *HTTP
For example, to check to see if a record is locked, you would code the following:
.....CSRn01Factor1+++++++OpCode(ex)Factor2+++++++Result++++++++Len++DcHiLoEq
C CustNO Chain(E) CustMast
C if %ERROR = *ON
C Select
The concept is to first check %ERROR for a generalized error condition, and then check
%STATUS for the specific error. Note that no resulting indicators are used in the previous
example. The normal not-found condition is checked using the %FOUND built-in function rather
than testing Resulting Indicator 1.
21. Why doesn't the %CHAR built-in function work with numeric values?
Under the initial release of OS/400 Version 4, Release 2, the %CHAR built-in function
was introduced. However, the function, as designed, only converted DATE values to character
values. This proved to be too restrictive a use for this function. In the next release of OS/400
(V4R4) IBM will add function to %CHAR allowing it to convert all forms of non-character data
to character. In that release %CHAR will function with numeric values.
D Amount 7P 2 Inz(123.45)
C Eval text = 'The amount is: ' + %Char (
amount )
The TEXT field would contain the following after the EVAL operation is performed:
Unlike %EDITC, the %CHAR built-in function trims off leading blanks. However,
%EDITC provides much more editing power than %CHAR. Use %CHAR for basic number to
character conversion.
22. How does the CONST keyword work with Procedure parameters?
If you are certain that the called procedure will NOT modify a parameter, the CONST
keyword can provide several benefits.
1. It automatically converts a field of a similar data type, to the length and type required by
the parameter.
2. Performance is improved because the compiler can generate more optimized code for
the CONST parameter.
CONST can be used on calls to procedures or programs. We use it all the time when
calling QCMDEXC from within RPG IV. All three parameters of the QCMDEXC program
are CONST values. The example code below can be used as the PROTOTYPE to call
QCMDEXC from within RPG IV. To call it using this prototype, specify something like:
CALLP run('addlible myLib' 14) in your calculation specs.
.....DName+++++++++++EUDS.......Length+TDc.Functions++++++++++++++
D Run PR ExtPgm('QCMDEXC')
D cmdstr 3000A Const Options(*VarSize)
D cmdlen 15P 5 Const
D cmdDbcs 3A Const Options(*NOPASS)
Note: if you're using CodeStudio or IBM's Code/400 as your RPG IV editor under Windows,
you could simply highlight the above source code within your Internet Browser, and copy it to
the Windows clipboard. Then activate CodeStudio (or Code/400) and use the Paste function to
insert the code directly into the editor. Pretty cool, huh? <g>
Built-in Functions
The original release of RPG IV included a set of built-in functions. These built-in functions were:
In addition, under OS/400 V3R2 and V3R7 the %PARMS built-in function was introduced.
Since then, several built-in functions have been added to RPG IV. The following table provides
the OS/400 Version and Release that the specific built-in functions were introduced and/or
enhanced.
V4R2 %EQUAL {file name} '1' if the most recent SETLL (for a
particular file, if specified) or
LOOKUP operation found an
exact matches '0' otherwise.
V4R2 %OPEN file name '1' if the specified file is open '0' if
the specified file is closed.
Consider this built-in to be an 'Is
this file open?" operation.
ADDDUR:
It is a powerful opcode, which is used to add any date related
function to a particular date, time or timestamp.
Example:
SKANDASAMO/DATE
ADDDUR
0001.00 DTIMESTE S Z
0001.01 DTIME5 S Z
0002.00 DDATE1 S D
0002.01 DDATE2 S D
0002.02 DDATE3 S D
0002.03 DDATE4 S D
0003.00 DTIME1 S T
0003.01 DTIME2 S T
0003.02 DTIME3 S T
0003.03 DTIME4 S T
0015.00 C SETON LR
OUTPUT
DSPLY 2004-06-27
DSPLY 2002-11-27
DSPLY 2002-06-28
DSPLY 12.18.36
DSPLY 22.18.36
DSPLY 00.00.00
DSPLY 12.18.46
DSPLY 2002-06-27-12.18.36.953010
SUBDUR:
It is used to find the difference between two date (or) time (or) time stamp
SKANDASAMO/DATE
SUBDUR
0001.00 DTIMESTE S Z
0001.01 DTIME5 S Z
0002.01 DDATE2 S D
0002.02 DDATE3 S D
0002.03 DDATE4 S D
0003.01 DTIME1 S T
0003.02 DTIME3 S T
0003.03 DTIME4 S T
0015.00 C SETON LR
OUT PUT
DSPLY 1977-06-18
DSPLY 1977-01-20
DSPLY 1976-06-20
DSPLY 02.50.10
DSPLY 12.50.10
DSPLY 00.00.00
DSPLY 12.50.00
EXTRCT:
It is used to extract year, month, day, hours, minutes, seconds, and microseconds
of a time stamp or date field.
Example:
SKANDASAMO/DATE
EXRCT
0001.00 DTIMESTE S Z
0002.01 DDATE3 S D
0002.02 DDATE2 S 5P 0
0002.04 DDATE4 S 5P 0
0002.05 DDATE5 S 5P 0
0002.06 DDATE6 S 5P 0
0002.07 DDATE7 S 5P 0
0003.01 DTIME1 S T
0003.02 DTIME2 S 5P 0
0003.03 DTIME4 S 5P 0
0003.04 DTIME5 S 5P 0
0003.05 DTIME6 S 5P 0
0015.00 C SETON LR
OUTPUT
DSPLY 6
DSPLY 2002
DSPLY 6
DSPLY 20
DSPLY 27
DSPLY 1977
DSPLY 12
DSPLY 12
DSPLY 12
DSPLY 10
DSPLY 441000
TEST:
Test is the most powerful opcode, which will check a date is a valid, or not .The low level
indicator is set on if the date is not valid or set off if the date is a valid one.
Test will be given with extended factor like test (d), test (t), test (z) for date, time and
time stamp and if test without extended factor default to date (z).
Example
SKANDASAMO/DATE
TEST
0000.01 C*TEST FOR VALID DATE THE DATE VALID SETOFF OR SETON
(NOTVALID)
0003.01 C IF *IN30=*ON
0003.03 C ELSE
0003.05 C ENDIF
0004.00 C SETON LR
OUTPUT
DSPLY 1
DSPLY NOTVAILD
4. Explain Compile time array, lookup, sort-a, x-foot, and Run time array?
COMILE
0003.00 c i do 3
0005.00 c add 1 i
0006.00 c enddo
0007.00 c seton
0008.00 **
0009.00 1001
0010.00 20
0011.00 1000
OUTPUT
DSPLY 1001
DSPLY 20
DSPLY 1000
RUNTIME
0002.00 di s 2p 0 inz(1)
0002.01 da s 3p 0
0002.02 dj s 2p 0 inz(1)
0003.00 c i do 12
0003.03 c add 1 i
0003.04 c enddo
0003.05 c j do 12
0005.01 c add 1 j
0006.00 c enddo
0007.00 c seton lr
SKANDASAMO/ARRAY
SORTARRAY
0002.00 di s 2p 0 inz(1)
0002.01 dj s 2p 0 inz(1)
0002.02 dd s 4p 0
0003.00 c i do 3
0005.00 c add 1 i
0006.00 c enddo
0006.04 c if *in40=*on
0006.06 c else
0006.08 c endif
0006.09 c d dsply
0006.10 c j do 3
0006.12 c add 1 j
0006.13 c enddo
0007.00 c seton
0008.00 **
0009.00 1001
0010.00 2000
0011.00 1000
DSPLY 1001
DSPLY 2000
DSPLY 1000
DSPLY found
DSPLY 4001
DSPLY 1000
DSPLY 1001
DSPLY 2000
READE CHAIN
1.The matching records for table The first matching records only
EDITC
0010.00 c seton lr
0011.00
REPLACE
0002.00 db s 20a
0004.00 c b dsply
0005.00 c seton lr
OUTPUT
DSPLY senkumlkumar
The use of the TRIM functions is very limited, in that they support only the use of
character variables and data structures. Numeric fields and zero-fill values are not supported.
They do, however, provide some useful function for string handling. For example, in RPG IV,
one line of code is all that's needed to left-adjust a value within a field. For example:
.....CCRn01Factor1+++++++OpCode(ex)Factor2+++++++Result++++++++Len++DcHiLoEq
C ExFmtCustMaint
C Eval CustName=%TrimL(CustName)
Typically, the %TRIM function is the only one of the three that get used. The other two,
however, do have their place.
%TRIM removes trailing and leading blanks from a field, and returns the remaining
%TRIML removes leading blanks (trim-left) from a field, and returns the value in place,
within the expression.
%TRIMR removes trailing blanks (trim-right) from a field, and returns the value in place,
within the expression.
OS/400 Version 4, Release 2 RPG IV supports the elimination of the Resulting Indicators.
In their place, several new built-in functions have been introduced. Most of these new built-in
function provide information about the result of File operations similar to the Result indicators.
But instead of coding Resulting indicator 3, for example, to check for the end-of-file condition,
you simply check the value of the %EOF built-in function.
%FOUND, %EOF, %EQUAL. In addition, there are %OPEN, %STATUS, and %ERROR.
Mysteriously missing is %LOCK to check for a record lock condition.
%FOUND returns an *ON or *OFF condition if the previous File operation returns a
record-found condition. This is particularly useful on the CHAIN operation. Realize, however,
that when CHAIN sets on Resulting indicator 1, a not-found condition is signaled. Whereas,
without coding Resulting Indicator 1, the %FOUND built-in function returns the found
condition.
%EOF can be used to check for end-of file, beginning of file, or subfile full conditions. A
READ and READE return %EOF=*ON if the end of file is reached. READP and READPE return
%EOF=*ON if the beginning of file is reached. The WRITE operation returns %EOF=*ON if the
WRITE operation to a subfile detail record returned a subfile-full condition.
%EQUAL is used by the SETLL operation to indicate that it detected a record in the file
with a key equal to that of the value specified in Factor 1. Since SETLL does not read the record,
does not lock the record, and does not copy the data into the input buffer, SETLL is much faster
and less of an impact on the performance of the application than other operations, such as
CHAIN. Use CHAIN when you need to retrieve the record, use SETLL and %EQUAL when you
need to only check for the existence of a record.
%OPEN is used to check to see if a file has already been opened. The built-in function
returns *ON if the file is opened, otherwise it returns *OFF.
%ELEM
%ELEM will display the array dimension
0002.00 dc s 3s 0
0004.00 c c dsply
0005.00 c seton lr
OUTPUT
DSPLY 100
%SIZE
%SIZE will display the size of the variable
SKANDASAMO/BULID
SIZE
0004.00 c z-add 2 a 20 0
0007.00 c
0019.00 c seton lr
OUTPUT
DSPLY 6
DSPLY 11
DSPLY 10
DSPLY 6
DSPLY 60
DSPLY 6
DSPLY 120
%EDITW
@ References:
http://www.allinterview.com/Interview-Questions/RPG400.html
http://publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c092508380.htm#HDRPROGXPE
http://publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c092508377.htm#HDRFILEXPE
http://faq.midrange.com/data/cache/13.html
http://www.geocities.com/SiliconValley/Hills/6632/opnqryf.html
http://www.allinterview.com/Interview-Questions/RPG400.html
http://sumedh.shende.googlepages.com/as400interviewquestionspartii