|
Paul, if your procedures are in a service program you can dynamically call with QZRUCLSP Api that also allows you to use variable parameters and get return values. Example: QZRUCLSP(SrvPgm+SrvPgmLib:%trimr(Procedure)+x'00': RETTYPE_NONE:PARMTYPE_PTR:1:ApiError: RtnVal:Parameter1); ----- Original Message ----- From: "Hauser, Birgitta" <Birgitta.Hauser@xxxxxxxxxxx> To: <rpg400-l@xxxxxxxxxxxx> Sent: Tuesday, May 24, 2005 1:25 PM Subject: RE: Variable Modules > Hi Paul, > > to call modules oder better procedures dynamically, you have to use > prototyping and procedure pointers. > In contrary to programs that are called dynamically, that means they aren't > activated before the CALL statement is executed, the procedures must exist > at compile time. The module object that contains the procedures or the > signature of the service program where the module is bound to are physically > embedded into the program object. > > Here an example: > I have three procedures that convert a date into a character representation. > > The first procedure converts to *EUR format, the second to *USA-Format and > the third to *JIS-Format. > You will see the prototypes for these functions > D CvtDateToEur PR 10A extproc('CVTDATEUR') > > D ParmDate D const options(*NoPass) > > D CvtDateToUSA PR 10A extproc('CVTDATUSA') > > D ParmDate D const options(*NoPass) > > D CvtDateToJIS PR 10A extproc('CVTDATJIS) > > D ParmDate D const options(*NoPass) > > Here are the functions: > ************************************************************ > * Converte Date into European Format > ************************************************************ > P CvtDateToEur B Export > D CvtDateToEur PI 10A > D ParmDate D const options(*NoPass) > *----------------------------------------------------------- > /Free > If %Parms >= 1; > Return %Char(ParmDate: *Eur); > else; > Return %Char(%Date(): *Eur); > EndIf; > /End-Free > P CvtDateToEur E > ************************************************************ > * Convert Date into USA Format > ************************************************************ > P CvtDateToUSA B Export > D CvtDateToUSA PI 10A > D ParmDate D const options(*NoPass) > *---------------------------------------------------------------- > /Free > If %Parms >= 1; > Return %Char(ParmDate: *USA); > else; > Return %Char(%Date(): *USA); > EndIf; > /End-Free > P CvtDateToUSA E > ***************************************************************** > * Convert Date into Japanese Format > ***************************************************************** > P CvtDateToJIS B Export > D CvtDateToJIS PI 10A > D ParmDate D const options(*NoPass) > *---------------------------------------------------------------- > /Free > If %Parms >= 1; > Return %Char(ParmDate: *JIS); > else; > Return %Char(%Date(): *JIS); > EndIf; > /End-Free > P CvtDateToJIS E > > Depending on the language or country you want to call one of these > functions. > To do this you need an additional prototype. Add the Keyword EXTPROC and > specify a procedure pointer variable instead of a procedure name. > A procedure pointer has the data type * and the key word PROCPTR. > The following example shows you the additional prototype and the definition > of the procedure pointer variable: > > D CvtDate PR 10A ExtProc(MyProcPtr) > D ParmDate D const options(*NoPass) > > D MyProcPtr S * ProcPtr > > This prototype and procedure pointer must be embedded in the source where > you want to calle the functions "dynamically". > The next example shows you how to call these functions. > D ConstProcUSA C const(%PAddr('CVTDATUSA')) > > D ConstProcJIS S * ProcPtr inz(%PAddr('CVTDATJIS')) > > /Free > Select; > When Country = 'DE '; > MyProcPtr = %PAddr('CVTDATEUR'); > When Country = 'USA'; > MyProcPtr = ConstProcUSA; > When Country = 'JPN'; > MyProcPtr = ConstProcJIS; > EndSL; > > MyCharDate = CvtDate(MyDate); > /End-Free > > I hope this helps! > > Birgitta > > Mit freundlichen Grüßen > > i.A. Birgitta Hauser > > LUNZER + PARTNER GMBH > Unternehmensberatung > Carl-Zeiss-Straße 1 > 63755 Alzenau > > Tel: + 49 6023 951-255 > Fax: + 49 6023 951-111 > Internet. www.lp-gmbh.com > www.rpg-schulung.de > > > -- > 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.