Ibm midrange 从CLLE调用RPGLE时是否传递压缩数字字段?

Ibm midrange 从CLLE调用RPGLE时是否传递压缩数字字段?,ibm-midrange,rpgle,control-language,Ibm Midrange,Rpgle,Control Language,从CLLE调用RPGLE时是否应该传递压缩的数字字段?或者在RPG中将它们转换为字符传递并转换回数字。如果建议使用前一种方法,如何实现这一点?您可以将压缩数字从CLLE传递到RPLE,而不会出现问题 问题是,当从命令行调用任何程序或通过SBMJOB cmdCALL MYPGM提交要批量运行的程序时,IBM i命令处理器将以packed15,5的形式传递数字文本 请致电mypgm parm10 15 需要将这两个参数定义为packed15,5。不管MYPGM是用CL、CLLE、RPG、RPLE还是

从CLLE调用RPGLE时是否应该传递压缩的数字字段?或者在RPG中将它们转换为字符传递并转换回数字。如果建议使用前一种方法,如何实现这一点?

您可以将压缩数字从CLLE传递到RPLE,而不会出现问题

问题是,当从命令行调用任何程序或通过SBMJOB cmdCALL MYPGM提交要批量运行的程序时,IBM i命令处理器将以packed15,5的形式传递数字文本

请致电mypgm parm10 15

需要将这两个参数定义为packed15,5。不管MYPGM是用CL、CLLE、RPG、RPLE还是COBOL编写的

一个相关的问题是,除非文字值大于32,否则字符文字将作为char32传递,然后作为给定大小的字符变量传递

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

这导致了各种愚蠢的一轮一轮的工作

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

将4位数字作为char4传递 通过十六进制文字将2字节整数作为char2传递 将40个字符的字符串作为char41传递 然而,最好的解决方案是简单地为任何您想从命令行或通过SBMJOB CMD调用的程序创建一个命令前端。定义了命令后,命令处理器将确切知道程序参数的类型和大小

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

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

CL:

角色扮演:


创建一个命令*CMD对象通常是最好的。一个*CMD实际上就像创建一个用于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;