在RPGLE程序中选择记录

时间:2018-10-17 08:15:27

标签: ibm-midrange rpgle

因此有一个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程序,使其仅处理那些符合选择标准的记录。 (我试图避免整个过程的一件事)。如果有人知道某种技术可以实现这一目标。即执行诸如更新联接逻辑文件之类的操作,请在此处提及。

更新:只是更新,我设法修改了处理记录的程序。该程序基本上是一个子文件,它向用户显示记录以供修改。因此,我要做的就是在写入子文件之前添加一个附加条件检查。

但是在这种情况下,由于程序正在处理向上和向下的分页,因此它并没有达到应有的效果。

2 个答案:

答案 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            

这似乎正是我所需要的。