1

在我们的 as/400 上,我们有一个测试环境和一个生产环境。一旦我们测试了我们的程序是否正常工作,我们就可以将它们置于生产环境中。两种环境都包含一组类似的库。

告诉我们的程序,它们在哪个环境中工作的基本机制是用于它们运行的​​作业的 liblists。这对某些事情很有效,但对其他事情则不然。因此,我们经常在提交作业时将参数传递给程序,告诉程序在测试或生产环境中工作。这让我很恼火,因为我的程序在整个执行过程中总是必须携带这个参数,甚至经常将它传递给其他程序。有时初始程序本身甚至不需要信息,但仍然必须将其作为参数,因为它调用了一个确实需要它的程序。

提出我面临的具体问题:更大流程的各个部分之间的通信通常通过我们系统中的数据队列完成。根据 liblist 读取特定的 DTAQ 就像一个魅力,只需调用RCVDTAQDTAQ 的名称,liblist 会负责选择正确的库。写入 DTAQ 也是如此。

但有时程序必须在收听或写入之前创建一个新的 DTAQ。现在这不适用于我们的布局和库列表。可以这样想:

产品库列表:

PPGMLIB1
PPGMLIB2
PDFILELIB1
PDTAQLIB1
P...
...

测试库列表

TPGMLIB1
TPGMLIB2
TDFILELIB1
TDTAQLIB1
T...
...

现在我的程序应该在 中创建 DTAQ ?DTAQLIB1,其中?应该是Por T

我的第一个想法是通过 liblist 并查找条目PDTAQLIBor TDTAQLIB,并取先到者 - 但我无法弄清楚如何做到这一点(因此我的相关问题:如何从内部读取 liblist一个 ILE 程序?(最好是 RPG 或 CL))。

我知道我可以通过检查哪个用户拥有当前工作来实现我的目标,但这会破坏我们通过 liblists 选择库的逻辑(就像我们当前的解决方法一样)。

有什么我想念的吗?我正在尝试编写一些特殊的调用方式CRTDTAQ,或者一些特殊的 api 来进行这个 liblist 比较?

4

3 回答 3

2

Warren 的配置文件想法很好,但听起来比您需要的要多得多。只使用数据区怎么样?

例如,确保您的 ?DFILELIB1 库中始终有一个名为 MODE 的数据区域。该模式只有一个字符“P”或“T”。

Or even simpler (though perhaps less clear): you could test for the presence or absence of a TESTMODE data area, and proceed accordingly.

于 2012-07-17T10:11:04.820 回答
1

要阅读 CL 中的库列表,请使用 RTVJOBA。要在 ILE RPG 中阅读它,我建议使用 QUSRJOBI API,格式为 JOBI0700。 http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fapis%2Fqusrjobi.htm
我认为扫描库列表的想法可能是最适合您的环境的想法。

于 2012-07-16T15:53:59.740 回答
1

我通常会尽量避免在我的程序中的任何地方硬编码库名称。如果您正在扫描特定的名称或名称模式,现在这可能工作得很好,但是当创建新环境时会发生什么,可能使用新的命名方案。因此,我会将环境设置存储为配置数据。

我有两种方法。

你可以建立一个通用的配置值表,各种程序都可以使用它来查找各种配置值。在我们的商店中,我们将其称为通用值文件。它具有主键字段,第一个通常用于程序名称,第二个用于正在配置的值的名称。我们还经常将表名作为第一个键,将列名作为第二个键,每条记录都为该列定义一个有效值及其描述。

在我使用数据队列实现 SOA 服务的地方,我有一个表专门用于定义有关服务的信息。这包括诸如库和数据队列名称之类的信息,以及客户端界面、执行服务的作业或管理我的服务作业的作业使用的其他信息。

在任何一种情况下,配置文件都位于特定于环境的数据库中,其值适用于该特定环境。我已经注释了包含所有配置记录的 INSERTS 的 SQL 脚本成员,以便源扫描可以轻松找到库或对象名称引用。我建议将特定于环境的配置与将被测试并转移到生产环境的其他应用程序配置数据分开。

于 2012-07-16T23:09:44.763 回答