有一个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类型的数据存储方式是半个字节存储一个数字,所以需要在前后加其它的字母补齐空位。)
|