"
It is definitely the CHAIN that is the issue. It would appear that the
CHAIN/UPDATE requires the write of the subfile control before the READC
loop." - Paul Tuohy (e-mail below)
I would like very much to see any documentation where this is specified;
I couldn't find any (maybe I didn't know how/where to look for...)
Thank you
Florin Todor
-----Original Message-----
From: rpg400-l-bounces@xxxxxxxxxxxx
[mailto:rpg400-l-bounces@xxxxxxxxxxxx] On Behalf Of Paul Tuohy
Sent: Friday, October 01, 2010 5:37 AM
To: RPG programming on the IBM i / System i
Subject: Re: Chain and Readc
Hi Scott,
No more than yourself, it has been a few years since I have "played"
with subfiles - but this piqued my interest <g>
It is definitely the CHAIN that is the issue. It would appear that the
CHAIN/UPDATE requires the write of the subfile control before the READC
loop.
On the other hand - if you have a READC loop followed by a READC loop -
it works just fine.
If anyone feels the urge to play (and I have no idea why anyone would
want to) I am including the code for a display file and a trivial
program. The "important bit" is in the VALIDATE subroutine - comment out
either the READC loop or the CHAIN loop.
A DSPSIZ(24 80 *DS3)
A INDARA
A CA03(03 'Exit')
*
A R SUBREC SFL
A 54 SFLNXTCHG
A OPTION 1A B 7 3
A NUMBER 5S 0O 7 11
A R SUBCTL SFLCTL(SUBREC)
A OVERLAY
A 51 SFLDSP
A 52 SFLDSPCTL
A 53 SFLCLR
A 51 SFLEND(*MORE)
A SFLSIZ(0050)
A SFLPAG(0014)
A RRN 4S 0H
A 1 28'Test Subfile'
A 3 2'Type Option, Press Enter'
A 4 2'5=View'
A COLOR(BLU)
A 6 2'Opt'
A DSPATR(HI)
A 6 10'Data'
A R FOOTER
A 23 2'F3=Exit F5=Refresh'
A DSPATR(HI)
A COLOR(BLU)
H option(*srcStmt: *noDebugIO)
FTRPG007D CF E WorkStn SFile(SubRec: RRN)
D ctlEvent S 4
/free
ctlEvent = 'LOAD';
doU ctlEvent = '*END';
select;
when ctlEvent = 'LOAD';
exSR loadSubFile;
when ctlEvent = 'DISP';
exSR display;
when ctlEvent = 'VALD';
exSR validate;
when ctlEvent = 'PROC';
exSR process;
endSl;
endDo;
*inLR = *on;
begSR loadSubFile;
ctlEvent = 'DISP';
*in53 = *on;
write SUBCTL;
*in53 = *off;
RRN = 0;
option = *blanks;
number = 0;
for RRN = 1 to 10;
write SubRec;
endFor;
endSR;
begSR display;
ctlEvent = 'VALD';
*in51 = *on;
*in52 = *on;
write FOOTER;
exFmt SUBCTL;
*in51 = *off;
*in52 = *off;
select;
when *in03;
ctlEvent = '*END';
endSl;
endSR;
begSR validate;
ctlEvent = 'PROC';
RRN = 1;
*in54 = *on; // Set SFLNXTCHG
readC subRec;
dow not %EOF();
update subRec;
readC subRec;
endDo;
// for RRN = 1 to 10;
// chain RRN subRec;
// update subRec;
// endFor;
*in54 = *off;
endSR;
begSR process;
ctlEvent = 'DISP';
RRN = 1;
readC subRec;
dow not %EOF();
option = *blanks;
number += 1;
update subRec;
readC subRec;
endDo;
endSR;
/end-Free
Regards
Paul Tuohy
ComCon
www.comconadvisor.com
www.systemideveloper.com
Scott Klement wrote:
Hi Paul,
Hate to disagree, but you should not need to display the subfile for
the
subsequent READC to work.
Hmmm... I must admit, it's been a few years since I've done any
serious
subfile programming... but I definitely remember that if you set
SFLNXTCHG, then immediately try running READC (without displaying the
subfile in between) it wouldn't work.
The technique I have always used with "load all subfiles" is to
perform
a validation pass over a subfile (using a READC loop) and update each
subfile record with SFLNXTCHG set. If any record is invalid, the
subfile
is re-displayed. Otherwise, another READC loop is performed - without
any interim reference to the subfile control record.
Hmmm... I've never tried doing READC followed by another READC. I've
only done CHAIN followed by READC.