Вы можете сделать это с помощью 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.