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

Passing packed numeric field when calling RPGLE from CLLE?

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

您可以毫无问题地将压缩数字从 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,然后它作为给定大小的字符变量传递。

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

这会导致各种愚蠢的变通

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

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

CL:

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

角色扮演游戏:

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