取代RPG。

时间:2018-08-02 14:37:54

标签: ibm-midrange rpgle

我有病。 我有一个CL,其中我使用Qtemp版本(QTEMP / TabA)覆盖了表(TabA)。然后我调用一个RPG程序。 现在,在RPG程序中,我对TabA进行了更新。因此,Qtemp版本正在更新,但我希望更新实际版本。因此,基本上,仅在此更新中,我不希望我的替代起作用。一种方法是删除覆盖,然后在更新后覆盖它。有没有更好的办法?

6 个答案:

答案 0 :(得分:3)

另一种解决方案是简单地在表上创建LF(或Index或View)。

为逻辑添加F规范,并让UPDATE使用该LF。

无论是否已设置覆盖,实际的PF都会更新。

答案 1 :(得分:1)

显而易见的解决方案是不考虑CL和RPG,并且 OVRDBF TABA TOFILE(production_library / TABA) 呼叫the_cl_program

之所以起作用,是因为从外部到内部覆盖工作。 OVRSCOPE,激活组等都增加了使其成为所有情况下推荐的解决方案的复杂性。

假设您已经得出了这个结论,下一个显而易见的解决方案是简单地在CLP外部运行“裸”式RPG程序。我可以假设,如果可行,那么您就已经做到了。也许有问题的CL包含了由较大进程调用的其他所有CL字符串。

下一个明显的解决方案是更改CLP。取出OVRDBF,运行大程序,然后放回去。那行得通,但是存在必须记住两次编译生产程序,设置权限等问题。在我这样做之前,我会考虑对该CLP进行一次稍有不同的更改。根据需要,使用开关打开或关闭OVRDBF。

这种变化一次需要发生是非常罕见的。可能是有问题,并且需要重新运行大流程,仅此一个程序需要更新生产,而不是QTEMP。考虑使用外部指示器-类似于%switch(xxxxxxx1)然后(OVRDBF ...)。如果已经使用了开关,请考虑建立一个可以检索和测试的数据区域。

如果所有这些听起来都太麻烦了,那么重新运行Big Processed的工作就落空了。我的黄金法则是永远不要更改经过测试,正在运行的生产代码。制作一次“重新运行”版本。 1)复制big_process_cl。称之为big_process_rerun或类似的名称。 2)复制the_clp_with_ovrdbf。相同的想法。 3)更改并编译big_process_cl_rerun以调用所需的所有内容,但是当它尝试CALL clp_with_ovrdbf时,将该行更改为CALL clp_with_ovrdbf_rerun。 4)将clp_with_ovrdbf更改为不具有OVRDBF。 5)编译2个xxx_rerun CL 6)呼叫big_process_cl_rerun

这似乎是一项艰巨的工作,但是只有2个CL,您将永远不会触及/破坏生产代码。同样,这对于重新运行问题很有用,但可能不符合您的需求。

导致此要求的业务问题是什么?

编辑: 显然,PGMA会读取一个非常大的文件中的所有行,但只需要处理一个子集即可。在读取记录时,它也会更新记录。将输入重定向到必要的子集的想法很不错,但这意味着生产表无法获得其更新。如果我有这些限制(一定不要更改PGMA),我会再编写一个程序。 PGMA运行并更新QTEMP / TABA之后,该新程序将读取QTEMP / TABA并将更改传播到生产环境。

答案 2 :(得分:1)

在我看来,就像您的TABA程序中只有一个F规范一样。在这种情况下,您不能在不修改程序的情况下更改观察到的行为,但是可以通过创建新的逻辑和子过程来限制修改的范围:

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;

然后,无论您在何处有更新操作码,都可以调用此子过程。由于它使用了不同的文件名,因此不会受到覆盖的影响。

鉴于您正在使用SQL,您还可以创建一个别名并进行更新。别名不受替代的影响。看起来像这样:

create alias qtemp/taba_alias for taba;

我只是在存在覆盖的情况下对此进行了测试,该覆盖会将文件覆盖为另一个库中的空副本。

select * from taba;

在以下时间返回空数据集:

select * from taba_alias;

返回具有期望数据的数据集。完成后,只需删除别名即可。注意,我在QTEMP中创建了别名。这样,多个用户可以运行您的程序,而无需彼此重新创建或放置别名。

因此,如果您不介意多余的工件,请使用视图;如果只想创建一个指针,请使用别名。

答案 3 :(得分:0)

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

我还将在CL程序中使用显式的限定词,引用QTEMP/FILENAME,以便您可以完全删除替代项。正如芭芭拉·莫里斯(Barbara Morris)所指出的,如果您在作用域中具有覆盖,则EXTFILE关键字将指向覆盖的文件,即使库名是合格的。

覆盖具有一些不错的功能,尤其是对于打印机文件,但听起来它们不适合您。实际上,您在逻辑上有两个问题:对临时文件进行处理,并对永久文件进行处理。他们应该得到单独的对待。对于希望将对一个对象的所有 all 引用替换为对另一个对象的引用的情况,覆盖是一种更好的技术。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

谢谢。 在创建别名并更新它而不是在程序中使用TabA之后,我修复了此问题。这工作得很好,我也不想创建索引。