对于同一库列表中名称相同的程序,如何主动控制调用哪个程序



我有三个库,A、B和C。它们在库中的顺序是A在B之上,B在C之上。A库中有一个程序Pa,B库中有程序Pb。Pa和Pb有相同的名称和参数列表,但它们的功能略有不同。现在库C中有一个程序Pc,它调用Pa。但为了实现所需的结果,应该调用Pb。问题是,库A不能从库列表中删除,也不能移动到库B下,Pa也不能从库A中删除。那么,有可能以某种方式隐藏Pa,让Pc调用Pb吗?程序库名称不能在程序中编码,因此必须在运行时决定。

当您说程序库名称不能在程序中编码时,您的意思是因为车间标准还是由于实现而困难?或者其他什么让它不受欢迎?

有几种方法。我不知道你在用什么语言写,所以我用伪代码来说明。

1) 子程序

 when condition = A
   do subrA
 when condition = B
   do subrB
 ...
 subrA
   call libA/pgmA parm(...)
 subrB
   call libB/pgmB parm(...)

2) 动态呼叫

 define command char 128
 when condition = A
   command = 'call liba/pgma parm('
 when condition = B
   command = 'call libb/pgmb parm('
 end
 command = command + parm1 + ' ' + parm2 + ')'
 call qcmdexc (command 128)

如果被调用的程序不向调用方返回值,则效果最佳。

您询问是否可以让系统覆盖库列表,而不告诉系统要使用哪个库。我不知道这怎么可能。

我认为你必须用库B来限定你的程序调用。如果你不能在程序中硬编码库名称,也许你可以以某种方式对其进行软编码。

/* CL example */
dcl &libname *char 10
rtvdtaara dtaara(WHICH_LIB) rtnvar(&libname)
call pgm(&libname/PGMNAME) parm(...)

因此,现在除了维护您的库列表外,您还必须维护此数据区域(或用于保存库名称的任何区域)。

库列表由四个组件组成:系统部分、产品库、当前库和用户部分。在正常情况下,系统ortion不应修改。(应该限制修改。)但所有其他部分都是打开的。

最有可能的位置是"产品库"部分。这可以容纳两个库,尽管最常见的情况是看到一个或没有。如果创建*CMD或*MENU对象,则可以为该对象指定产品库。(也可以设置当前库。)因此,对于一个命令,无论何时运行该命令,关联的产品库都会添加到库列表中,直到命令完成。届时,库将被删除。如果这些是CL程序,那么无论你是否知道,库都有可能定期添加到库列表中或从库列表中删除。

产品库的一般逻辑是在第一个开放位置添加库。如果两个位置都被占用了,那么检索顶部库,向上移动底部库,并在底部添加库。当程序完成时,反转过程,使产品库与启动时一样。

产品库位于当前库和库列表中的用户部分之上。使用更改库列表(QLICHGLL)API设置产品库。

相关内容

  • 没有找到相关文章

最新更新