Difference between revisions of "Test268 Section 3"
(→Define basic arrays (e.g., compile time, pre-run time, run time) using D specs) |
m |
||
(36 intermediate revisions by 7 users not shown) | |||
Line 1: | Line 1: | ||
− | |||
[[Category:Test268]] | [[Category:Test268]] | ||
− | |||
[[Test268 Section 2|<< Previous Section]] | [[:Category:Test268|Home]] | [[Test268 Section 4|Next Section >>]] | [[Test268 Section 2|<< Previous Section]] | [[:Category:Test268|Home]] | [[Test268 Section 4|Next Section >>]] | ||
Line 9: | Line 7: | ||
=== Recognize appropriate use of RPG creation commands (e.g., CRTxxxPGM, CRTxxxMOD, CRTPGM, CRTBNDxxx) === | === Recognize appropriate use of RPG creation commands (e.g., CRTxxxPGM, CRTxxxMOD, CRTPGM, CRTBNDxxx) === | ||
+ | * CRTxxxPGM | ||
+ | ** Used for compiling a RPG OPM program . | ||
+ | * CRTxxxMOD | ||
+ | ** Used for compiling a RPG ILE 4 module. It will create a non exectutable *module object. | ||
+ | * CRTPGM | ||
+ | ** Used for linking one or more modules to create a program. It will create a executale *pgm object. | ||
+ | * CRTBNDxxx | ||
+ | ** Used for comiling a RPG ILE 4 program. When the source is compiled, it will create a module in QTEMP and then create a program from it and finally deletes the module. | ||
=== Define basic arrays (e.g., compile time, pre-run time, run time) using D specs === | === Define basic arrays (e.g., compile time, pre-run time, run time) using D specs === | ||
− | + | ==== Compile Time ==== | |
− | * Pre-Run Time | + | |
− | * Run Time | + | DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++ |
+ | DARC S 3A DIM(12) PERRCD(5) CTDATA | ||
+ | |||
+ | // Must be at the end of the code | ||
+ | **CTDATA ARC | ||
+ | 48K16343J64044HComments can be placed here | ||
+ | 12648A47349K346Comments can be placed here | ||
+ | 50B125 Comments can be placed here | ||
+ | |||
+ | ==== Pre-Run Time ==== | ||
+ | |||
+ | Figure 68 shows the definition specifications required for two prerun-time arrays, a compile-time array, and a run-time array. | ||
+ | Figure 68. Definition Specifications for Different Types of Arrays | ||
+ | |||
+ | HKeywords+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
+ | H DATFMT(*USA) TIMFMT(*HMS) | ||
+ | D*ame+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++ | ||
+ | * Run-time array. ARI has 10 elements of type date. They are | ||
+ | * initialized to September 15, 1994. This is in month, day, | ||
+ | * year format using a slash as a separator as defined on the | ||
+ | * control specification. | ||
+ | DARI S D DIM(10) INZ(D'09/15/1994') | ||
+ | * | ||
+ | * Compile-time arrays in alternating format. Both arrays have | ||
+ | * eight elements (three elements per record). ARC is a character | ||
+ | * array of length 15, and ARD is a time array with a predefined | ||
+ | * length of 8. | ||
+ | DARC S 15 DIM(8) PERRCD(3) | ||
+ | D CTDATA | ||
+ | DARD S T DIM(8) ALT(ARC) | ||
+ | * | ||
+ | * Prerun-time array. ARE, which is to be read from file DISKIN, | ||
+ | * has 250 character elements (12 elements per record). Each | ||
+ | * element is five positions long. The size of each record | ||
+ | * is 60 (5*12). The elements are arranged in ascending sequence. | ||
+ | DARE S 5A DIM(250) PERRCD(12) ASCEND | ||
+ | D FROMFILE(DISKIN) | ||
+ | * | ||
+ | * Prerun-time array specified as a combined file. ARH is written | ||
+ | * back to the same file from which it is read when the program | ||
+ | * ends normally with LR on. ARH has 250 character elements | ||
+ | * (12 elements per record). Each elements is five positions long. | ||
+ | * The elements are arranged in ascending sequence. | ||
+ | DARH S 5A DIM(250) PERRCD(12) ASCEND | ||
+ | D FROMFILE(DISKOUT) | ||
+ | D TOFILE(DISKOUT) | ||
+ | |||
+ | // Must be at the end of the code | ||
+ | **CTDATA ARC | ||
+ | Toronto 12:15:00Winnipeg 13:23:00Calgary 15:44:00 | ||
+ | Sydney 17:24:30Edmonton 21:33:00Saskatoon 08:40:00 | ||
+ | Regina 12:33:00Vancouver 13:20:00 | ||
+ | |||
+ | ==== Run Time ==== | ||
+ | |||
+ | DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++ | ||
+ | DARC S 3A DIM(12) | ||
=== Use basic array handling (e.g., *IN, LOOKUP, SORTA, MOVE and MOVEA, indexing) === | === Use basic array handling (e.g., *IN, LOOKUP, SORTA, MOVE and MOVEA, indexing) === | ||
+ | The LOOKUP operation can be used to search arrays. | ||
+ | |||
+ | Example: | ||
+ | |||
+ | FARRFILE IT F 5 DISK | ||
+ | * | ||
+ | DDPTNOS S 5S 0 DIM(50) FROMFILE(ARRFILE) | ||
+ | D* | ||
+ | C* The LOOKUP operation is processed and, if an element of DPTNOS equal | ||
+ | C* to the search argument (DPTNUM) is found, indicator 20 is set on. | ||
+ | C DPTNUM LOOKUP DPTNOS 20 | ||
+ | |||
+ | |||
+ | SORTA :You can sort arrays using the “SORTA (Sort an Array)”.The array is sorted into sequence (ascending or descending), depending on | ||
+ | the sequence specified for the array on the definition specification. | ||
=== Code and use figurative constants (e.g., *LOVAL, *HIVAL, *ALL, *BLANKS, *ZEROS, *ON, *OFF) === | === Code and use figurative constants (e.g., *LOVAL, *HIVAL, *ALL, *BLANKS, *ZEROS, *ON, *OFF) === | ||
* *ALL | * *ALL | ||
− | * *BLANKS | + | * *BLANKS -- Fills an alpha field with ' ' |
− | * *HIVAL | + | * *HIVAL -- Fills a field with the highest possible value the field can hold |
− | * *LOVAL | + | * *LOVAL -- Fills a field with the lowest possible value the field can hold |
− | * *OFF | + | * *OFF -- Generally used for indicators to either turn them off or check to see if they are off |
− | * *ON | + | * *ON -- Generally used for indicators to either turn them on or check to see if they are on |
− | * *ZEROS | + | * *ZEROS -- Fills a numeric field with 0 |
=== Code and use job date and system date === | === Code and use job date and system date === | ||
+ | ==== Job Date ==== | ||
+ | D CurDate S D DATFMT(*ISO) INZ(*JOB) | ||
+ | |||
+ | ==== System Date ==== | ||
+ | D CurDate S D DATFMT(*ISO) INZ(*SYS) | ||
+ | |||
+ | === Code and use structured operation codes (e.g., DO, DOUxx, DOWxx, IF/ELSE/ELSEIF, SELECT/WHEN, CASxx/EXSR) === | ||
+ | ==== DO ==== | ||
+ | |||
+ | ==== DOUxx ==== | ||
+ | /Free | ||
+ | DOU %EOF(filename); | ||
+ | // Logic | ||
+ | READ filename; | ||
+ | ENDDO; | ||
+ | /End-Free | ||
+ | |||
+ | ==== DOWxx ==== | ||
+ | /Free | ||
+ | READ filename; | ||
+ | DOW NOT %EOF(filename); | ||
+ | // logic | ||
+ | READ filename; | ||
+ | ENDDO; | ||
+ | /End-Free | ||
+ | |||
+ | ==== IF/ELSE/ELSEIF ==== | ||
+ | if mycondition; | ||
+ | // the code | ||
+ | else; | ||
+ | // other condition | ||
+ | endif; | ||
+ | if mycondition; | ||
+ | // the code | ||
+ | elseif new condition; | ||
+ | // new code | ||
+ | endif; | ||
− | === | + | ==== SELECT/WHEN ==== |
+ | select; | ||
+ | |||
+ | when %trim(MonthName) = 'January' or | ||
+ | %trim(MonthName) = 'JANUARY'; | ||
+ | return 1; | ||
+ | |||
+ | when %trim(MonthName) = 'February' or | ||
+ | %trim(MonthName) = 'FEBRUARY'; | ||
+ | return 2; | ||
+ | |||
+ | when %trim(MonthName) = 'March' or | ||
+ | %trim(MonthName) = 'MARCH'; | ||
+ | return 3; | ||
+ | |||
+ | when %trim(MonthName) = 'April' or | ||
+ | %trim(MonthName) = 'APRIL'; | ||
+ | return 4; | ||
+ | |||
+ | when %trim(MonthName) = 'May' or | ||
+ | %trim(MonthName) = 'MAY'; | ||
+ | return 5; | ||
+ | |||
+ | when %trim(MonthName) = 'June' or | ||
+ | %trim(MonthName) = 'JUNE'; | ||
+ | return 6; | ||
+ | |||
+ | when %trim(MonthName) = 'July' or | ||
+ | %trim(MonthName) = 'JULY'; | ||
+ | return 7; | ||
+ | |||
+ | when %trim(MonthName) = 'August' or | ||
+ | %trim(MonthName) = 'AUGUST'; | ||
+ | return 8; | ||
+ | |||
+ | when %trim(MonthName) = 'September' or | ||
+ | %trim(MonthName) = 'SEPTEMBER'; | ||
+ | return 9; | ||
+ | |||
+ | when %trim(MonthName) = 'October' or | ||
+ | %trim(MonthName) = 'OCTOBER'; | ||
+ | return 10; | ||
+ | |||
+ | when %trim(MonthName) = 'November' or | ||
+ | %trim(MonthName) = 'NOVEMBER'; | ||
+ | return 11; | ||
+ | |||
+ | when %trim(MonthName) = 'December' or | ||
+ | %trim(MonthName) = 'DECEMBER'; | ||
+ | return 12; | ||
+ | |||
+ | other; | ||
+ | return -1; | ||
+ | |||
+ | endsl; | ||
+ | ==== CASxx/EXSR ==== | ||
=== Code and use structured operation codes with expressions (+, -, * ,/, **, <, >, =, (), and, or, not) === | === Code and use structured operation codes with expressions (+, -, * ,/, **, <, >, =, (), and, or, not) === | ||
− | + | * Addition | |
+ | result = field1 + field2; | ||
+ | result += field3; // The expression is added to the target | ||
+ | * Subtraction | ||
+ | result = field1 - field2; | ||
+ | result -= field3; // The expression is subtracted from the target | ||
+ | * Multiplication | ||
+ | result = field1 * field2; | ||
+ | result *= field3; // The target is multiplied by the expression | ||
+ | * Division | ||
+ | result = field1 / field2; | ||
+ | result /= field3; // The target is divided by the expression | ||
+ | * Exponentiation | ||
+ | result = field1 ** field2; | ||
+ | result **= field3; // The target is assigned the target raised to the power of the expression | ||
+ | * Less Than | ||
+ | if field1 < field2; | ||
+ | // my code here | ||
+ | endif; | ||
+ | * Greater Than | ||
+ | if field1 > field2; | ||
+ | // my code here | ||
+ | endif; | ||
+ | * Equal | ||
+ | if field1 = field2; | ||
+ | // my code here | ||
+ | endif; | ||
+ | * Parenthesis | ||
+ | result = (field1 + field2) * field3; | ||
+ | * And | ||
+ | if field1 > field2 and field3 > field4; | ||
+ | // my code here | ||
+ | endif; | ||
+ | * Or | ||
+ | if field1 > field2 or field3 > field4; | ||
+ | // my code here | ||
+ | endif; | ||
+ | * not | ||
+ | if field1 > field2 and not field3 > field4; | ||
+ | // my code here | ||
+ | endif; | ||
=== Code and use date data types and arithmetic operations, including date operations in expressions === | === Code and use date data types and arithmetic operations, including date operations in expressions === | ||
Line 45: | Line 254: | ||
=== Code and use *INZSR === | === Code and use *INZSR === | ||
+ | '*INZSR' is automatically run before any other mainline code. | ||
+ | |||
+ | begsr *inzsr; | ||
+ | // code for the *inzsr here | ||
+ | endsr //*inzsr; | ||
+ | '''NOTE'''<UL> | ||
+ | <li> *INZSR can be defined only for MAIN subprocedure</li> | ||
+ | <li> RESET operation cant be used in *INZSR</li> | ||
+ | <li> If program returns with *INLR=*OFF, *INZSR will not be executed on next program invocation.</li> | ||
+ | <li> If program returns with *INLR=*OFF but *INZSR wasn't completed normaly, it will be executed on next program invocation.</li> | ||
+ | <li> If *INZSR is coded inside bounded module<UL> | ||
+ | <li> it will be called only if MAIN subprocedure is called first.</li> | ||
+ | <li> if other subprocedure is called first only initalization of global storage occures.</li></ul></li></UL> | ||
=== Code and use RPG IV built-in functions === | === Code and use RPG IV built-in functions === |
Latest revision as of 20:18, 5 August 2007
<< Previous Section | Home | Next Section >>
Contents
- 1 Section 3 - Core RPG (15%)
- 1.1 Recognize appropriate use of RPG creation commands (e.g., CRTxxxPGM, CRTxxxMOD, CRTPGM, CRTBNDxxx)
- 1.2 Define basic arrays (e.g., compile time, pre-run time, run time) using D specs
- 1.3 Use basic array handling (e.g., *IN, LOOKUP, SORTA, MOVE and MOVEA, indexing)
- 1.4 Code and use figurative constants (e.g., *LOVAL, *HIVAL, *ALL, *BLANKS, *ZEROS, *ON, *OFF)
- 1.5 Code and use job date and system date
- 1.6 Code and use structured operation codes (e.g., DO, DOUxx, DOWxx, IF/ELSE/ELSEIF, SELECT/WHEN, CASxx/EXSR)
- 1.7 Code and use structured operation codes with expressions (+, -, * ,/, **, <, >, =, (), and, or, not)
- 1.8 Code and use date data types and arithmetic operations, including date operations in expressions
- 1.9 Code and use SDS
- 1.10 Code and use *INZSR
- 1.11 Code and use RPG IV built-in functions
- 1.12 Use the H-spec keywords
- 1.13 Use RPG IV OpCodes (e.g., Arithmetic, Date, Message, Array, Declarative, File, Branching, Indicator setting, String handling, Structured programming, compare, initialization, subroutine, data area)
- 1.14 Use the D-spec keywords
Section 3 - Core RPG (15%)
Recognize appropriate use of RPG creation commands (e.g., CRTxxxPGM, CRTxxxMOD, CRTPGM, CRTBNDxxx)
- CRTxxxPGM
- Used for compiling a RPG OPM program .
- CRTxxxMOD
- Used for compiling a RPG ILE 4 module. It will create a non exectutable *module object.
- CRTPGM
- Used for linking one or more modules to create a program. It will create a executale *pgm object.
- CRTBNDxxx
- Used for comiling a RPG ILE 4 program. When the source is compiled, it will create a module in QTEMP and then create a program from it and finally deletes the module.
Define basic arrays (e.g., compile time, pre-run time, run time) using D specs
Compile Time
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++ DARC S 3A DIM(12) PERRCD(5) CTDATA // Must be at the end of the code **CTDATA ARC 48K16343J64044HComments can be placed here 12648A47349K346Comments can be placed here 50B125 Comments can be placed here
Pre-Run Time
Figure 68 shows the definition specifications required for two prerun-time arrays, a compile-time array, and a run-time array. Figure 68. Definition Specifications for Different Types of Arrays
HKeywords+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ H DATFMT(*USA) TIMFMT(*HMS) D*ame+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++ * Run-time array. ARI has 10 elements of type date. They are * initialized to September 15, 1994. This is in month, day, * year format using a slash as a separator as defined on the * control specification. DARI S D DIM(10) INZ(D'09/15/1994') * * Compile-time arrays in alternating format. Both arrays have * eight elements (three elements per record). ARC is a character * array of length 15, and ARD is a time array with a predefined * length of 8. DARC S 15 DIM(8) PERRCD(3) D CTDATA DARD S T DIM(8) ALT(ARC) * * Prerun-time array. ARE, which is to be read from file DISKIN, * has 250 character elements (12 elements per record). Each * element is five positions long. The size of each record * is 60 (5*12). The elements are arranged in ascending sequence. DARE S 5A DIM(250) PERRCD(12) ASCEND D FROMFILE(DISKIN) * * Prerun-time array specified as a combined file. ARH is written * back to the same file from which it is read when the program * ends normally with LR on. ARH has 250 character elements * (12 elements per record). Each elements is five positions long. * The elements are arranged in ascending sequence. DARH S 5A DIM(250) PERRCD(12) ASCEND D FROMFILE(DISKOUT) D TOFILE(DISKOUT) // Must be at the end of the code **CTDATA ARC Toronto 12:15:00Winnipeg 13:23:00Calgary 15:44:00 Sydney 17:24:30Edmonton 21:33:00Saskatoon 08:40:00 Regina 12:33:00Vancouver 13:20:00
Run Time
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++ DARC S 3A DIM(12)
Use basic array handling (e.g., *IN, LOOKUP, SORTA, MOVE and MOVEA, indexing)
The LOOKUP operation can be used to search arrays.
Example:
FARRFILE IT F 5 DISK
*
DDPTNOS S 5S 0 DIM(50) FROMFILE(ARRFILE) D* C* The LOOKUP operation is processed and, if an element of DPTNOS equal C* to the search argument (DPTNUM) is found, indicator 20 is set on. C DPTNUM LOOKUP DPTNOS 20
SORTA :You can sort arrays using the “SORTA (Sort an Array)”.The array is sorted into sequence (ascending or descending), depending on
the sequence specified for the array on the definition specification.
Code and use figurative constants (e.g., *LOVAL, *HIVAL, *ALL, *BLANKS, *ZEROS, *ON, *OFF)
- *ALL
- *BLANKS -- Fills an alpha field with ' '
- *HIVAL -- Fills a field with the highest possible value the field can hold
- *LOVAL -- Fills a field with the lowest possible value the field can hold
- *OFF -- Generally used for indicators to either turn them off or check to see if they are off
- *ON -- Generally used for indicators to either turn them on or check to see if they are on
- *ZEROS -- Fills a numeric field with 0
Code and use job date and system date
Job Date
D CurDate S D DATFMT(*ISO) INZ(*JOB)
System Date
D CurDate S D DATFMT(*ISO) INZ(*SYS)
Code and use structured operation codes (e.g., DO, DOUxx, DOWxx, IF/ELSE/ELSEIF, SELECT/WHEN, CASxx/EXSR)
DO
DOUxx
/Free DOU %EOF(filename); // Logic READ filename; ENDDO; /End-Free
DOWxx
/Free READ filename; DOW NOT %EOF(filename); // logic READ filename; ENDDO; /End-Free
IF/ELSE/ELSEIF
if mycondition; // the code else; // other condition endif;
if mycondition; // the code elseif new condition; // new code endif;
SELECT/WHEN
select; when %trim(MonthName) = 'January' or %trim(MonthName) = 'JANUARY'; return 1; when %trim(MonthName) = 'February' or %trim(MonthName) = 'FEBRUARY'; return 2; when %trim(MonthName) = 'March' or %trim(MonthName) = 'MARCH'; return 3; when %trim(MonthName) = 'April' or %trim(MonthName) = 'APRIL'; return 4; when %trim(MonthName) = 'May' or %trim(MonthName) = 'MAY'; return 5; when %trim(MonthName) = 'June' or %trim(MonthName) = 'JUNE'; return 6; when %trim(MonthName) = 'July' or %trim(MonthName) = 'JULY'; return 7; when %trim(MonthName) = 'August' or %trim(MonthName) = 'AUGUST'; return 8; when %trim(MonthName) = 'September' or %trim(MonthName) = 'SEPTEMBER'; return 9; when %trim(MonthName) = 'October' or %trim(MonthName) = 'OCTOBER'; return 10; when %trim(MonthName) = 'November' or %trim(MonthName) = 'NOVEMBER'; return 11; when %trim(MonthName) = 'December' or %trim(MonthName) = 'DECEMBER'; return 12; other; return -1; endsl;
CASxx/EXSR
Code and use structured operation codes with expressions (+, -, * ,/, **, <, >, =, (), and, or, not)
- Addition
result = field1 + field2; result += field3; // The expression is added to the target
- Subtraction
result = field1 - field2; result -= field3; // The expression is subtracted from the target
- Multiplication
result = field1 * field2; result *= field3; // The target is multiplied by the expression
- Division
result = field1 / field2; result /= field3; // The target is divided by the expression
- Exponentiation
result = field1 ** field2; result **= field3; // The target is assigned the target raised to the power of the expression
- Less Than
if field1 < field2; // my code here endif;
- Greater Than
if field1 > field2; // my code here endif;
- Equal
if field1 = field2; // my code here endif;
- Parenthesis
result = (field1 + field2) * field3;
- And
if field1 > field2 and field3 > field4; // my code here endif;
- Or
if field1 > field2 or field3 > field4; // my code here endif;
- not
if field1 > field2 and not field3 > field4; // my code here endif;
Code and use date data types and arithmetic operations, including date operations in expressions
Code and use SDS
See Program Status Data Structure
Code and use *INZSR
'*INZSR' is automatically run before any other mainline code.
begsr *inzsr; // code for the *inzsr here endsr //*inzsr;NOTE
- *INZSR can be defined only for MAIN subprocedure
- RESET operation cant be used in *INZSR
- If program returns with *INLR=*OFF, *INZSR will not be executed on next program invocation.
- If program returns with *INLR=*OFF but *INZSR wasn't completed normaly, it will be executed on next program invocation.
- If *INZSR is coded inside bounded module
- it will be called only if MAIN subprocedure is called first.
- if other subprocedure is called first only initalization of global storage occures.
Code and use RPG IV built-in functions
Use the H-spec keywords
See H-Spec Keywords
Use RPG IV OpCodes (e.g., Arithmetic, Date, Message, Array, Declarative, File, Branching, Indicator setting, String handling, Structured programming, compare, initialization, subroutine, data area)
Use the D-spec keywords
See D-Spec Keywords