使用max函数转换rpgle中readpe操作码

前几天写了一个维护交易,有这样的一个需求:在增加数据的时候,每条数据都有序号,这个序号值由程序生成,非柜员输入;

生成规则是,根据键值排序,类似这样的数据:

actyp     actno     seqno     ...
------   -------    -------   ------  
001      a001       1         ...
001      a001       2         ...
002      b110       1         ...
003      a100       1         ...

这样,柜员在做查询的时候,单从序号,能够知道某种类型(actyp)的活动(actno),录入了多少次。

其中actyp和actno为组合键值(not null),物理文(RPGLE)定义为UNIQUE,则这个键值就是SQL中的primary key。

如果再添加一条数据(002   b110  seqno   ...),则这个seqno的值应该在原来数据的seqno值上加一,为2;

如果添加一条没有的数据,则seqno应该为1。

使用sql查询,这个值很容易就能找到了,如果要使用RPGLE去实现的话,会稍微有些麻烦:

首先,根据actyp和actno将数据分组,然后让数据根据seqno降序排列,读取数据,读到的第一条seqno就是最大的。

下面看看RPGLE是怎么实现的:

     C                   EVAL      O01_SEQNO = 1
     C     K_CDRD        SETGT     CDRD
     C     K_CDRD        READPE    CDRD
     C                   DOW       1 = 1
      *到文件末尾未找到
     C                   IF        %EOF
     C                   LEAVE
     C                   ENDIF
      *有多条数据,取 最大值+ 1
     C                   IF        SEQNO >= O01_SEQNO
     C                   EVAL      O01_SEQNO = SEQNO + 1
     C     K_CDRD        READPE    CDRD
     C                   ITER
     C                   ENDIF
     C
     C     K_CDRD        READPE    CDRD
     C                   ENDDO
从代码中,我们看不出根据键值分组和按照seqno降序排序的过程,操作码setgt和readpe组合起来,

在底层为我们去实现的这个操作。如果使用SQL查询,可以看出是多么的简洁,易读:

     C/EXEC-SQL
     C+    SELECT MAX(SEQNO) + 1 INTO :V_SEQNO
     C+      FROM CDTD
     C+     WHERE ACTYP = :V_ACTYP
     C+       AND ACTNO = :V_ACTNO
     C+  GROUP BY ACTYP,ACTNO
     C/END-EXEC
--the end--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值