有参数[P型]CALL RPG或COBOL程序注意事项
时间:2016-06-17 ┊ 阅读:6,102 次 ┊ 标签: 开发 , 编程 , 经验
当我们call一个rpg或cobol程序时,如果程序参数中含有P型数字(rpg是P类型,cobol是comp-3),我们直接传数字参数进去,会报数据类型错误。
比如RPGA, 有一个参数是数值型A1.另一个参数是字符型B1.
命令行直接CALL A PARM(A1 'B') 时会发生 decimal-data error in field错误。
解决这种问题有3种方法:
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表示负数】
再补充一下,传入的数值型还分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,如果传入负数,第一位放负号,所以负数的长度会少一位
补充2:
设程序 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类型的数据存储方式是半个字节存储一个数字,所以需要在前后加其它的字母补齐空位。)