Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1294174
  • 博文数量: 287
  • 博客积分: 11000
  • 博客等级: 上将
  • 技术积分: 3833
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-16 08:43
文章分类
文章存档

2013年(15)

2012年(17)

2011年(17)

2010年(135)

2009年(85)

2008年(18)

分类: 系统运维

2010-04-15 15:53:30


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。
阅读(2450) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~