0% found this document useful (0 votes)
81 views18 pages

Whats New and Exciting in RPG

The document discusses new and exciting features in RPG programming. It covers topics like IBM no longer waiting for the next release to provide new features, support for RPG in different development environments, and new functions and capabilities in recent RPG releases like %PASSED, %OMITTED, SELECT/WHEN-IS/WHEN-IN, and enhanced PCML generation.

Uploaded by

rahul810191
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
81 views18 pages

Whats New and Exciting in RPG

The document discusses new and exciting features in RPG programming. It covers topics like IBM no longer waiting for the next release to provide new features, support for RPG in different development environments, and new functions and capabilities in recent RPG releases like %PASSED, %OMITTED, SELECT/WHEN-IS/WHEN-IN, and enhanced PCML generation.

Uploaded by

rahul810191
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 18

What's New and Exciting in RPG

(AKA Scott Goes Crazy.)


Presented by

Scott Klement
http://www.scottklement.com

© 2016-2023, Scott Klement

There's a band called 1023 MB.


They haven't had any gigs yet.

This Session Is Organized by Feature

This session is
organized by date…

…not by release. i Next + 1

i Next

IBM i 7.5

IBM i 7.4

IBM i 7.3
A chart at the end will
IBM i 7.2
detail the releases.
IBM i 7.1
2
IBM No Longer Waits For Next Release

This is really, really cool!

• Prior to IBM i 7.1 ("V7R1") to get new RPG feature, you waited
for next release.
• Couldn't install it right away? Had to wait longer.
• Needed to support both newer and older releases? Wait longer.
• Could be 5+ years before you could use a feature you wanted.

This is no longer true!

