从CLLE调用RPGLE时,我应该传递打包的数字字段吗?或者将它们转换为字符传递它们并将它们转换回RPG中的数字。如果推荐前者,这是怎么做到的?
答案 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')
以上
然而,最好的解决方案是,只需为要从命令行或SBMJOB CMD()
调用的任何程序创建命令前端。通过定义命令,命令处理器将准确知道程序参数的类型和大小。
mycmd parm1(10) parm2(15) parm3('AB')
中的更多信息
答案 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;