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

文章评论

添加新评论

温馨提醒:如果您是第一次在本站留言,需要审核后才能显示哦!

相关文章

Whatsapp只能查看最近三天的聊天记录了怎么办?

Whatsapp只能查看最近三天的聊天记录了怎么办?

今天突然发现电脑上的WhatsApp只能查看最近3天的聊天记录了,显示要查看3天前的记录请到手机上查看。很是吃惊,以前一直是所有记录都自动同步到电脑版的啊,不论换电脑了还是换手机了,聊天记录从来没丢过。 查询一翻也没有找出来原因,怎么也同步不过去。 电脑版app重新安装了,也不行。 有个方法说...
阅读全文>>
ValueError: Error getting directory

ValueError: Error getting directory

ssl证书过期了 明明自动renew的 然后看log已经好久没更新成功了 查半天是当前server不信任远程连接 只能自己改代码 报错: 21-12-17 13:01:11 Generate CSR...amkevin.csr amkevin.csr generated. /home/www...
阅读全文>>
网页路径中的'.'和'..'还有'./'和'../'区别

网页路径中的'.'和'..'还有'./'和'../'区别

. 表示当前目录 .. 表示当前目录的上一级目录。 ./表示当前目录下的某个文件或文件夹,视后面跟着的名字而定 ../表示当前目录上一级目录的文件或文件夹,视后面跟着的名字而定。 例如: 文件夹 a 下面有 文件夹b c 和文件 d。 文件夹b下面有e.php 和文件f。 则e中的 . 表示...
阅读全文>>
Introduction to ILE RPG Activation Groups

Introduction to ILE RPG Activation Groups

Learn how activation groups can help your ILE RPG programs run more efficiently, how to specify the type of group to use, and closing and reclaimin...
阅读全文>>
popup.js怎么和content.js通信?[JQuery]

popup.js怎么和content.js通信?[JQuery]

这两天为了实现一个谷歌浏览器插件功能,研究了半天怎么让插件来改特定网页里的特定字段的值,而这个值又来自popup的网页预先设定,下一步实现动态加载,可以让更多组实现便利。 目的很简单,我们有一个list,需要填到网页的某个字段,当然是好几个,这些值是设定好的,网页系统我们没法改,input想...
阅读全文>>