• Starting with Open Access (should've been a 7.2 feature) most


new stuff is available on all supported releases!
• Fully free format
• DATA-INTO
• Nested Data Structures

Is This Good Or Bad?

Definitely good for developers?


• especially software companies.

Does it look bad for IBM?


• why should people update releases?
• do people perceive IBM's RPG
commitment as "less"?

For this reason, IBM holds back at least


some of the updates to the next release.

4
Support in SEU

There is none.

SEU has not had updates since the release of IBM i 6.1
That was March 21 2008!

Use the current version of RDi, or a 3rd party tool:

IBM Rational Developer for i (RDi) VS Code (open source, cross-platform):


• https://www.ibm.com/support/pages/rational-developer-i-download
• VS Code IDE:
https://code.visualstudio.com/
MiWorkplace (Remain Software): • Main IBM i:
• https://remainsoftware.com/miworkplace-development-environment-ibm-i https://marketplace.visualstudio.com/items?itemName=HalcyonTech
Ltd.code-for-ibmi
• RPGLE Language Tools:
https://marketplace.visualstudio.com/items?itemName=HalcyonTech
Ltd.vscode-rpgle

%PASSED
(Spring 2023) PTF for 7.5, 7.4
• %PASSED checks both if a given parameter was passed and wasn't *OMIT-ed.
• Previously would need to check %PARMS, %PARMNUM and %ADDR
dcl-pi *n; dcl-pi *n;
Old
New

p1 int(10) options(*omit); p1 int(10) options(*omit);


p2 varchar(20) const options(*nopass); p2 varchar(20) const options(*nopass);
p3 varchar(20) const options(*nopass : *omit); p3 varchar(20) const options(*nopass : *omit);
end-pi; end-pi;

// p1 is required, but *OMIT could be passed // p1 is required, but *OMIT could be passed
if %passed(p1); if %addr(p1) <> *null;
dsply ('Parameter p1 = ' + %char(p1)); dsply ('Parameter p1 = ' + %char(p1));
else; else;
dsply ('Parameter p1 is not available'); dsply ('Parameter p1 is not available');
endif; endif;

// p2 is optional // p2 is optional
if %passed(p2); if %parms >= %parmnum(p2);
dsply ('Parameter p2 = ' + p2); dsply ('Parameter p2 = ' + p2);
else; else;
dsply ('Parameter p2 is not available'); dsply ('Parameter p2 is not available');
endif; endif;

// p3 is optional, and *OMIT could be passed // p3 is optional, and *OMIT could be passed
if %passed(p3); if %parms >= %parmnum(p3) and %addr(p3) <> *null;
dsply ('Parameter p3 = ' + p3); dsply ('Parameter p3 = ' + p3);
else; else;
dsply ('Parameter p3 is not available'); dsply ('Parameter p3 is not available');
endif; endif;
6
%OMITTED
(Spring 2023) PTF for 7.5, 7.4
• %OMITTED checks if a given parameter was omitted (vs. not passed, etc.)
• Primarily useful to distinguish between no parameter passed vs. *OMIT passed.
• Equivalent to checking %parms() >= %parmnum(p2) and %addr(p2) = *null

dcl-pi *n;
p1 varchar(20) const options(*nopass : *omit);
end-pi;

// p1 is optional, and *OMIT could be passed


if %passed(p1);
dsply ('Parameter p1 = ' + p1);
elseif %omitted(p1);
dsply ('*OMIT was passed for parameter p1');
else;
dsply ('No parameter was passed for p1');
endif;

SELECT/WHEN-IS/WHEN-IN
(Spring 2023) PTF for 7.5, 7.4
• The SELECT opcode now allows an expression to be provided after the opcode.
• WHEN-IN can be used to check if that expression is IN a list, range, array, etc.
• WHEN-IS can be used to check if it is equal to a value.
• Similar to the switch/case you see in some other languages.

dcl-s Price packed(9: 2); dcl-s UOM char(2);


dcl-s casesArray char(2) dim(2);
select Price;
when-is 0; casesArray(1) = 'CA';
// No charge item casesArray(2) = 'BX';
when-in %range(2.75 : 20.00);
// Price is allowed select UOM;
other; when-in %list('EA': 'PC': 'IT');
// Invalid price desc = 'Item';
endsl; when-is 'PL';
desc = 'Pallet';
when-in casesArray;
desc = 'Case';
other;
desc = '** INVALID UOM **';
endsl;
8
PCML V8 w/Boolean
(Spring 2023) PTF for 7.5, 7.4, 7.3 (!!)
• When generating PCML with the PGMINFO option, you can now specify *V8
• Alternately, you can set the QIBM_RPG_PCML_VERSION environment variable.
• Generated PCML will now supply boolean="true" to the PCML document for any RPG
indicator parameters.

ADDENVVAR ENVVAR(QIBM_RPG_PCML_VERSION) VALUE('8.0')

ctl-opt pgminfo(*pcml : *dclcase: *v8 );

dcl-pi *n;
customer packed(4: 0);
active ind;
end-pi;

<pcml version="8.0">
<program name="MYPGM" entrypoint="MYPGM">
<data name="customer" type="packed" length="4" precision="0" usage="inputoutput" />
<data name="active" type="char" length="1" boolean="true" usage="inputoutput" />
</program>
</pcml>

%SPLIT w/*ALLSEP

(Spring 2023) PTF for 7.5, 7.4


• The %SPLIT built-in function now supports all separators via the *ALLSEP option.
• Will discuss this when discussing the %SPLIT BIF, later.

• %SPLIT was added in Spring 2021, but the *ALLSEP option is newer, Spring 2023!

10
RPGPPOPT w/Long Records

(January 2023) PTF for 7.5, 7.4, 7.3 (!!)


• The SQL preprocessor (CRTRPGSQLI) now lets you control the record length of the preprocessed
source member that it outputs.
• Only when using RPGPPOPT(*LVLx)
• You can specify the PPMINOUTLN parameter on CRTBNDRPG/CRTRPGMOD
• Alternately, use the QIBM_RPG_PPSRCFILE_LENGTH environment variable.
• Previously, long lines could fail with RNF0733 when generating the output. Source lines were limited to
100 characters by the preprocessor.

For example, suppose you compile from the IFS, and you have records that are long (maybe 200 characters
long – there is no limit in the IFS!)

CRTSQLRPGI OBJ(MYPGM) SRCSTMF('/home/scott/mypgm.sqlrpgle') RPGPPOPT(*LVL2)


RNF0733 The record length of the output file is too small.

This is because it preprocesses it into QTEMP/QSQLPRE – a source file, which has a limit of 100
characters per line.

ADDENVVAR ENVVAR(QIBM_RPG_PPSRCFILE_LENGTH) VALUE('250')


CRTSQLRPGI OBJ(MYPGM) SRCSTMF('/home/scott/mypgm.sqlrpgle') RPGPPOPT(*LVL2)

Now QTEMP/QSQLPRE is created with a record length of 250, so no errors.

11

OPTIONS(*CONVERT)
(Fall 2022) PTF for 7.5, 7.4
• OPTIONS(*CONVERT) on a prototyped parameter with CONST or VALUE will
automatically convert numbers, dates, times and timestamps to character. Pointers will be
treated like options(*string).
• Useful when a subprocedure may want data passed from different sources, and you don't
want to go to the extra level of implementing overloading.

WriteMsg(123);
WriteMsg(%date());
WriteMsg('Scott is cool!');
return;

dcl-proc WriteMsg;
dcl-pi *n;
msg varucs2(100) const options(*convert);
end-pi;

snd-msg 'The parameter is ' + msg;


end-proc;

12
%CONCAT
(Fall 2022) in PTF for 7.5, 7.4
• %CONCAT will concatenate a list of items, joining them with a given separator.
• Alternately, you can specify *NONE if you do not wish to use a separator.

dcl-s csv varchar(200);


dcl-s string varchar(10);

csv = %concat(',' : '1001' : 'Acme Inc' : 'Scott Klement' : '123 Main St');
// csv = '1001,Acme Inc,Scott Klement,123 Main St'

string = %concat(*none : 'A' : 'B' : 'C');


// string = 'ABC'

13

%CONCATARR
(Fall 2022) PTF for 7.5, 7.4
• Similar to %CONCAT, except %CONCATARR will concatenate the elements of an array.

dcl-s csv varchar(200);


dcl-s data varchar(20) dim(4);

data(1) = '1001';
data(2) = 'Acme Inc';
data(3) = 'Scott Klement';
data(4) = '123 Main St';

csv = %concatarr(',': data);


// csv = '1001,Acme Inc,Scott Klement,123 Main St'

14
CHARCOUNT NATURAL
(Fall 2022) PTF for 7.5, 7.4
• When coding UTF-8 or UTF-16 data, the length of a character can vary. (UTF-8 characters
are 1-4 bytes long, UTF-16 are 2 or 4 bytes.)
• With CHARCOUNT(*NATURAL) BIFs like %SUBST, %SCAN, %XLATE and %SPLIT will
work with the number of characters (regardless of the byte size of each.)
• The old mode is called CHARCOUNT(*STDCHARSIZE) and the preceding BIFs will treat
the numbers as bytes (for CHAR) or double-bytes (for UCS-2) regardless of the length of
the individual character.
• Can specify ctl-opt (or h-spec) CHARCOUNT and CHARCOUNTTYPES
• Or /CHARCOUNT directive
• Or CHARCOUNT file keyword (dcl-f or f-spec)
• Or specify *NATURAL or *STDCHARSIZE on the BIF itself.
• The %CHARCOUNT BIF can be used to get the length in natural characters

dcl-s string varchar(20) ccsid(*utf8);


dcl-s len int(10);

string = 'ábcdë';

len = %len(string);
// len = 7 (á and ë are 2-byte characters)
len = %charcount(string);
// len = 5
15

CHARCOUNT NATURAL
dcl-s string varchar(20) ccsid(*utf8);
dcl-s string2 varchar(20);

string = 'ábcdë';

string2 = %subst(string : 1 : 3);


// string2 = "áb"

string2 = %subst(string : 1 : 3 : *natural);


// string2 = "ábc"
ctl-opt charcounttypes(*utf8) charcount(*natural);

dcl-s string varchar(20) ccsid(*utf8);


dcl-s string2 varchar(20);

string = 'ábcdë';

string2 = %subst(string : 1 : 3);


// string2 = "ábc"

/charcount stdcharsize

string2 = %subst(string : 1 : 3);


// string2 = "áb"
16
SND-MSG
(Spring 2022) in 7.5, PTF for 7.4, 7.3
• SND-MSG opcode lets you send program messages from RPG (like SNDPGMMSG from
CL)
• Defaults to an *INFO message but can also be *ESCAPE.
• Other types (*DIAG, *STATUS, *COMP) are not currently supported.
• The %MSG BIF is used to control the msg id/msg file.
• Default for *INFO is no message id, *ESCAPE is CPF9898
• The %TARGET BIF can be used to control which call stack entry the message is sent to. It
allows *SELF or *CALLER, plus an optional stack count.

// these send *INFO messages that will appear in the job log

SND-MSG 'Program MSGSFL1 has started.';


SND-MSG *INFO 'This works the same, *INFO is the default.';
SND-MSG *INFO %MSG( 'CPF9898'
: '*LIBL/QCPFMSG'
: 'This uses a message from a MSGF');

// This sends an *ESCAPE message to 1 call stack prior to the caller


// (aka the "caller's caller")

SND-MSG *ESCAPE %MSG('CPF2105': 'QCPFMSG': 'SNDMSG1 *LIBL PGM')


%TARGET(*CALLER:1);
17

SND-MSG with MSGSFL

One common use of sending messages in RPG (aside from reporting errors and putting
information in the job log) is to load a "message subfile" (DDS MSGSFL)

**free A DSPSIZ(*DS3)
ctl-opt DFTACTGRP(*NO) ACTGRP(*NEW); A R MSGSFL
A SFL
dcl-f MSGSFL4D workstn; A SFLMSGRCD(15)
A MSGKEY SFLMSGKEY
dcl-ds sds PSDS; A PGMQ SFLPGMQ(10)
PgmQ *proc; A*
end-ds; A R MSGCTL
A SFLCTL(MSGSFL)
dcl-s num packed(4: 0); A SFLDSP
A SFLDSPCTL
snd-msg 'This is a test message' A SFLINZ
%target(PGMQ); A N99 SFLEND
A SFLSIZ(20)
write msgctl; A SFLPAG(5)
exfmt msgscn1; A PGMQ SFLPGMQ(10)
A R MSGSCN1
*inlr = *on; A OVERLAY

18
ON-EXCP
(Spring 2022) in 7.5, PTF for 7.4, 7.3
• ON-EXCP opcode works together with MONITOR to let you monitor for specific exception
messages (similar to MONMSG in CL)
dcl-pr QCMDEXC extpgm;
command char(32767) const;
length packed(15: 5) const;
igc char(3) const options(*nopass);
end-pr;

dcl-s cmd varchar(200);

cmd = 'CHKOBJ OBJ(LLLL/FFFF) OBJTYPE(*FILE)';


cmd = %scanrpl('LLLL': %trim(Library): cmd);
cmd = %scanrpl('FFFF': %trim(File) : cmd);

monitor;
QCMDEXC(cmd: %len(cmd));
on-excp 'CPF9801';
// file wasn't found
on-excp 'CPF9810';
// library wasn't found
endmon;

monitor;
QCMDEXC(cmd: %len(cmd));
on-excp 'CPF9801': 'CPF9810';
// Either the library or the file wasn't found
endmon; 19

SND-MSG and ON-EXCP Together


Naturally, you can use SND-MSG to send messages that you trap with ON-EXCP. For
example, you can use SND-MSG to report errors from a subprocedure.
dcl-proc getCustomerName;

dcl-pi *n varchar(30);
CustNo packed(7: 0) value;
end-pi;

dcl-f custmastp disk usage(*input) static;


dcl-ds custrec likerec(custmastr:*input);

chain CustNo custmastp custrec;


if not %found;
snd-msg *ESCAPE 'Customer not found'; // Default for *ESCAPE is CPF9898
else;
return %trim(custrec.csName);
endif;

end-proc;

monitor;
name = getCustomerName(custNo);
// got the name!
on-excp 'CPF9898';
// customer wasn't found
endmon;

20
%MAXARR / %MINARR

(Fall 2021) in 7.5, PTF for 7.4, 7.3


• %MAXARR and %MINARR BIFs return the index to the maximum/minimum array elements

dcl-s arr char(1) dim(5); ctl-opt datfmt(*usa);


dcl-s highest int(10);
dcl-s birth_date date dim(4);
arr(1) = 'A'; dcl-s lowest int(10);
arr(2) = 'Z';
arr(3) = 'B'; birth_date(1) = d'07/04/1999';
arr(4) = 'Y'; birth_date(2) = d'01/02/2000';
arr(5) = 'C'; birth_date(3) = d'05/19/1967';
birth_date(4) = d'09/30/2021';
highest = %MAXARR(arr); // highest = 2
lowest = %MINARR(birth_date);
msg = 'The index with the highest value: ' msg = 'Oldest birth: '
+ %char(highest); + %char(birth_date(lowest));

dcl-s inv_amt packed(9: 2) dim(3);


dcl-s lowest int(10);
dcl-s highest int(10);

inv_amt(1) = 27700.95;
inv_amt(2) = 12345.67;
inv_amt(3) = -4;

lowest = %MINARR(inv_amt);
msg = 'Lowest total invoice: ' + %char(inv_amt(lowest));

highest = %MAXARR(inv_amt);
msg = 'Highest total invoice: ' + %char(inv_amt(highest));
21

SORTA With Multiple Fields

(Fall 2021) in 7.5, PTF for 7.4, 7.3


• %FIELDS BIF allows you to sort an array by multiple subfields with SORTA

dcl-ds Employee qualified dim(3);


name char(20);
dept char(12);
state char(2);
end-ds;

Employee(1).name = 'Klement, Scott'; // will be second (Development, WI)


Employee(1).dept = 'Development';
Employee(1).state = 'WI';

Employee(2).name = 'Russo, David'; // will be first (Development, OH)


Employee(2).dept = 'Development';
Employee(2).state = 'OH';

Employee(3).name = 'Seage, Emily'; // will be third (Support, MS)


Employee(3).dept = 'Support';
Employee(3).state = 'MS';

sorta Employee %fields(dept: state: name);

22
DEBUG(*CONSTANTS)
(Fall 2021) in 7.5, PTF for 7.4, 7.3
• DEBUG(*CONSTANTS) is a CTL-OPT (or H-spec) keyword that lets you view
the values of constants while debugging.

23

%UPPER and %LOWER


(Spring 2021) in 7.5, PTF for 7.4, 7.3
• %UPPER built-in function converts a string to uppercase
• %LOWER built-in function converts a string to lowercase
• Optional second parameter specifies the start position within the string
• Works with international characters, too. (So is better than %XLATE!)

myString = 'mIxEdcaSe';
myString = %lower(myString);

// myString is now 'mixedcase'

upperCase = %upper(myString);

// upperCase is now 'MIXEDCASE'

titleCase = %lower(upperCase:2);

// titleCase is now 'Mixedcase'

24
%SPLIT
(Spring 2021) in 7.5, PTF for 7.4, 7.3
• %SPLIT built-in function splits a string when a given substring is found.
• The result is an array of strings

dcl-ds invoice qualified;


name varchar(30) inz('unused');
amount packed(9: 2) inz(-1);
end-ds;

dcl-s record varchar(200) inz('Acme Foods Inc | 4502.60');


dcl-s array varchar(50) dim(2);

array = %split(record:'|');

invoice.name = array(1);
invoice.amount = %dec(array(2):9:2);

In this example, two fields are stored in one string, separated by the pipe character.
%Split is used to split them into two array elements, which can then be assigned to
separate fields in a data structure.

25

FOR-EACH
(Fall 2020) in 7.5, PTF for 7.4, 7.3
• FOR-EACH loop opcode
Loops through all of the elements in an array. Can be used together with %SUBARR

Old way (FOR loop) New way (FOR-EACH loop)


total = 0; total = 0;
for x = 1 to %elem(invoices); for-each invoice in invoices;
total += invoices(x).amount; total += invoice.amount;
endfor; endfor;

Old way (FOR loop) New way (FOR-EACH loop)


total = 0; total = 0;
for x = 1 to numLoaded; for-each invoice in %subarr(invoices: 1: numLoaded);
total += invoices(x).amount; total += invoice.amount;
endfor; endfor;

26
FOR-EACH with %SPLIT
• Since %SPLIT returns an array, it can be used with a FOR-EACH loop
• In this example, "shelves" is a list of shelves separated by commas
• %SPLIT could be used in a similar manner to the way %LIST was used before.

dcl-s shelves varchar(20) inz('TOP,A,B,C,FLOOR');


dcl-s shelf char(5);

for-each shelf in %split(shelves:',');

chain (whsloc: shelf) INVENP;


if %found and ItemCode = Item;
leave;
endif

endfor;

Split is very useful when reading IFS files in CSV, Tab or Pipe-Delimited format, or when a
database field or user input contains a delimited list of data.
27

%SPLIT w/*ALLSEP
(Spring 2023) PTF for 7.5, 7.4
• The %SPLIT built-in function now supports all separators via the *ALLSEP option.
• Without this option %SPLIT would ignore leading, trailing or consecutive separators.
Without *ALLSEP With *ALLSEP
dcl-s csv varchar(1000); dcl-s csv varchar(1000);
dcl-s fld varchar(20); dcl-s fld varchar(20);

csv = '1001,Acme Inc,Scott Klement,123 Main St';


for-each fld in %split(csv : ',' ); // First example works the same, since there
dsply fld; // are no leading, trailing or consecutive
// values for fld in the for-each loop: // separators
// 1 1001
// 2 Acme Inc
// 3 Scott Klement // Second example however, no longer ignores the
// 4 123 Main St // "empty field" (consecutive separators)
endfor;
csv = '1002,Industrial Supply,,500 Superior Ln';
csv = '1002,Industrial Supply,,500 Superior Ln'; for-each fld in %split(csv : ',' : *ALLSEP);
for-each fld in %split(csv : ',' ); dsply fld;
dsply fld; // values for fld in the for-each loop:
// values for fld in the for-each loop: // 1 1002
// 1 1002 // 2 Industrial Supply
// 2 Industrial Supply // 3 (empty string)
// 3 500 Superior Ln // 4 500 Superior Ln
endfor; endfor;
28
IN, %RANGE, %LIST
(Fall 2020) in 7.5, PTF for 7.4, 7.3
• IN operator used in comparisons with %RANGE or %LIST
• %RANGE used to compare data in a range
• %LIST returns a temporary array from a list of values

// OLD: if Qty >= 1 and Qty <= 999;

if Qty IN %range(1:999);
msg = 'Quantity acceptable.';
endif;

// OLD: if shelf = 'TOP' or shelf = 'A' or shelf = 'B'


// or shelf = 'C' or shelf = 'FLOOR';

if shelf in %list('TOP': 'A': 'B': 'C': 'FLOOR');


msg = 'Shelf level is acceptable';
endif;
29

FOR-EACH with %LIST

Since %LIST returns a temporary array, it can also be used with the FOR-EACH
loop I discussed earlier.

// Search shelves in warehouse location for ItemCode

for-each shelf in %list('TOP': 'A': 'B': 'C': 'FLOOR');


chain (whsloc: shelf) INVENP;
if %found and ItemCode = Item;
leave;
endif;
endfor;

30
Soooo Many Enhancements!

There have been 30 enhancements to RPG the past 5 years

…and around 82 since SEU stopped being enhanced (yet, people still use it!)

That does not include other enhancements that we all use:


• RDi, Db2, SQL Services, HTTP server, Integrated Web Services, etc, etc.

That's a lot of new stuff!

89

During 7.4 Development Cycle

7.1 7.2 7.3 7.4

Compile from Unicode Source (TGTCCSID compile keyword) ptf ptf ptf X
PCML 7.0 Support ptf ptf X
ALIGN(*FULL) ptf ptf X
%MIN and %MAX BIFs ptf ptf X
Support for Complex Qualified Names in %ELEM, %SIZE, DEALLOC and RESET ptf ptf X
%PROC BIF ptf ptf X
DATA-INTO opcode ptf ptf X
Nested Data Structures ptf ptf X
ON-EXIT section ptf ptf X
PSDS subfields for internal job id and system name ptf ptf X
SAMEPOS DS keyword ptf X
DIM(*CTDATA) X
Varying-dimension arrays X

All features on this chart are available in 7.4+

93
During 7.5 Development Cycle
7.3 7.4 7.5

DATA-GEN ptf ptf X


OVERLOAD ptf ptf X
OPTIONS(*EXACT) ptf ptf X
LIKEDS(qualified.name.here) ptf ptf X
%KDS with variable key count ptf ptf X
%TIMESTAMP with microseconds and *UNIQUE ptf ptf X
DEBUG(*RETVAL) ptf ptf X
REQPREXP( *REQUIRE | *WARN ) ptf ptf X
%RANGE ptf ptf X
%LIST ptf ptf X
FOR-EACH loops ptf ptf X
EXPROPTS(*ALWBLANKNUM or *USEDECEDIT) for %DEC, %INT, etc ptf ptf X
EXPROPTS(*STRICTKEY) ptf ptf X
%UPPER and %LOWER ptf ptf X
%SPLIT ptf ptf X
%MAXARR and %MINARR ptf ptf X
SORTA with multiple %FIELDS ptf ptf X
DEBUG(*CONSTANTS) ptf ptf X
SND-MSG ptf ptf X
ON-EXCP ptf ptf X

94

During i+1 (7.6?) Development Cycle


7.3 7.4 7.5

OPTIONS(*CONVERT) ptf ptf


%CONCAT and %CONCATARR ptf ptf
CHARCOUNT, CHARCOUNTTYPES and *NATURAL mode ptf ptf
PCML 8.0 (with boolean=true) ptf ptf ptf
CRTSQLRPGI RPGPPOPT with long lines (PPMINOUTLN) ptf ptf ptf
%PASSED and %OMITTED ptf ptf
SELECT with expression, WHEN-IS, WHEN-IN ptf ptf
*ALLSEP option for %SPLIT ptf ptf

95
Get The Latest PTFs

7.3
You can install any of the features (if Compiler TGTRLS(*CURRENT) SI83429
available for your release of IBM i) by QOAR source files SI71517
installing these PTFs. Runtime SI83428
Debugger SI81625
There is no need to install separate
7.4
PTFs for each feature, these PTFs Compiler TGTRLS(*CURRENT) SI83497
(and their pre-requisites) include it all. Compiler TGTRLS(V7R3M0) SI83483
QOAR source files SI71518
Runtime SI83471
Debugger SI81626

7.5
Compiler TGTRLS(*CURRENT) SI83480
Compiler TGTRLS(V7R4M0) SI83496
Compiler TGTRLS(V7R3M0) SI83494
Runtime SI83468

96

This Presentation

You can download a PDF copy of this presentation:


http://www.scottklement.com/presentations/

Thank you!

97

You might also like