Thanks everyone, I'd seen my program working correctly before and couldn't understand what was happening now.
I put the pgm name in a variable and nothing was changing. I then noticed that I'd forgotten the trim on
MyLibPgm = %TRIM ( MyLib ) + '/MyPgm'
But I am even more confused.
The part that did the CHGLIBL was already coded in a variable name.
On debugging I saw MyLibPgm = 'MyBib /CHGLIBPGM' because the TRIM was not there either.
But, each time, the library list was changed correctly.
-----Message d'origine-----
De : rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-bounces@xxxxxxxxxxxx] De la part de Mark S. Waterbury
Envoyé : vendredi 20 février 2009 15:42
À : RPG programming on the IBM i / System i
Objet : Re: Problem with duplicated program names
Hi, David:
This has to do with how the RPG compiler generated code resolves the name of the program to call (whether RPG/400 or RPG IV).
When you hard-code a program name as a literal on the CALL statement (as you have shown), the RPG compiler generates code to "resolve" the name into a program pointer, just once, at program initialization time (think of an internal *INZSR). This is done because the "resolve" is relatively "expensive". Then, whenver the compiler "sees" a CALL to that same hard-coded name in the source program, it can just use the already resolved pointer to the program, so the CALL is much faster.
However, if you code something like this (in RPGLE):
c eval pgmNam = 'MyCLLE'
c call pgmNam
where pgmNam is a 10 character local variable, the compiler understands that you want to do a full dynamic call, and does the resolve, and then the call, in-line.
But, there is still one more "trick" to consider -- to try to further improve the performance, the RPG generated code keeps track of the name of the last program called in this way, so if the program name in that variable did not change since the last time it was used, the compiler will use the pointer to the program with that name, that it has already resolved. You can "fool" the compiler, in this situation, by making sure that you use the same "pgmNam" variable and do a full dynamic call for both 'myCLP' and 'myCLLE'. This way, whenever you call MYCLP (which changes the library list), the next time you call MYCLLE, the compiler checks the last value used for "pgmNam" and sees that it is no longer the same as "MYCLP" and so it will then re-resolve the address of MYCLLE, and you should get the behavior you desire.
Another way to avoid this is to "library qualify" the call, as follows:
Declare a variable named QualPgm as character 20, with two fields, pgmNam and pgmLib, defined as char 10, starting at position 1 and 11
respectively in the QualPgm "data structure". Fill in the pgmNam at
runtime, as we did previously, but also "plug in" the correct library name in the pgmLib field (as it appears your program may already know this library name, since your program is dynamically changing the library list.)
Then, use the qualified name on the CALL, as follows:
c call qualPgm
I hope this explanation makes sense.
Regards,
Mark S. Waterbury
David FOXWELL wrote:
Hi all,
I'm hoping someone can help with this problem.
I have an RPGLE that calls a CLP :
C CALL 'MyCLP' // This does a CHGLIBL
Then
C CALL 'MyCLLE' // MyCLLE exists in several libraries.
When I call MyCLLE a second time, it's the first instance of MyCLLE that is called, even if it is no longer in the library list.
How do I get my RPGLE to call the first object called MyCLLE in the library list after each CHGLIBL?
Thanks
--
This is the RPG programming on the IBM i / System i (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.