AS400上的RPG
他们是一种定义可由主函数内部函数访问的全局变量的方法吗?
例如我有我的主要RPG程序(让我们称之为“MAIN_PROGRAM”,在其中我称之为另一个RPG程序(让我们称之为SUB_PROGRAM)。现在我想在我的MAIN_PROGRAM中定义一个字符串变量“ABC”然后当调用我的SUB_PROGRAM使用我的SUB_PROGRAM中的变量。
我不想将它作为输入参数发送到SUB_PROGRAM的原因是我的MAIN_PROGRAM是用生成器(CA-PLEX)编译的......这给了我一个字符串大小为60 000的限制。我确实找到了解决这个问题的方法,但是无法将其传递给SUB_PROGRAM,因为PLEX会将其切换为60 000个字符。
我想要做的是创建一个可由SUB_PROGRAM引用的全局变量变量。
我是RPG编程的新手。我能够编辑程序的源代码,但我不知道是否可以创建全局变量或类似的东西。
答案 0 :(得分:7)
您可以从服务程序导出变量,并将两个程序绑定到服务程序。您可以将变量导入程序。只要程序在同一个激活组中,并且服务程序是* CALLER,或者它位于同一个命名的激活组中,那么两个程序中的导入变量将访问服务程序中的相同导出变量。
您必须非常小心地定义所有IMPORT和EXPORT变量。这样做的方法是在/ copy文件中定义变量,如下所示:
dcl-s shared_variable varchar(1000000)
/if defined(do_export)
export
/else
import
/endif
;
srvpgm模块来源:
ctl-opt nomain;
/define do_export
/copy copyfile
节目来源:
/copy copyfile
shared_variable = 'abcde';
if shared_variabe = '12345';
...
另一种方法是在没有EXPORT关键字的情况下在服务程序中定义变量,并使用过程来获取和设置值。这似乎比使用IMPORT / EXPORT更复杂,但从长远来看它可能更容易,因为使用IMPORT / EXPORT来调试共享变量导致的问题很难调试。例如,如果您不希望在将变量显式设置为值之前使用该变量,则“get”过程可以处理该变量。
复制文件:
dcl-s shared_variable_t varchar(1000000);
dcl-pr set_shared_variable;
val like(shared_variable_t) const;
end-pr;
dcl-pr get_shared_variable like(shared_variable_t) end-pr;
Srvpgm模块来源:
ctl-opt nomain;
/copy copyfile
dcl-s g_shared_variable like(shared_variable_t);
dcl-proc set_shared_variable export;
dcl-pi *n;
val like(shared_variable_t) const;
end-pi;
g_shared_variable = val;
end-proc;
节目来源:
/copy copyfile
set_shared_variable ('abcde');
if get_shared_variable () = '12345';
...
答案 1 :(得分:4)
两个节目之间?否。
在绑定到同一* PGM(或* SRVPGM)对象的两个模块之间,您可以在变量d-spec上使用EXPORT
和IMPORT
关键字。
如果您必须将它们保留为程序,则将数据作为外部数据区域传递可能是您的最佳选择。
您使用的是什么版本的Plex?我从6.1开始就没用过它......如果目前的版本没跟上RPGLE的步伐,我会感到有些惊讶。
如果您还没有,CA Plex / 2E community是一个很好的帮助资源。