|
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
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.