Ibm midrange 在RPG中重写。

Ibm midrange 在RPG中重写。,ibm-midrange,rpgle,Ibm Midrange,Rpgle,我有一个条件。 我有一个CL,其中我用Qtemp版本(Qtemp/TabA)覆盖一个表(TabA)。然后我调用一个RPG程序。 现在在RPG程序中,我更新了TabA。因此Qtemp版本正在更新,但我希望实际版本得到更新。因此,基本上,就在这次更新中,我不希望我的覆盖工作。一种方法是删除覆盖,然后在更新后重新覆盖它。有更好的办法吗 我将通过在F-spec或SQL中使用完全限定的文件名来处理这种情况,而不是在不同级别使用覆盖,而完全不使用覆盖。听起来RPG程序应该总是更新永久文件,而不是临时文件,因

我有一个条件。 我有一个CL,其中我用Qtemp版本(Qtemp/TabA)覆盖一个表(TabA)。然后我调用一个RPG程序。
现在在RPG程序中,我更新了TabA。因此Qtemp版本正在更新,但我希望实际版本得到更新。因此,基本上,就在这次更新中,我不希望我的覆盖工作。一种方法是删除覆盖,然后在更新后重新覆盖它。有更好的办法吗

我将通过在F-spec或SQL中使用完全限定的文件名来处理这种情况,而不是在不同级别使用覆盖,而完全不使用覆盖。听起来RPG程序应该总是更新永久文件,而不是临时文件,因此在F-spec上可以使用关键字
EXTFILE(LIBNAME/FILENAME)
。同样,如果您使用的是SQL,则可以将表引用为
LIBNAME.FILENAME

我也会在CL程序中使用明确的限定,引用
QTEMP/FILENAME
,这样您就可以完全删除覆盖。正如Barbara Morris指出的,如果在作用域中有一个覆盖,那么
EXTFILE
关键字将指向覆盖文件,即使库名是限定的


覆盖有一些很好的特性,特别是对于打印机文件,但听起来它们不适合您。实际上,您有两个逻辑上独立的关注点:处理临时文件和处理永久文件。他们应该分别对待。当您希望将对一个对象的所有引用替换为对另一个对象的引用时,重写是一种更好的技术。

与其在不同级别使用范围内的重写,不如在F-spec或SQL中使用完全限定的文件名,而不使用重写。听起来RPG程序应该总是更新永久文件,而不是临时文件,因此在F-spec上可以使用关键字
EXTFILE(LIBNAME/FILENAME)
。同样,如果您使用的是SQL,则可以将表引用为
LIBNAME.FILENAME

我也会在CL程序中使用明确的限定,引用
QTEMP/FILENAME
,这样您就可以完全删除覆盖。正如Barbara Morris指出的,如果在作用域中有一个覆盖,那么
EXTFILE
关键字将指向覆盖文件,即使库名是限定的


覆盖有一些很好的特性,特别是对于打印机文件,但听起来它们不适合您。实际上,您有两个逻辑上独立的关注点:处理临时文件和处理永久文件。他们应该分别对待。当您希望将对一个对象的所有引用替换为对另一个对象的引用时,重写是一种更好的技术。

另一种解决方案是只需在表上创建LF(或索引或视图)

为逻辑文件添加一个F-spec,并让您的更新使用该LF


不管覆盖是否到位,实际的PF都将被更新。

另一种解决方案是在表上创建LF(或索引或视图)

为逻辑文件添加一个F-spec,并让您的更新使用该LF


无论覆盖是否到位,实际PF都将更新。

另一个选项是将RPG程序置于与CL不同的激活组中。尽管如果您有OVRSCOPE(*作业),这将不起作用在覆盖上。

另一个选项是将RPG程序放在与CL不同的激活组中。尽管如果覆盖上有OVRSCOPE(*作业),这将不起作用。

显而易见的解决方案是不使用CL和RPG,并且 OVRDBF TABA TOFILE(生产库/TABA) 调用_cl_程序

这是因为覆盖从外部向内部工作。OVRSCOPE、激活组等都增加了在任何情况下都推荐此解决方案的复杂性

假设您已经得出了这个结论,下一个显而易见的解决方案就是在CLP之外“裸体”运行RPG程序。我可以假设,如果这是可行的,你就会这么做。可能所讨论的CL是由一个更大的进程调用的一整串其他CL中的一个

下一个明显的解决办法是改变中电;取出OVRDBF,运行大流程,然后将其放回原处。这样做是有效的,但是需要记住两次编译一个生产程序,设置权限等。在我这样做之前,我会考虑CLP的一个稍微不同的改变。根据需要,使用开关打开或关闭OVRDBF

像这样的变化需要发生一次是非常罕见的。也许有问题,大流程需要重新运行,只有这一个程序需要更新生产,而不是QTEMP。考虑使用外部指示器-类似于如果%开关(XXXXXXX 1)然后(OVRDBF…)。如果交换机已经被使用,考虑创建一个可以检索和测试的数据区域。 如果所有这些听起来都像是太多的工作,那么我的退路就是重新运行大进程。我的金科玉律是永远不要更改测试、运行和生产代码。制作一个一次性“重新运行”版本。 1) 复制一个big_process_cl。称之为big_process_rerun或类似的东西。 2) 用ovrdbf复制一份clp。同样的想法。 3) 更改并编译big_process_cl_rerun以调用所有需要的内容,但当它尝试使用_ovrdbf调用clp_时,请将该行更改为使用_ovrdbf_rerun调用clp_。 4) 将带有ovrdbf的clp_更改为没有ovrdbf。 5) 编译2个xxx_重新运行CL 6) 调用big_process_cl_rerun

这看起来需要做很多工作,但只需要2个CLs,而且您永远不会接触/破坏生产代码。同样,这对于重新运行的问题来说是很好的,但是它可能不适合您的需要

导致t的业务问题是什么
dcl-proc UpdateTABA;
  dcl-pi *n Ind;
    record       LikeRec(TABAREC:*output) const;
  end-pi;

  dcl-f tabanewlf    disk keyed usage(*update);

  chain (key) tabanewlf
  if %found(tabanewlf);
    update tabanewlf record;
    return *On;
  endif;
  return *Off;
end-proc;
create alias qtemp/taba_alias for taba;
select * from taba;
select * from taba_alias;