下班前,写了个简单的程序,作为例子说明参数中OPTIONS(*NOPASS)的用法,现与大家分享,共勉!

程序的作用是封装了系统API,EERAN0,用以返回4位的随机数,至于哪两四位整数之间的随机数,通过传递参数的个数和参数的值来决定,不传参返回1000-9999之间的随机四位整数。

一、程序列表如下:
【AS400系列】通过程序例子说明参数中OPTIONS(*NOPASS)的用法-LMLPHP
二、程序源码如下:
USUSRVCDRT:
 * ------------------------------------------------------------------------         
 * MEMBER   : USUSRVCDRT                                                            
 * AUTHOR   : XIAOZL                                                                
 * DESCRIBE : US - Create Random Number                                             
 * DATE     : 2013-09-02                                                            
 * ------------------------------------------------------------------------         
 /IF DEFINED(US_USUSRVCDRT_COPYED)                                                  
 /EOF                                                                               
 /ELSE                                                                              
 /DEFINE     US_USUSRVCDRT_COPYED                                                   
 /ENDIF                                                                             
 * ------------------------------------------------------------------------         
D/IF DEFINED(USUSRVCDR)                                                             
D USUSRVCDR       PR             4S 0                                               
D  iMinNbr                       5S 0 VALUE OPTIONS(*NOPASS)                        
D  iMaxNbr                       5S 0 VALUE OPTIONS(*NOPASS)                        
D/ENDIF          
                                                                   
USUSRVCDRI:

 * ------------------------------------------------------------------------         
 * MEMBER   : USUSRVCDRP                                                            
 * AUTHOR   : XIAOZL                                                                
 * DESCRIBE : US - Create Random Number                                             
 * DATE     : 2013-09-02                                                            
 * ------------------------------------------------------------------------         
HNOMAIN DATFMT(*ISO)                                                                
 *                                                                                  
D/DEFINE USUSRVCDR                                                                  
D/COPY XXXZL2/QRPGSRC,USUSRVCDRT                                                    
 *                                                                                  
P USUSRVCDR       B                   EXPORT                                        
D USUSRVCDR       PI             4S 0                                               
D  iMinNbr                       5S 0 VALUE OPTIONS(*NOPASS)                        
D  iMaxNbr                       5S 0 VALUE OPTIONS(*NOPASS)                        
D USUSRVCDR       PR             4S 0                                               
D  iMinNbr                       5S 0 VALUE OPTIONS(*NOPASS)                        
D  iMaxNbr                       5S 0 VALUE OPTIONS(*NOPASS)                        
 *                                                                                  
D CEERAN          PR                  Extproc('CEERAN0')                            
D P_SEED                              LIKE(I_SEED)                                                     
DP_RANDOM                             LIKE(F_RANDOM)                                                   
 *                                                                                                     
DI_SEED           S             10I 0 INZ(0)                                                           
DF_RANDOM         S              8F                                                                    
 *                                                                                                     
DRNDNBR           S             10I 0                                                                  
DMINNBR           C                   CONST(1000)                                                      
DMAXNBR           C                   CONST(10000)                                                     
DoRtnNbr          S              4S 0                                                                  
 *                                                                                                     
C                   EXSR      #Init                                                                    
C                   EXSR      #Main                                                                    
C                   RETURN    oRtnNbr                                                                  
 *                                                                                                     
CSR   #Init         BEGSR                                                                              
CSR                   ENDSR                                                                              
 *                                                                                                     
CSR   #Main         BEGSR                                                                              
C                   SELECT                                                                                    
C                   WHEN      %PARMS = 0                                                                      
C                   CALLP     CEERAN(I_SEED:F_RANDOM)                                                         
C                   EVAL      RNDNBR = %DECH(F_RANDOM:30:29)                                                  
C                                      *(MAXNBR-MINNBR)+MINNBR                                                
C                   MOVE      RNDNBR        oRtnNbr                                                           
 *                                                                                                            
C                   WHEN      %PARMS = 1                                                                      
C                   CALLP     CEERAN(I_SEED:F_RANDOM)                                                         
C                   EVAL      RNDNBR = %DECH(F_RANDOM:30:29)                                                  
C                                      *(MAXNBR-iMinNbr)+iMinNbr                                              
C                   MOVE      RNDNBR        oRtnNbr                                                           
 *                                                                                                            
C                   WHEN      %PARMS = 2                                                                      
C                   CALLP     CEERAN(I_SEED:F_RANDOM)                                                         
C                   EVAL      RNDNBR = %DECH(F_RANDOM:30:29)                                                  
C                                      *(iMaxNbr-iMinNbr)+iMinNbr                                             
C                   MOVE      RNDNBR        oRtnNbr                                                           
C                   ENDSL                                                                                     
CSR                ENDSR                
P USUSRVCDR       E    

USUSRVCDRP:                                                                                   
D/DEFINE USUSRVCDR                                                                         
D/COPY XXXZL2/QRPGSRC,USUSRVCDRT                                                           
 *                                                                                         
DoDspNbr          S              4S 0                                                      
 *                                                                                         
 *    Get the Random Number Between 1000 - 10000                                           
 *                                                                                         
C                   EVAL      oDspNbr = USUSRVCDR()                                        
C     oDspNbr       DSPLY                                                                  
 *                                                                                         
 *    Get the Random Number Between 5000 - 10000                                           
 *                                                                                         
C                   EVAL      oDspNbr = USUSRVCDR(5000)                                    
C     oDspNbr       DSPLY                                                                  
 *                                                                                         
 *    Get the Random Number Between 1000 - 2000                                            
 *
C                   EVAL      oDspNbr = USUSRVCDR(1000:2000)             
C     oDspNbr       DSPLY                                                
 *                                                                       
C                   SETON                                        LR      
C                   RETURN          
四、程序编译参考:
CRTRPGMOD MODULE(MYOBJLIB/USUSRVCDRI) SRCFILE(MYSRCLIB/QRPGSRC) SRCMB(USUSRVCDRI)        
CRTRPGMOD MODULE(MYOBJLIB/USUSRVCDRP) SRCFILE(MYSRCLIB/QRPGSRC) SRCMB(USUSRVCDRP)  
CRTPGM PGM(MYOBJLIB/USUSRVCDRP) MODULE(MYOBJLIB/USUSRVCDRP MYOBJLIB/USUSRVCDRI)
五、CALL USUSRVCDRP,查看作业日志可以看到如下效果:
【AS400系列】通过程序例子说明参数中OPTIONS(*NOPASS)的用法-LMLPHP

09-26 18:48