RPG程序参数变更影响分析

问题描述 投票:0回答:1

我有一个需要修改用作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);   

第一个参数是要添加新字段的参数。

ibm-midrange rpg
1个回答
0
投票

如果你不想编译每个调用 API 程序的程序,问题是被调用者必须知道调用者是否知道新字段,否则如果年龄参数必须是数字,被调用者可能会失败,至少不会使用调用者传递的年龄,并且可能会破坏调用者的内存,这可能会隐藏调用者异常背后的真正问题。

您可以添加第三个参数,用

options(*nopass)
告诉API的版本,当参数未设置时(
%parms = 2
)就像它被设置为原始版本一样

但问题是输入参数中的新字段并没有在最后添加,因此调用者的下一次编译必须传递并设置新参数,因为使用了新的输入结构并且年龄值已经移动。

我不确定这是否值得付出努力。

© www.soinside.com 2019 - 2024. All rights reserved.