我有一个要求,我需要更改报告中打印记录的顺序。我需要通过记录字段的子字符串来排序记录。
在调用报告RPG之前有一个OPNQRYF:
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记录。 substr SQL函数将有助于实现这一目标。这应该具有与MOHDL35(FIELD NAMES,RECORD FORMAT)相同的结构
然后使用新创建的表名替换RPG程序中此文件的使用。我还没试过这个,但这会有用吗?这听起来像个好主意吗?还有更好的建议吗?
答案 0 :(得分:1)
您可以使用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中工作。
答案 1 :(得分:0)
我会尝试使用所有表字段和substring'd列创建一个视图,然后使用OPNQRYF而不是表,将substring'd列指定为KEYFLD。这可能比每次将整批货都复制到QTEMP更简单(并且可能更快)。