从CLLE调用RPGLE时传递压缩数字字段?

mik*_*ike 0 rpgle control-language ibm-midrange

从CLLE调用RPGLE时,我应该传递打包的数字字段吗?或者将它们转换为字符传递它们并将它们转换回RPG中的数字.如果推荐前者,这是怎么做到的?

Cha*_*les 6

您可以将CLLE中打包的数字传递给RPGLE而不会出现问题.

问题是,当从命令行调用任何程序或提交程序以批量运行时SBMJOB cmd(CALL MYPGM),IBM i命令处理器将传递数字文字为packed(15,5).

call mypgm parm(10 15)

将要求将两个参数定义为打包(15,5).MYPGM是用CL,CLLE,RPG,RPLE还是COBOL编写的并不重要.

一个相关的问题是字符文字作为char(32)传递,除非文字值超过32,然后它作为给定大小的字符变量传递.

原因是参数通过引用/从程序传递.这意味着调用者为数据留出了存储空间,并且该存储空间的地址实际上是通过的; 不是实际价值.因此命令处理器创建所需的存储并将其初始化为给定值.由于命令处理器无法知道程序中定义的参数的大小,因此它使用定义的默认值,并且由被调用程序的编写者来遵守规则.

这会导致各种愚蠢的工作

call mypgm parm('0010' x'000F' 'AB                                      x')
Run Code Online (Sandbox Code Playgroud)

以上

  • 传递一个4位数字作为char(4)
  • 通过十六进制文字传递一个2字节的整数作为char(2)
  • 传递一个40个字符的字符串作为char(41)

但是,最好的解决方案是简单地为要从命令行或通过调用的任何程序创建命令前端SBMJOB CMD().通过定义命令,命令处理器将准确知道程序参数的类型和大小.

mycmd parm1(10) parm2(15) parm3('AB')
Run Code Online (Sandbox Code Playgroud)

有关Midrange.com wiki的更多信息