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
这似乎正是我需要的。
所以有这个 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
这似乎正是我需要的。