Выбор записей в программе RPGLE - PullRequest
0 голосов
/ 17 октября 2018

Итак, есть эта программа 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 голосов
/ 17 октября 2018

Я наконец-то получил ответ.

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            

Кажется, это именно то, что мне нужно.

0 голосов
/ 17 октября 2018

Я нашел этот пример в IBM RedBook, если вы хотите использовать OPNQRYF

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.

...