我有一个需要修改用作API的RPG程序的情况。我正在尝试对此更改进行影响分析,以避免依赖程序中出现任何错误。
所以,程序有两个参数。这两个参数都是数据结构。
需求是在输入参数DS中添加一个新字段,在输出参数DS中添加一个字段。
API 程序(正在更改)条目定义为:
dcl-pi;
InputDS likeds(API901INP);
OutputDS likeds(API901OUP);
end-pi;
以下是 API 程序中输入和输出 DS 的定义方式以及如何通过添加新字段更改它们的示例:
dcl-ds InputDS extname('901_i);
NameOfCandidate extfld('name');
JobOfCandidate extfld('job'); --> newly added field
AgeOfCandidate extfld('age');
end-ds;
dcl-ds OutputDS extname('901_o');
AgeQualified extfld('qualified');
JobCertified extfld('certified'); --> newly added field
end-ds
可以看出,我们使用的标准要求将API DS结构定义为外部结构。这意味着,如果要像上面那样添加一个新字段,参考表 (901_i/901_o) 需要先修改。
此外,当从其他程序中调用此 API 时,必须使用参考文件定义 DS。
现在,问题是不是所有调用API的程序都需要添加到DS的新字段。那么,现有程序会受到此更改的影响吗?
重复一下,现有程序也使用相同的外部参考文件 (901_i/901_o) 来定义调用 API 程序时要使用的数据结构参数。 那么,他们(调用不在输出和输入 DS 中添加新字段的程序)是否需要某种更改,比如重新编译等?
更新: 以上只是我需要做的一个简化示例。下面是实际的代码。
这就是在 API rpg 中定义输入 DS 的方式。
dcl-ds P_IAC3003I extname('IAC3003_I') qualified template;
ExternSessionId extfld('EXTSESSID');
WorkKey extfld('WORKKEY');
PreferedReferenceType extfld('PREFREF');
SalesCountryCode extfld('SALESCNTRY');
ManufacturingCountryCode extfld('MANUFCNTRY');
TypeOfPerformanceUsage extfld('PERFUSE');
TypeOfMechanicalUsage extfld('MECHUSE');
UsageDateChar extfld('USAGEDATE');
DistributionDateChar extfld('DISTRDATE');
PerfIPRight extfld('PERFRIGHT');
MechIPRight extfld('MECHRIGHT');
DistributingSociety extfld('DISTRSOC');
TypeOfAction extfld('SAVEACTION');
UserPermission extfld('USERPERM');
ExpertMode extfld('EXPERTMDE');
LimitAccessToSociety extfld('LMTACCSSOC'); //new field
GetNoOfRows extfld('GETNOOFROW');
end-ds;
新字段 (LimitAccessToSociety) 没有按照惯例添加为最后一个字段,getNumberOfRows 始终作为最后一个参数传递(我认为以这种方式维护它具有美观意义)。
这就是调用者调用 RPG 的方式:
callp IAC3003 (IACSESSION:
IAC3003I:
IACRETMSG:
IAC3003D:
IAC3003L1:
IACRESLIST01:
IAC3003L2:
IACRESLIST02:
IAC3003L3:
IACRESLIST03);
第一个参数是要添加新字段的参数。
如果你不想编译每个调用 API 程序的程序,问题是被调用者必须知道调用者是否知道新字段,否则如果年龄参数必须是数字,被调用者可能会失败,至少不会使用调用者传递的年龄,并且可能会破坏调用者的内存,这可能会隐藏调用者异常背后的真正问题。
您可以添加第三个参数,用
options(*nopass)
告诉API的版本,当参数未设置时(%parms = 2
)就像它被设置为原始版本一样
但问题是输入参数中的新字段并没有在最后添加,因此调用者的下一次编译必须传递并设置新参数,因为使用了新的输入结构并且年龄值已经移动。
我不确定这是否值得付出努力。