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

Ren*_*ier 3 rpg rpgle ibm-midrange

AS400上的RPG

他们是一种定义可以被我的main函数中的函数访问的全局变量的方法吗?

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

Bar*_*ris 7

您可以从服务程序导出变量,并将两个程序绑定到服务程序.您可以将变量导入程序.只要程序在同一个激活组中,并且服务程序是*CALLER,或者它位于同一个命名的激活组中,那么两个程序中的导入变量将访问服务程序中的相同导出变量.

您必须非常小心地定义所有IMPORT和EXPORT变量.这样做的方法是在/ copy文件中定义变量,如下所示:

dcl-s shared_variable varchar(1000000)
     /if defined(do_export)
         export
     /else
         import
     /endif
   ;
Run Code Online (Sandbox Code Playgroud)

srvpgm模块源码:

ctl-opt nomain;
/define do_export
/copy copyfile
Run Code Online (Sandbox Code Playgroud)

该计划的来源:

/copy copyfile
shared_variable = 'abcde';
if shared_variabe = '12345';
   ...
Run Code Online (Sandbox Code Playgroud)

另一种方法是在没有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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

该计划的来源:

/copy copyfile
set_shared_variable ('abcde');
if get_shared_variable () = '12345';
     ...
Run Code Online (Sandbox Code Playgroud)