|
Hi Rob, You could combine HSPEC1 and HSPEC2 as follows H Datfmt(*USA) H Copyright('(C) Copyright Group Dekko Services, LLC') H ExprOpts(*RESDECPOS) H* EXTBININT will change (B)inary to (I)nteger. H EXTBININT(*YES) /If Defined *CRTBNDRPG /DEFINE HSpec H Bnddir('ROUTINES/SRVPGM':'QC2LE') H ActGrp(*CALLER) H DftActGrp(*NO) /UNDEFINE HSpec /EndIf Paul Tuohy ----- Original Message ----- From: <rob@xxxxxxxxx> To: "RPG programming on the AS400 / iSeries" <rpg400-l@xxxxxxxxxxxx> Sent: Thursday, July 22, 2004 10:35 PM Subject: Re: Service Programs 101 > > > Dave, > > You want to look at an intense binding directory? > WRKBNDDIRE BNDDIR(QC2LE) > This is the key to numerous cool functions like system(), etc. And some > ones I don't often see in RPG like arctangent. I did some brief scanning > for the documentation on QC2LE but can't really find it. If you want you > can do the following for every service program in the binding directory: > DSPSRVPGM SRVPGM(...) DETAIL(*PROCEXP *DTAEXP) > > > You can do the following to specify multiple binding directories: > H Bnddir('ROUTINES/SRVPGM':'QC2LE') > > In fact my typical H spec in my programs has the following: > /DEFINE HSpec > /INCLUDE ROUTINES/QRPGLESRC,HSPEC > /UNDEFINE HSpec > > and ROUTINES/QRPGLESRC,HSPEC has > /DEFINE HSpec > /COPY ROUTINES/QRPGLESRC,HSPEC2 > /COPY ROUTINES/QRPGLESRC,HSPEC1 > /UNDEFINE HSpec > > and ROUTINES/QRPGLESRC,HSPEC1 has > /DEFINE HSpec > H Bnddir('ROUTINES/SRVPGM':'QC2LE') > H ActGrp(*CALLER) > H DftActGrp(*NO) > /UNDEFINE HSpec > > and ROUTINES/QRPGLESRC,HSPEC2 has > H Datfmt(*USA) > H Copyright('(C) Copyright Group Dekko Services, LLC') > H ExprOpts(*RESDECPOS) > H* EXTBININT will change (B)inary to (I)nteger. > H EXTBININT(*YES) > > Why did I break apart HSPEC1 and HSPEC2? Because in my service programs I > do not use HSPEC. I only use HSPEC2. > > Hey, who was it that asked about the eval statement crashing about the > variable size recently? Would ExprOpts(*RESDECPOS) have been applicable to > them? > > Rob Berendt > -- > Group Dekko Services, LLC > Dept 01.073 > PO Box 2000 > Dock 108 > 6928N 400E > Kendallville, IN 46755 > http://www.dekko.com > > > |-----------------------------+-------------------------------------------| > | daparnin@xxxxxxxxxxxxxxxxx| | > | m | | > | Sent by: | To| > | rpg400-l-bounces@midrange.| rpg400-l@xxxxxxxxxxxx | > | com | cc| > | | | > | 07/22/2004 04:00 PM | Subject| > | | Re: Service Programs 101 | > | Please respond to | | > | RPG programming on the | | > | AS400 / iSeries | | > | <rpg400-l@xxxxxxxxxxxx>| | > | | | > | | | > |-----------------------------+-------------------------------------------| > > > > > > > > > > > Rob, Buck, Joel, & Scott, > > Wow. Thanks for the education and encouragement. The good news is that I > created a binding directory, did a ADDBNDDIRE to it for the service > program, added an BNDDIR ('BNDNISCO') H-spec to my RPG, and it compiled!!! > I'm almost afraid to say that it made sense. This might be a low-wattage > lightbulb moment. Right now I'm at only about 15 watts but I'll try to get > to 60. I agree that this would be a good topic for a FAQ (and I did look > for an explanation in the FAQ's before I posted). > > Buck suggested creating a single binding directory for all of the > developers here to use (that would be me). Since the system allows you to > create multiple binding directories will it cause problems to have more > than one or is it that there's no real need to have more than one? It > looks to me like it's an index that tells where to find service programs. > If that's the case then it wouldn't hurt to have multiple binding > directories that could possibly have the same service program listed in > them, it would just be confusing and you might have to search a bit to find > the correct one. (And trust me--I have enough confusion in my life > already.) > > I started to look at your tutorials Joel. It looks like there's good stuff > there. I will definitely read them as you suggested. I've been reading > Scott's IFS and Sockets tutorials and have learned a lot with them. In the > past year I've made the jump to RPG IV, and /Free, so I might as well keep > on going with modules and service programs. I'm learning the stuff now > partially because I'm working on projects that involve sockets and the IFS > although those could have been accomplished without service programs. I've > learned RPG IV, /Free, and now service programs because they have been used > in IBM manuals, posted examples, and tutorials. If they hadn't been there > where I could start examining them I probably wouldn't have bothered. But > that's a topic outside of this list... > > Thanks! > > Dave Parnin > Nishikawa Standard Company > Topeka, IN 46571 > daparnin@xxxxxxxxxxxxxxxxxx > > > > > > Buck Calabro > <buck.calabro@comm To: rpg400-l@xxxxxxxxxxxx@SMTP@CTB > soft.net> cc: (bcc: David A Parnin/Topeka/NISCO/SPCO) > Sent by: Subject: Re: Service Programs 101 > rpg400-l-bounces@m > idrange.com > > > 07/22/2004 02:35 > PM > Please respond to > RPG programming on > the AS400 / > iSeries > <rpg400-l@midrange > .com> > > > > > > Dave wrote: > > > This should be a quick one for most of you. > > On the contrary. Often, the easiest questions to ask are the hardest > to answer. > > > What exactly is a service program, > > A service program is a collection of procedures intended to be used by > (mainline) programs. > > > I am familiar with creating RPG modules > > and then binding them into a executable program. > > That may be the same thing depending on how you then call the code in > the bound modules. If you use eval [as in eval > myResult=someFunction(aParameter)] or callp [as in callp > someFunction(aParameter: aNotherParameter)], then changing the bound > module to a service program is a pretty easy step to take. > > > The service program was successfully created in QGPL. > > I'm using a /COPY member of Scott's to define the procedure. > > I get the following error when I try to do a CRTBNDRPG > > on my program. Do I need to create my program as a module > > and then bind it to the service program? > > > > MY ERROR MESSAGE: > > Message . . . . : Definition not found for symbol 'READLINE'. > > You're close... Let me start at the error and work backwards. > "Definition not found' means that the binder (the BND part of > crtBNDrpg) cannot find any PI reference in your (single) module. The > compiler part (CRTbndRPG) didn't have a problem because the /COPY > defined what the prototype looks like. The reference to READLINE in > the mainline was understood by the compiler because it had seen a > prototype for READLINE. > > Why did the binder not find the PI? Because no where on CRTBNDRPG is > there a way to specify the location of the PI - the actual procedure > definition. That's in the service program. You should double check > that by doing a DSPSRVPGM and making sure the READLINE procedure is > exported. You can tell the binder how to find the service program > (and therefore the PI) in several ways. > > One way is to do a two-step compile & bind, similar to what you do > when you bind two modules together. CRTRPGMOD on your mainline, and > then CRTPGM and instead of specifying the service program in the > MODULE parameter, you specify it in the BNDSRVPGM parameter. This > will work for the moment, but I think that many people find it > inconvenient to do two steps to make a program. > > Another way is to use an object called a binding directory. If you go > back and look at the CRTBNDRPG command, you'll see that there's a > parameter called BNDDIR. You specify the name of the binding > directory you're about to create on that parameter and you can compile > in one step - the familiar PDM option 14. > > What's a binding directory? Oops... guess I should detour a moment to > describe it. A binding directory is a search path for procedures. > Like a library list or classpath or DOS PATH. When the binder can't > find a PI (like READLINE) it looks at the first entry in the binding > directory. Say the first entry is a service program: the binder looks > at all the exports for that service program and sees if any are > READLINE. If so, it binds to that service program and goes on to the > next 'definition not found.' > > Create a binding directory - as a beginner, may I suggest that you > create one single *BNDDIR for your whole company? Let's call it > NISHIKAWA. Put it in a library where every developer can use it, say > QGPL or QUSRSYS. All you need to do now is to add a binding directory > entry, something like ADDBNDDIRE BNDDIR(NISHIKAWA) OBJ((SCOTTSRVPG > *SRVPGM)) Your needs may differ, but you probably want the service > program to be *LIBL and not qualified... Now you have a way for the > binder to search for READLINE. > > So you can now compile with option 14 and BNDDIR(NISHIKAWA), but > that's a pain, isn't it? You can make it even easier, because the > compiler recognises the H specification keyword BNDDIR! So you can > put H bnddir('NISHIKAWA') at the top of your program, compile with PDM > 14 and never bother with prompting the command. > > Give it a whirl, see how it feels and let us know if any of this > advice was worth reading. We can try to make a FAQ entry out of it to > help others who are just starting out with this stuff. In this > regard, your feedback is crucial, because you're just stepping on that > first stair. Some of us are already standing on that stair and have > forgotten what was so new and different about service programs. > --buck > > > > -- > 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. > > > -- > 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. > > > > -- > 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-2024 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.