如何在rpg程序中定义一个可以在调用函数中访问的全局变量

时间:2016-08-18 14:05:21

标签: ibm-midrange rpgle rpg

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编程的新手。我能够编辑程序的源代码,但我不知道是否可以创建全局变量或类似的东西。

2 个答案:

答案 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上使用EXPORTIMPORT关键字。

如果您必须将它们保留为程序,则将数据作为外部数据区域传递可能是您的最佳选择。

您使用的是什么版本的Plex?我从6.1开始就没用过它......如果目前的版本没跟上RPGLE的步伐,我会感到有些惊讶。

如果您还没有,CA Plex / 2E community是一个很好的帮助资源。