CRTPGM 和 UPDPGM 有什么区别

Kun*_*oy 2 rpgle ibm-midrange

假设我的模块发生了一些变化,所以我必须更新服务程序,结果签名发生了变化。那么我应该选择哪个选项呢?我应该使用 CRTPGM 或 UPDPGM 重新创建使用服务程序的程序。在这种情况下,您能区分 CRTPGM 和 UPDPGM 之间的区别吗?

Cha*_*les 7

首先,您不应仅仅因为 *SRVPGM 已更改而需要 CRTPGM 或 UPDPGM。由于 *SRVPGM 的更改而要求 *PGM 重新编译,这应该是一个非常罕见且非常有意的决定。

听起来你可能正在使用CRTSRVPGM EXPORT(*ALL),不要这样做。相反,使用活页夹源CRTSRVPGM EXPORT(*SRCFILE) SRCFILE(..)来控制导出的过程和服务程序签名。硬编码签名的简单方法

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
  export symbol('Proc1')
  export symbol('Proc2')
ENDPGMEXP
Run Code Online (Sandbox Code Playgroud)

现在您可以将过程添加到服务程序中,并且只要将导出添加到末尾,您就可以保留相同的签名,并且不会强制重新编译使用该服务程序的任何程序。

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
  export symbol('Proc1')
  export symbol('Proc2')
  export symbol('Proc3')
  export symbol('Proc4')
ENDPGMEXP
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您无法删除或重新排序导出。

如果您确实需要确保重新编译所有调用程序,那么您只需更新硬编码签名即可。

STRPGMEXP SIGNATURE('MYSRVPGM Sig v2')
  export symbol('Proc1')
  export symbol('Proc3')
  export symbol('Proc4')
ENDPGMEXP
Run Code Online (Sandbox Code Playgroud)

另一种方法是让系统生成签名并使用*CURRENT*PRV块。但您仍然无法在不破坏现有调用者的情况下删除或重新排序导出。所以社区的共识是简单地对签名进行硬编码。IBM 本身也遵循这种做法,将 *SRVPGM 对象包含在操作系统中。

需要意识到的两件重要的事情是

  • 过程签名(参数的数量和类型)与 *SRVPGM 签名无关。
  • 过程名称在 *PGM 对象的“绑定”时间解析,在执行期间,调用实际上是按位置进行的。

举例来说,如果我有这个

dcl-pr Proc1 extproc(*dclcase);
  parm1 char(10);
end-pr;
dcl-pr Proc2 extproc(*dclcase);
  parm1 char(20);
end-pr;
Run Code Online (Sandbox Code Playgroud)

有粘合剂源

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
  export symbol('Proc1')
  export symbol('Proc2')
ENDPGMEXP
Run Code Online (Sandbox Code Playgroud)

我可以做这个

dcl-pr Proc1 extproc(*dclcase);
  parm1 char(10);
  parm2 char(20) option(*nopass);
end-pr;
dcl-pr Proc2_depreciated extproc(*dclcase);
  parm1 char(20);
end-pr;
dcl-pr Proc2 extproc(*dclcase);
  parm1 varchar(100) const;
end-pr;
Run Code Online (Sandbox Code Playgroud)

有粘合剂源

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
  export symbol('Proc1')
  export symbol('Proc2_deprecated')
  export symbol('Proc2')
  export symbol('Proc3')
ENDPGMEXP
Run Code Online (Sandbox Code Playgroud)

现有的 *PGM 的调用Proc2()将继续调用现在重命名的代码Proc2_deprecated()。调用的新的或重新编译的现有 *PGMProc2()将调用名为 的新添加的代码Proc2()

现在为您的问题提供不完整的答案,

CRTPGM 和 UPDPGM 有什么区别?

我很确定存在差异,我知道当使用 UPDSRVPGM 而不是 CRTSRVPGM 时,*SRVPGM 对象中的一些元数据不会更新。我敢打赌 UPDPGM 也是如此。另外,CRTPGM 有一个
Allow *SRVPGM library update . . ALWLIBUPD默认参数*NO,因此如果您更新的服务程序位于另一个库中,您可能必须使用 CRTPGM。

老实说,在使用该平台的 30 年里,我从未使用过 UPDPGM 或 UPDSRVPGM。大多数时候,我的 *PGM 是单个模块,并使用绑定目录来查找 *SRVPGM,因此通过 CRTBNDRPG 重新创建非常简单。*SRVPGM 要么是单个模块,要么具有特定于其创建的唯一绑定目录。

我在职业生涯中使用的变更管理工具也重新创建了对象,而不是使用 UPDPGM 或 UPDSRVPGM。

最后,如果您是 ILE 新手,并且 *SRVPGM 的 Scott Klement 的ILE 概念(针对不耐烦的 RPG 程序员)演示文稿虽然很老,但却很不错。