因此有一个RPGLE程序可以更新/写入PF中的记录(例如FILE1)。 RPGLE程序相当古老且庞大,建议不要对此进行任何更改。
现在,我需要做的是使程序仅处理文件中的某些记录。更准确地说,也仅处理存在于另一个文件中的那些记录。
例如,考虑本程序使用名称STUDENTS更新了一个文件,其中包含所有学生记录。假设还有另一个文件ASIAN_STUDENTS。
因此,要求将仅处理ASIAN_STUDENTS文件中也存在的那些学生记录。
与之等效的SQL(仅是一个想法)将是:
SELECT * FROM STUDENTS WHERE STUDENT_ID IN (SELECT STUDENT_ID FROM ASIAN_STUDENTS);
如何执行此操作而无需修改程序?有什么建议吗?
可以在执行程序之前以某种方式覆盖FILE1以仅显示匹配的记录吗?
我希望有一些使用OPNQRYF的技术来实现这一目标。请告知。
请在下面查看我要实现的代码片段:
PGM
OPNQRYF FILE((MFGRP00) (MFRSP00)) OPTION(*INP) +
FORMAT(MFGRP00 MFGRP00A) +
JFLD((MFRSP00/RSMORD MFGRP00/GRMORD *EQ) +
(MFRSP00/RSASST MFGRP00/GRASST *EQ) +
(MFRSP00/RSMRWK MFGRP00/GRMRWK *EQ)) +
OPNSCOPE(*JOB)
OVRDBF FILE(MFGRP00) TOFILE(MFGRP00) +
OVRSCOPE(*JOB) SHARE(*YES)
CALL MF125R00
ENDPGM
在上面的代码片段中,MFGRP00是程序MF125R00处理的文件。
此刻我要解决与MFGRP00的处理有关的一些错误。
在下面的答案中,我还进一步了解到,如果我们只是读取数据,则opnqryf可以很好地加入文件的困难方式。但 要更新数据以及正在打开的文件中的数据,此方法将不起作用,因为opnqryf如果与另一个文件合并,则不允许更新文件。因此,唯一的出路是修改RPGLE程序,使其仅处理那些符合选择标准的记录。 (我试图避免整个过程的一件事)。如果有人知道某种技术可以实现这一目标。即执行诸如更新联接逻辑文件之类的操作,请在此处提及。
更新:只是更新,我设法修改了处理记录的程序。该程序基本上是一个子文件,它向用户显示记录以供修改。因此,我要做的就是在写入子文件之前添加一个附加条件检查。
但是在这种情况下,由于程序正在处理向上和向下的分页,因此它并没有达到应有的效果。
答案 0 :(得分:0)
如果您想使用OPNQRYF,我在IBM RedBook中找到了这个示例
OVRDBF FILE(ITEM_JOIN3) TOFILE(ITEM_FACT) +
OVRSCOPE(*JOB) SHARE(*YES)
OPNQRYF FILE((ITEM_FACT) (CUST_DIM) (TIME_DIM)) +
FORMAT(ITEM_JOIN3)
QRYSLT('TIME_DIM/YEAR *EQ 1997') +
JFLD((ITEM_FACT/CUSTKEY CUST_DIM/CUSTKEY) +
(ITEM_FACT/SHIPDATE TIME_DIM/DATEKEY)) +
GRPFLD(CUST_DIM/CUSTOMER) +
MAPFLD((TOTITEMS '%SUM(QUANTITY)') +
(TOTREV '%SUM(REVENUE)') +
(TRANSCOUNT '%COUNT')) +
OPNSCOPE(*JOB)
CALL PGM(PROC_ROWS)
CLOF OPNID(ITEM_FACT)
DLTOVR FILE(ITEM_JOIN3) LVL(*JOB)
我认为最好的方法是,如果无法修改程序,则创建一个CL,调用一个RPGLE程序,该程序在QTEMP中创建一个类似于您读取的主文件的过滤文件,然后再调用您的程序。请记住,SQL比OPNQRYF的性能更高。
答案 1 :(得分:0)
我终于找到答案了。
PGM
OVRDBF FILE(MFGRP00) SHARE(*YES) SEQONLY(*NO)
OPNQRYF FILE((MFGRP00) (MFRSP00)) FORMAT(MFGRP00) +
KEYFLD(*FILE) JFLD((MFGRP00/GRMORD +
MFRSP00/RSMORD *EQ) (MFGRP00/GRASST +
MFRSP00/RSASST *EQ) (MFGRP00/GRMRWK +
MFRSP00/RSMRWK *EQ)) JDFTVAL(*NO)
CALL MF125R00
CLOF MFGRP00
这似乎正是我所需要的。