|
Hi John,checking
Seems to me that you aren't really talking about a difference between
RPG III and RPG IV. You are talking about a difference between
the resutls using a BIF like %FOUND or %EOF vs. using an indicator.READE
In RPG IV (as well as RPG III) you can do this:
c xxkey chain xxfmt lr
c dow *inlr = *off
c* do the real work here.
c xxkey reade xxfmt lr
c enddo
Nothing has changed. RPG III and RPG IV are identical. But perhaps
what you didn't think about is that the indicators on CHAIN and on
don't mean the same thing. (And this has always been documented thisway!)
The indicator on CHAIN is in the HI position, and it means "record not
found".file"
The indicator on READE is in the EQ position and it means "end of
that
This, again, is the case in both RPG III and RPG IV.
When IBM gave us BIFs to replace the indicators, they gave us BIFs
match what the indicators do. They gave us %FOUND which we can checkto
see if a record was found (or not), and they gave us %EOF which we can
check to see if we're at the end of the file (or not). Soessentially,
they gave us exactly what we had before. The difference, however, isyou
that they don't have the same name as one another. in your RPG III
example, and my indicator-driven RPG IV example, the name of the
indicator is LR in for both "not found" and "end of file". However,
%FOUND and %EOF always have different names from one another...
So you can't do what you posted and expect it to work!! here's what
coded:do
c xxkey chain xxfmt
c dow not %eof(xxfile)
c* do the real work here.
c xxkey reade xxfmt
c enddo
Well, since the CHAIN op-code doesn't set the %EOF indicator (it sets
%FOUND), this code doesn't make a lot of sense!! So of course this
doesn't work. What you really wanted to do was this:
c xxkey chain xxfmt
c if %found(xxfile)
c dou %eof(xxfile)
c* do the real work here.
c xxkey reade xxfmt
c enddo
c endif
Or if you want it to work exactly like the RPG III example, you could
this instead:
c xxkey chain xxfmt
c eval *inlr = not %found
c dow not *inlr
c* do the real work here.
c xxkey reade xxfmt
c eval *inlr = %eof
c enddo
That would do (literally) what you did in RPG III using BIFs... but I
find that ugly. This need to check a different BIF for differentand
results has led a lot of people to stop using CHAIN to prime a loop,
instead use SETLL/READE:
c xxkey setll xxfmt
c xxkey reade xxfmt
c dow not %eof(xxfile)
c* do the real work here.
c xxkey reade xxfmt
c enddo
But, however you decide to proceed, I hope you at least understand the
situation now.work.
jmmckee wrote:
Where I work, training is something of a dirty word.
To read multiple records using a partial key in RPG III, I do this:
xxkey chain xxfmt LR
*INLR doweq *OFF
xxkey reade xxfmt LR
enddo
On a project a few years ago, written in RPG IV, that code did not
records were read just went to end of file, as I recall. Been too long.
The only way we found to make it work was to do this:
xxkey setll xxfmt
xxkey reade xxfmt
dow not %eof(xxfile)
xxkey reade xxfmt
enddo
Doing a CHAIN to position and read the first record when multiple
This has really been bugging me for a long time. I couldn't find a
Were we doing someting wrong that caused the RPG IV code to fail?
John McKee
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.