首页 > 学技术 > 技术网文 > IBM AS400应用论坛 > 正文

[精华] RPG带参数CALL的问题


来源 chinaunix.net 酷勤网整理

有一个RPG程序A,需要传入参数运行的.其中有一个参数是数值型A1.另一个是字符型B1.
为什么在使用如下命令CALL A PARM(A1 'B') 时会发生 decimal-data error in field错误?



 USING_AS400 回复于:2006-12-28 20:57:56

三种方法:
1.写个CL程序,大致如下
PGM
DCL   VAR(V1)   TYPE(*DEC) LENGTH(5 0) 
CHGVAR VAR(V1) VALUE(12345)
CALL PGM(YOURRPG) PARM(V1 'B')
ENDPGM

2.把RPG参数定义成字符型的,然后在RPG里头在转换成数值型,那么在命令行CALL就没问题了
*ENTRY       PLIST
                   PARM              V1            5
                   PARM              V2            1
                   MOVE     V1     VV            5 0

3.在命令行直接输入,也可以,不过稍微有些复杂
输入格式与你定义的数值型变量长度有关,假如是偶数长度,比如说吧:
(1)有一个数值型6位长,你想输入的参数是20061229和B,那么传参应该是CALL PGM(YOURRPG) PARM(X'020061229F' 'B') ,F表示正的,前面需要补0;
(2)有一个数值型5位长,你想输入的参数是2006122和B,那么传参应该是CALL PGM(YOURRPG) PARM(X'20061229F' 'B') ,F表示正的,前面不需要补0
【注:一般格式是,偶数位长X'0nnnn……nnF',前面补0,;奇数位长X'nnn……nnF',前面不需要补0。后面一位表示符号,F表示整数,D表示负数】

[ 本帖最后由 USING_AS400 于 2006-12-28 20:59 编辑 ]


 V01619 回复于:2006-12-29 08:57:28

不错,很管用.


 USING_AS400 回复于:2006-12-29 21:45:39

再补充一下,传入的数值型还分P型和S型,如果是P型的,那么传入规则就如上第3点所述,
如果是S型,那么直接按字符型传入即可
如:
D V1                 S               8S 0
*ENTRY       PLIST
                   PARM              V1            
                   PARM              V2            1
CALL PGM(YOURRPG) PARM('00001229' 'B') 
CALL PGM(YOURRPG) PARM('-0001229' 'B') 
长度不够的左补0,如果传入负数,第一位放负号,所以负数的长度会少一位


 qingzhou 回复于:2006-12-30 22:23:28

以下帖子也包含这方面的内容,可以作为补充。
http://bbs.chinaunix.net/viewthread.php?tid=294411&highlight=aeiou

命令行CALL程序时传递数字参数总结—aeiou


设程序 PgmA 有参数 Parm1, Parm2:

1)parm1(7S 0) = 276,parm2(7S 2) = 15.73

传递方式:CALL  PGMA PARM('0000276'  '0001573')

2)parm1(7S 0) = -276,parm2(6S 2) = -15.73

传递方式:CALL  PGMA PARM('-000276'  '-01573')

3)parm1(7P 0) = 276,  parm2(7P 2) = 15.73

传递方式:CALL  PGMA PARM( X'0000276F'  X'0001573F')

4)parm1(6P 0) =  276 , parm2(6P 2)=15.73

传递方式:CALL  PGMA PARM( X'F000276F'  X'F001573F')

5)parm1(7P 0) =  -276 , parm2(6P 2)=-15.73

传递方式:CALL  PGMA PARM( X'0000276B'  X'F001573B')

总结:

对于S类型的参数,只要按照字符串的形式,在没有数字的位置补0,不用输入小数点,就可以得到正确的结果,如果是负数,在第一位输入负号 - 即可,但是会占用一个数字位,7位的负数就只能输入6位数字了。

对于P类型的参数,数字部分按照S类型的一样输入,还需要在字符串前加 X,并且如果长度为奇数,需要给字符串加 F 后缀,如果长度为偶数,需要在字符串的前后都加 F。如果是负数的,需要把字符串后面的F变为B。(X表示按16进制取值,由于P类型的数据存储方式是半个字节存储一个数字,所以需要在前后加其它的字母补齐空位。)





原文链接:http://bbs.chinaunix.net/viewthread.php?tid=877854
转载请注明作者名及原文出处



收藏本页到: