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

时间:2017-03-08 11:20:28

标签: ibm-midrange rpgle control-language

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

2 个答案:

答案 0 :(得分:5)

您可以毫无问题地将CLLE中的打包数字传递给RPGLE。

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

call mypgm parm(10 15)

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

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

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

这导致各种愚蠢的工作轮次

call mypgm parm('0010' x'000F' 'AB                                      x')

以上

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

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

mycmd parm1(10) parm2(15) parm3('AB')

Midrange.com wiki

中的更多信息

答案 1 :(得分:3)

如果您的CL程序中有一个十进制变量,您可以直接将它传递给在RPG程序中以相同方式定义的压缩变量。

CL:

dcl &x type(*dec) len(5 2) value(-123.45)
call rpgpgm parm(&x)

RPG:

   dcl-pi *n;
      parm packed(5:2);
   end-pi;
   dsply (%char(parm));
   return;
相关问题