RPGIV编程问题百解(35)服务程序(SRVPGM)创建
CRVPGM: module方式创建,假设要创建STEST服务程序
一个服务程序(SRVPGM)创建命令:
===> CRTSRVPGM SRVPGM(STEST) MODULE(MYLIB/STEST MYLIB/STEST1 MYLIB/STEST2) SRCF
ILE(MYLIB/QBNDSRC)
STEST服务程序下包括STEST1、STEST2服务应用程序(service):
1) STEST.rpgle服务程序代码:
/free
Retrun;
/end-free
2) STEST1.rpgle代码:
H nomain
h option(*showcpy)
*
/include mylib/qcpysrc,STESTPR
*
P stest1 B export
d stest1 PI 10a
d ymd 8p 0 const
*
d retval s 10a
d stest1 s 10a
*
/free
monitor;
retval = %char( %date(ymd:*iso) : *USA );
on-error;
retval = 'ERROR';
endmon;
*inlr = *on;
return retval ;
/end-free
p stest1 e
3) STEST2.rpgle代码:
H nomain
h option(*showcpy)
*
/include pingy/qcpysrc,STESTPR
*
P stest2 B export
d stest2 PI 100a
d 100a const
*
d stest2 s 100a
d retval s 100a
*
/free
returnval = %trim() + ' '+ 'Hello, Body!';
*inlr = *on;
return retval;
/end-free
p stest2 e
4) COPY book:/include mylib/qcpysrc,STESTPR
d Stest1 PR 10A extproc('STEST1')
d 8p 0 const
*
d Stest2 PR 100A extproc('STEST2')
d 100a const
5) SRCFILE(MYLIB/QBNDSRC)下应包括STEST.BND文件,其内容:
STRPGMEXP SIGNATURE('STEST')
EXPORT SYMBOL('STEST1')
EXPORT SYMBOL('STEST2')
ENDPGMEXP
以上三段程序代码需在用CRTSRVPGM之前,创建成*module代码形式。
创建后的STEST,*SRVPGM服务程序,用一个binddir,STEST挂起。
1) 创建一个binddir:
CRTBNDDIR
2) 用wrkbnddir把STEST挂在STEST,binddir下。
做完上述步骤,就可以在其它rpgle程序中引用,如mypgm.rpgle,代码:
H BNDDIR(‘STEST’)
*
d Stest2 PR 100A extproc('STEST2')
d 100a const
*这里也可以统一用/copy 文件定义。建议用/copy 文件。
D String s 100a
d s 100a
/free
…..
String2 = STEST2();
…..
补充说明1):如果一个service定义PI:如STEST2.rpgle
P stest2 B export
d stest2 PI 100a
….
d stest2 s 100a
d retval s 100a
……
return retval;
这个procedure,的输出是可以export,在PI输出的100A,在d表中定义
D stest2 s 100a
用return retval;来体现。
如果没有定义export和PI后的输出属性,且仅return;,返回值只能用PI/PR中的原型接口(prototype)中。PI/PR中的定义必须一致。这时在mypgm.rpgle中使用STEST2,service,只能
Callp STEST2();
补充说明2):
如果STEST11.rpgle和STEST2.reple对F表定义,且操作,必须去掉H表中的nomain。没有人为定义main,或nomain,默认值是main。
也可以在STEST.rpgle服务程序中定义F表,对其操作。STEST11.rpgle和STEST2.reple的H表中定义nomain,相当于这STEST1和STEST2两个services都是subprocedures,也就是相当于我们熟悉的subroutinee,即begsr/endsr中的代码。
补充说明3):
如果把STEST1.rpgle和STEST2.rpgle生成modules后再用crtpgm生成PGM在SRVPGM中引用,这时在CRTSRVPG中BNDSRVPGM选项定义STEST1.pgm和STEST2.pgm。
补充说明4):
如果STEST1.rpgle和STEST2.rpgle不是用PI定义原型接口(prototype),而是用传统的Plist定义的接口,这时引用程序mypgm.rpgle的PR部分需把extproc键字改为extpgm定义引用的程序名。PR部分按照plist的parm个数和属性来定义。
补充说明5):
如果STEST1(subprocedure)和STEST2(subprocedure)都是在STEST.rpgle代码中,然后生成module或pgm,STEST.rpgle在MYLIB/QSRVSRC目录下在CRTSRVPGM中则需:
Service program . . . . . . . . > STEST
Library . . . . . . . . . . . *CURLIB
Module . . . . . . . . . . . . . > STEST
Library . . . . . . . . . . . > MYLIB
+ for more values
*LIBL
Export . . . . . . . . . . . . . > *ALL
Export source file . . . . . . . QSRVSRC
Library . . . . . . . . . . . *LIBL
Export source member . . . . . . *SRVPGM
Text 'description' . . . . . . . *BLANK
或,
Bind service program . . . . . . STEST
Library . . . . . . . . . . . MYLIB
生成后的STEST,*SRVPG与使用bnd文件生成的STEST,*SRVPG差别:
1) 后者可以用updsrvpgm对STEST服务程序中的STEST1,*module,或STEST2,*module单独进行更新操作。前者,则不能;
2) 前者无需bnd文件,后者必须有bnd文件。
3) 前者,STEST,*SRVPG中的STEST1和STEST2,subprocedures,循序是STEST.rpgle中的代码自然循序。后者,是STEST.BND中的export项的定义循序。
补充说明6):service可以是一个SRVPGM,*pgm;或一个SRVPGM下的一个subprocedure,*module。
阅读(2459) | 评论(0) | 转发(0) |