Упорядочение по подстроке поля с помощью OPNQRYF - PullRequest
0 голосов
/ 14 мая 2018

У меня есть требование, когда мне нужно изменить порядок, в котором записи печатаются в отчете. Мне нужно упорядочить записи по подстроке поля записей.

Существует OPNQRYF, как показано ниже, до вызова RPG с отчетом:

 OVRDBF     FILE(MOHDL35) SHARE(*YES)                

 BLDQRYSLT  QRYSLT(&QRYSLT)                  +       
   SELECT((CHARDT *GE &FRDATE  F2)  +                
   (CHARDT *LE &TODATE  F2)  +                       
   (HDPLVL *EQ 'FS'     F2)  +                       
   (HDMPLT *EQ &PLANT   F2))                         

      OPNQRYF    FILE((*LIBL/MOHDL35))       +       
                 QRYSLT(&QRYSLT)             +       
                 KEYFLD(*FILE)               +       
                 MAPFLD((ZONEDT HDAEDT *ZONED 8 0) + 
                        (CHARDT ZONEDT *CHAR 8))

Один из способов увидеть, как это сделать - это запустить RUNSQL для создания временной таблицы в qtemp с записями MOHDL35 в необходимом порядке. Функция SQL substr поможет достичь этого гораздо проще. Это должно иметь ту же структуру, что и у MOHDL35 (Имена полей, формат записи)

Затем замените использование этого файла в программе RPG вновь созданным именем таблицы. Я еще не пробовал это, но будет ли это работать? это звучит как хорошая идея? Есть ли лучшие предложения?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы можете сделать это с помощью OPNQRYF, используя параметр MAPFLD, например:

OPNQRYF FILE((JCVCMP))                  
        KEYFLD((*MAPFLD/PART))          
        MAPFLD((PART '%SST(VCOMN 2 5)'))

Поля в JCVCOMN теперь сортируются следующим образом:

VENNO  VCMTP  VCMSQ  VCOMN
-----  -----  -----  -------------------------
1,351  ICL    3      Let's see what wow
1,351  ICL    1      This is a test
1,351  NDA    2      another comment
1,351  NDA    1      more records

Обратите внимание, что записи отсортированы по подстроке VCOMN, начиная со второго символа.

Итак, вот ваш OPNQRYF с несколькими указанными ключевыми полями

OPNQRYF FILE((*LIBL/MOHDL35))                               
        QRYSLT(&QRYSLT)                                     
        KEYFLD((*MAPFLD/CHARDT) (*MAPFLD/HDPROD))           
        MAPFLD((ZONEDT HDAEDT *ZONED 8 0) (CHARDT ZONEDT *CHAR 8)
               (HDPROD '%SST(HDPROD 1 2) *CAT %SST(HDPROD 10 12) 
               *CAT %SST(HDPROD 13 16)'))        

Некоторые примечания: я предполагаю, что HDAEDT - это PACKED число. Если это так, вам не нужно отображать его на ZONED число только для того, чтобы получить значение символа. Если вам нужно значение ZONED, это нормально (но PACKED должно работать так же хорошо). В противном случае вы можете просто использовать:

MAPFLD((CHARDT HDAEDT *CHAR 8))

Также в вашем OVRDBF необходимо убедиться, что вы выбрали правильный диапазон переопределения OVRSCOPE. IBM по умолчанию OVRSCOPE(*ACTGRPDFN). OPNQRYF также имеет область действия OPNSCOPE. Необходимо убедиться, что OVRSCOPE, OPNSCOPE и программа, использующая таблицу, используют одну и ту же группу активации. Есть много разных комбинаций. Если вы не можете заставить его работать, вы всегда можете изменить их все на *JOB, и это сработает. Но в OPNQRYF нет ничего, что мешало бы его работе с CLP.

0 голосов
/ 15 мая 2018

Я бы попытался создать представление со всеми полями таблицы плюс столбец substring'd, а затем использовать OPNQRYF с этим вместо таблицы, указав столбец substring'd в качестве KEYFLD.Это, вероятно, будет проще (и, возможно, быстрее), чем каждый раз копировать всю партию в QTEMP.

...