前几天写了一个维护交易,有这样的一个需求:在增加数据的时候,每条数据都有序号,这个序号值由程序生成,非柜员输入;
生成规则是,根据键值排序,类似这样的数据:
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--