0

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

4

2 回答 2

5

您可以毫无问题地将压缩数字从 CLLE 传递到 RPGLE。

问题是,当从命令行调用任何程序或提交程序以通过 批处理运行时SBMJOB cmd(CALL MYPGM),IBM i 命令处理器会将数字文字作为打包(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中的更多信息

于 2017-03-08T15:40:19.367 回答
3

如果您的 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;
于 2017-03-09T03:49:10.540 回答