RPGLE程序返回值问题

当调用一个具有入口参数RPGLE程序的时候,在主调程序中CALL之后,我们给其传递的参数变量就有了值。

这些参数具有的值,是在被调程序传递回来的,也叫程序返回值;

如同DB2中存储过程里面的OUT参数(CREATE PROCEDURE PRO_CL(IN PARM1 CHAR(5),OUT PARM2 VARCHAR(100))...)

返回给过程调用程序的作用相同。

下面是一个例子,MAINCALL程序调用BECALL程序,将其返回值写入一个叫做CALLTST的物理文件里面:

MAINCALL :

     FCALLTST   UF A E             DISK
     DRSLT             DS
     DFLD1                           10A
     DFLD2                             D
     DFLD3                             T
     DFLD4                             Z
     C*程序控制
     C                   EXSR      @MAIN
     C                   EXSR      @EXIT
     C*主控程序
     C     @MAIN         BEGSR
     C                   CLEAR                   RSLT
     C*调用BECALL
     C                   CALL      'BECALL'
     C                   PARM                    RSLT
     C*给物理文件字段赋值
     C                   EVAL      SEQCOL = FLD1
     C                   EVAL      DTCOL  = FLD2
     C                   EVAL      TMCOL  = FLD3
     C                   EVAL      TMSTMP = FLD4
     C*向物理文件写数据
     C                   WRITE     RCALL
     C                   ENDSR
     C*程序退出
     C     @EXIT         BEGSR
     C                   EVAL      *INLR = '1'
     C                   RETURN
     C                   ENDSR
BECALL :

     DDSPARM           DS
     DSTR                            10A
     DDTE                              D
     DTIM                              T
     DTSTMP                            Z
     DSEQCLB           S              5A
     DTMP              S              5S 0
     DSTR1             S              5A   INZ('21012')
     DSTR2             S             26A
     C*程序控制
     C                   EXSR      @MAIN
     C                   EXSR      @EXIT
     C*@MAIN
     C     @MAIN         BEGSR
     C                   CLEAR                   DSPARM
     C*入口参数
     C     *ENTRY        PLIST
     C                   PARM                    DSPARM
     C*取出数据域里面的值,并让其+1,然后写回数据域
     C     *DTAARA       DEFINE                  SEQCLB
     C     *LOCK         IN        SEQCLB
     C                   EVAL      TMP    = %INT(SEQCLB)
     C                   EVAL      SEQCLB = %CHAR(TMP+1)
     C                   OUT       SEQCLB
     C*给参数赋值
     C                   MOVE      TMP           SEQCLB
     C     STR1          CAT       SEQCLB        STR
     C
     C                   EVAL      DTE    = %DATE('2000-01-01')
     C                   EVAL      TIM    = %TIME('10.10.10')
     C*%TIME()函数, 
     C                   EVAL      STR2   = '1999-09-29-12.34.56.000000'
     C                   EVAL      TSTMP  = %TIMESTAMP(STR2)
     C
     C                   ENDSR
     C*程序结束
     C     @EXIT         BEGSR
     C                   EVAL      *INLR='1'
     C                   RETURN
     C                   ENDSR
在进行编译,失败,调试,再编译之后,程序结果如下:

 Line   ....+....1....+....2....+....3....+....4....+....5....+....6  
         序列        日期        时间      时间戳                     
 000001 2101200015  0001-01-01  00.00.00  0001-01-01-00.00.00.000000  
 000002 2101200016  0001-01-01  00.00.00  1999-09-29-12.34.56.000000  
 000003 2101200018  0001-01-01  10.10.10  1999-09-29-12.34.56.000000  
 000004 2101200019  2000-01-01  10.10.10  1999-09-29-12.34.56.000000  
 000005 2101200020  2000-01-01  10.10.10  1999-09-29-12.34.56.000000  
 000006 2101200021  2000-01-01  10.10.10  1999-09-29-12.34.56.000000  
 ****** ********  End of report  ******** 
第一行数据,添加序列值成功;

             这里报日期,时间,或者时间戳格式不对,所以只添加序列值。

第二行数据,添加序列和时间戳成功;

             确定时间戳格式无误。为了保证BECALL修改编译后没问题,这里CALL了一次,所以序列里面少了2101200017这个数字。

第三行数据,添加添加序列,时间,和时间戳成功;

             查了ILE RPG Reference,发现默认的时间*ISO格式的分隔符为点(.),而程序给的分隔符却是冒号(:)。

             在默认情况下,时间,日期,时间戳的格式都为*ISO格式,这也是程序内部格式。

             若程序中有不同的时间,日期格式的话,推荐使用默认格式*ISO。

第四行数据,调试完全通过,添加所有字段的数据;

第五、六行,call了两次。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值