Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
RPG IV V5R1 Enhancements
Presented by
Barry Diehl
At a Glance
Built-In Functions (BIFs)
Free-format
Runtime Control of Files and Members
Improved Error Control
Increased Java support
Miscellaneous Changes
How did it happen?
George Farr of IBM Toronto surveys users
giving them a list of possible enhancements.
Each enhancement is “priced”
Survey participants can spend $100
What didn’t make it?
Multiple dimension arrays
Keylists in D specs
More H-Spec Keywords
Bitwise operations in expressions
Built-In Functions
Taking time
%TIME{(expression{:time-format})}
%TIMESTAMP{(expression{:*ISO|*ISO0})}
%DATE{(expression{:date-format})}
If no value specified, current system values are retrieved
When the expression is *DATE, UDATE or a timestamp,
don’t use the format - the system knows the format
One More Time
%SECONDS(number)
%MINUTES(number)
%HOURS(number)
%DAYS(number)
%MONTHS(number)
%YEARS(number)
Determine date in 3 years
newdate = date + %YEARS(3)
Determine date 6 months ago
loandate = date - %MONTHS(6)
What’s the Difference?
%DIFF(op1:op2:*MS|*S|*MN|*H|*D|*M|*Y)
Determine the number of days between 2 dates
NumDays = %Diff(LoanDate:DueDate:*D)
Add number of minutes between the start and end
TotalTime = TotalTime + %Diff(StartTime:EndTime:*MN)
Parts Is Parts
Extract a subset of a date, time or timestamp with
%SUBDT
%SUBDT(value:*MS|*S|*MN|*H|*D|*M|*Y)
date = d’1999-02-17’;
time = t’01.23.45’;
num = %SubDt(date:*Y); // num = 1999
num = %SubDt(time:*MN); // num = 23
A Well-Defined Search
%LOOKUPxx(arg:array{:startindex{:numelems}}) returns array index of the element in array that matches
Where xx =
– blank an exact match
– LT value closest to arg, but less than arg
– LE an exact match or the value closest to arg, but less than arg
– GT value closest to arg, but greater than arg
– GE an exact match or the value closest to arg, but greater than
arg
Zero is returned if no match found
%Found and %Equal don’t work on this function
Use %TLOOKUPxx for tables
Other Functions
%ALLOC and %REALLOC
%CHECK and %CHECKR
%XLATE
%SHTDN
%SQRT
Free-Format RPG
Free-format Rules
/FREE and /END-FREE
Write code between columns 8 and 80
General form:
opcode(extenders) Factor 1 Factor 2 Result
Statements end with semi-colon
End-of-line comments marked with //
Compiler directives can be used
Can’t define fields or have result indicators
Free and fixed can be mixed
Function Replacements
ADDDUR %YEARS, %MONTHS
ALLOC %ALLOC
CHECK %CHECK
CHECKR %CHECKR
EXTRCT %SUBDT
LOOKUP %LOOKUPxx, %TLOOKUPxx
MVR %REM
OCCUR %OCCUR
REALLOC %REALLOC
Function Replacements
SCAN %SCAN
SHTDN %SHTDN
SQRT %SQRT
SUBDUR %DIFF or minus sign
SUBST %SUBST
TIME %DATE, %TIME, %TIMESTAMP
XFOOT %XFOOT
XLATE %XLATE
Operator Replacement
ADD +
CAT +
DIV /
MULT *
SUB
Generalize
ANDxx AND
DOUxx DOU
DOWxx DOW
IFxx IF
ORxx OR
WHENxx WHEN
Social Engineering - Obsolete
BITOFF use MOVE
BITON use MOVE
CABxx
CAS and ENDCS
COMP
GOTO
MHHZO
MHLZO
MLHZO
MLLZO
TAG
Social Engineering – Moving to New
CALL and CALLB CALLP
DEFINE D spec – use LIKE or DTAARA keywords
DO FOR
END need to qualify the type now
MOVE EVALR or built-in functions
MOVEA
MOVEL EVAL or built-in functions
PARM and PLIST use prototype definition
SETOFF and SETON EVAL
TESTN and TESTZ
Z-ADD and Z-SUB
Free-Form Details
KLIST and KFLD not included
EVAL is optional
Debug works fine
Most examples in Reference are free-form
Macro in CODE/400 performs one-way
conversion
Mix of Free and Fixed-formats is ok
Compiler directives ok - but no SQL
Fixed-format (page 1)
Free-format (page 1)
Fixed-format (page 2)
Free-format (page 2)
Fixed-format (page 3)
Free-format (page 3)
Fixed-format (page 4)
Free-format (page 4)
Runtime Control of Files and
Members
Runtime Control of Files and
Members
Use EXTFILE(file name) and
EXTMBR(member name) as keywords in F
Spec
Need USROPN keyword too
OVRDBF still has control
Improved Error Control
Current Checking
Error indicator or Extender (E) – doesn’t
handle all situations
*PSSR or INFSR subroutines – can’t easily
return to the statement that caused the
problem
Monitor Group
MONITOR - marks beginning of code to trap errors
ON-ERROR {exception-id1 {:exception-id2…}}
Begins the group for one or more status codes. Can also
use:
– *PROGRAM - all program errors
– *FILE - all file errors
– *ALL - all errors
ENDMON - marks the end of the group
Monitor Group Example
Monitor Group Example page 2
New Error Processing Order
Statement indicators
Opcode extenders, %STATUS, %ERROR
MONITOR group
INFSR
*PSSR
Increased Java Support
(Many thanks to George Farr of IBM - these are his examples)
RPG Calling JAVA: 3 options
1.
2.
3.
Use QCMDEXC to launch the JVM for
the Java class
Use system C-APIs to instantiate Java
objects and call methods in them (Java
Native Invocation or JNI)
Use V5R1 RPG enhancements that mask
the JVN complexity
Calling Java from RPG
Declare Objects
Prototype Java Methods
Instantiate an Object
Declare Objects
D Test
S
O
CLASS(*JAVA:’java.lang.String’)
Must declare a field to hold the object reference
– First parameter must be *JAVA
– Fields of type ‘O’ cannot be DS subfields
– Arrays of objects are allowed
– Fields of type ‘O’ are NOT pointers, they only store
references to objects
Prototype Java Methods
EXTPROC(*JAVA:’java.lang.String’:’trim’)
CLASS(*JAVA:’java.lang.String’)
STATIC
D trimstring PR
D
D
EXTPROC accepts 3 parameters
O
– *JAVA keyword
– ‘package.class’ name of class containing method
– Name of method or *CONSTRUCTOR
Specify return type
– Use CLASS keyword if it returns a Java object (‘O’ type)
– Specify STATIC for static methods
Instantiate an Object
D crtBigDec
D
D Parm1
D*
D refflt
D*
D DblField
PR O
8F
S
O
CLASS(*JAVA:’java.math.BigDecimal’)
S
8F
INZ(‘0’)
C* Instantiate the class
C*
C
EVAL
EXTPROC(*JAVA:’java.math.BigDecimal’:*CONSTRUCTOR)
CLASS(*JAVA:’java.math.BigDecimal’)
VALUE
refflt = crtBigDec(dblField)
Prototype the desired constructor method
Declare the object reference variable
Call the constructor method, store result
Calling Methods Example
D fld
D str
D*
D makestring
D
D parm
D*
D makealpha
D*
D trimstring
D
C
C
C
S
S
PR
10A INZ(‘ Farr ‘)
O CLASS(*JAVA:’java.lang.String’)
O
EXTPROC(*JAVA:’java.lang.String’:*CONSTRUCTOR)
CLASS(*JAVA:’java.lang.String’)
10A
PR 10A EXTPROC(*JAVA:’java.lang.String’:’getBytes’)
PR
O EXTPROC(*JAVA:’java.lang.String’:’trim’)
CLASS(*JAVA:’java.lang.String’)
EVAL str = makestring(fld)
EVAL str = trimstring(str)
EVAL fld = makeslpha(str)
Miscellaneous Changes
ELSEIF
Can combine an ELSE and IF together
If A = 1;
X = X + 1;
ElseIf A = 2;
X = X + 2;
ElseIf A = 3;
X = X + 3;
EndIf;
Reduce number of ENDIFs and nesting
levels
Don’t forget about SELECT
Qualified Data Structure
Names
New keyword QUALIFIED - allows names
to be reused in the program
Useful in prototyped parameter definitions
New keyword LIKEDS(data structure) will have the same structure
Qualified Data Structures
Example
Summary
Built-In Functions (BIFs)
Free-format
Runtime Control of Files and Members
Improved Error Control
Increased Java support
Miscellaneous Changes