我有三个库,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设置产品库。