RPGLE程序中记录的选择

Selection of records in RPGLE program

所以有这个 RPGLE 程序 updates/writes 记录在一个 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 程序,使其只处理那些符合选择标准的记录。 (我一直试图避免的一件事)。如果有人知道某种技术来实现这一点。即做一些类似更新连接逻辑文件的事情,请在这里提及。

更新:只是一个更新,我设法修改了处理记录的程序。该程序基本上是一个子文件,它向用户提供记录以供修改。所以我必须做的是在写入子文件之前包括一个额外的条件检查。

但是由于在这种情况下向上和向下翻页是由程序处理的,所以这并不像它应该的那样干净。

如果您想使用 OPNQRYF,我在 IBM 红皮书中找到了这个示例

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 性能更高。

终于找到答案了

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            

这似乎正是我需要的。