使用OPNQRYF按字段的子字符串排序

时间:2018-05-14 17:46:00

标签: sql ibm-midrange rpgle

我有一个要求,我需要更改报告中打印记录的顺序。我需要通过记录字段的子字符串来排序记录。

在调用报告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程序中此文件的使用。我还没试过这个,但这会有用吗?这听起来像个好主意吗?还有更好的建议吗?

2 个答案:

答案 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。您需要确保OVRSCOPEOPNSCOPE和使用该表的程序都使用相同的激活组。有很多不同的组合。如果您无法使其正常工作,您可以随时将它们全部更改为*JOB,这样就可以了。但OPNQRYF没有任何内在因素阻止它在CLP中工作。

答案 1 :(得分:0)

我会尝试使用所有表字段和substring'd列创建一个视图,然后使用OPNQRYF而不是表,将substring'd列指定为KEYFLD。这可能比每次将整批货都复制到QTEMP更简单(并且可能更快)。