Ibm midrange 从CLLE调用RPGLE时是否传递压缩数字字段?
从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传递,然后作为给定大小的字符变量传递 这是因为参数是通过引用传递给程序或从程序传递过来的。这意味着调用者为数据预留了存储空间,而该存储空间的地址就是实际传递的数据;不是实际值。因此,命令处理器创建所需的存储,并将其初始化为给定值。由于命令处理器无法知道程序中定义的参数的大小,因此它使用已定义的默认值,由被调用程序的编写者来遵守规则 这导致了各种愚蠢的一轮一轮的工作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还是
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;