|
phon_P is telDS_P - I made mistake while I was creating example...
Igor.Beslic@xxxxxxxxxxxx
Sent by: rpg400-l-bounces+igor.beslic=volksbank.hr@xxxxxxxxxxxx
13.10.2004 15:55
Please respond to
RPG programming on the AS400 / iSeries <rpg400-l@xxxxxxxxxxxx>
To
rpg400-l@xxxxxxxxxxxx
cc
Subject
exported Data structures and files
Hi I have question abouth data structures and EXPORT keyword...
I have 3 modules writerMOD, formatMOD, mainMOD and 2 DataStructures that
should be accessable from writerMOD and formatMOD.
prototypes and DS definitions are in one source member
*********************************************************
***prjctProto source
*********************************************************
D nameDS DS
D Lab1 14A INZ('Name of user: ')
D User 10A
D phoneDS DS %BASED(telDS_P)
D Fld1 14A
D Fld2 20A
*DS is automaticly loaded performing read of FILEt1
D phon1DS DS
D Lab2 14A INZ('Telephone No: ')
D TelNo1 20A
*DS is automaticly loaded performing read of FILEt2
D phon2DS DS
D Lab3 14A INZ('Telephone No: ')
D TelNo2 20A
DwriteLine PR
D 2S 0 VALUE
DdefineName PR
D 5A VALUE
DdefinePhone PR
D 5A VALUE
D 1A VALUE
mainMOD reads input file and decides what Names will be written
**********************************************************
***mainMOD source
**********************************************************
F mainFileIF E DISK
/copy prjctProto
.
.
.
C read mainRF
C CALLP defineName(UsrID)
C CALLP definePhone(UsrID:phoneID)
.
.
.
writerMOD copies data from data structures nameDS and telephoneDS in to
txtLine and
write txtLine to stmf.
********************************************************
***writerMOD source
********************************************************
HNOMAIN
F FileUser IF E K DISK
F FileT1 IF E K DISK
F FileT2 IF E K DISK
/copy prjctProto
PwriteLine B EXPORT
DwriteLine PI
D lineID 2S 0 VALUE
D txtLINE S 100A
/free
Select;
when lineID=LINE_USER;
txtLINE=nameDS;
when lineID=LINE_PHONE;
txtLine=phoneDS;
.
.
.
EndSl;
//the rest of code writes the line
/end-free
PwriteLine E
formatMOD contains subprocedures that fill nameDS and telephoneDS with
desired data
***********************************************************
***formatMOD source
***********************************************************
HNOMAIN
F FileUser IF E K DISK USROPN
F FileT1 IF E K DISK USROPN
F FileT2 IF E K DISK USROPN
/copy prjctProto
PdefineName B EXPORT
D defineName PI
D user 5A VALUE
*after this operation nameDS is filled with data
/FREE
OPEN FileUser
chain user fileUserRF;
WriteLine(LINE_USER);
CLOSE FileUser
/END-FREE
pdefineName E
PdefinePhone B EXPORT
D definePhone PI
D user 5A VALUE
D phone1 1A VALUE
*after this operation nameDS is filled with data
/FREE
OPEN FILEt1;
OPEN FILEt2;
if phone1='Y'
chain user fileT1RF;
phon_P=%ADDR(phon1DS);
else;
chain user fileT2RF;
phon_P=%ADDR(phon2DS);
EndIf;
writeLine(LINE_PHONE);
CLOSE FILEt1;
CLOSE FILEt2;
/END-FREE
pdefinePhone E
well, problem is in telephoneDS which is defined in prototype copy member
with
D phoneDS DS %BASED(telDS_P)
I have primary and secondary phone number difined in separate files, so I
use phon1DS to be automaticly loaded on chain to FileT1 and phon2DS on
chain to FileT2.But when execution comes to phon_P=%ADDR(phon1DS); in
formatMOD there is issued memory not referenced prior Error.
Well I put out statements which define phon1DS and phon2DS from prototype
member and enter it directly in formatMOD and writerMOD (definitions are
present in 2 modules now) and program that is compiled from that three
modules works fine!!
I wonder what's the reason of error and is there any better solution if I
use EXPORT keyword on data structures. Maybe there is something with files
definition (fields TelNo1, TelNo2 and User are members of FileUser, Filet1
and Filet2)??
My final goal is to have all ds defined in one module (formatMod for
example) or in one place but that they are still accessable from writter.
You maybe wonder why I'm using Based keyword and %addr(), why I don't just
eval phoneDS=phon1DS but it's long story...
Help if you can and
Best regards!!
Igor Bešlić, dipl. ing. rač.
--
This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing list
To post a message email: RPG400-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at http://archive.midrange.com/rpg400-l.
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.