SQL & RRN Access
SQL can access rows by relative record number (RRN).
Finding MAX RRN
Here is an example of using SQL to select a record based on key fields AND the highest RRN. The file does have key fields defined. However, the keys are not unique. Multiple transactions may exist with the same keys. Finding the most recent transaction becomes a challenge. SQL may use the MAX function in conjunction with RRN to find the most recent transaction. It showuld be the row with the highest relative record number. However, there is a caveat here. The intent is to retrieve the most current record for the compound key. But, if the file description has specifed re-use deleted records, this technique will not work. The highest RRN may not be the most recent record written.
Exec SQL
Select a.dbID, a.dbCde, a.dlstnm, a.dfstnm, a.depdob
into :wk_dbID, :wk_dbCde, :wk_dLstNm, :wk_dFstNm, :wk_Dob
from File001 a join
(select dbID, dbCde, max(effdte) meffdte, max(rrn(File001)) mrrn
from File001 group by dbID, dbCde) b
on a.dbID=b.dbID and a.dbCde=b.dbCde and a.effdte=b.meffdte
and rrn(a) = b.mrrn
where a.dbID=:pi_dbID and a.dbCde=:pi_dbCde ;
Update by RRN
In a database (such as mentioned in the first example) where key fields might not be unique, the RRN function may be useful when declaring a cursor. A cursor may be created referencing the relative record (RRN). Then the RRN retrieved can be used to update the record, without referencing a key, or trying to code around a non-unique key. The code snippett illustrates a table update, changing the status of a row, using RRN.
EXEC SQL
declare AEP811_Csr insensitive cursor
for (select xData, xSts, RRN(AEP811) from AEP811 where xSts = 0);
. . .
EXEC SQL
FETCH NEXT FROM AEP811_Csr
INTO :dataRec;
. . .
//*------------------------------------------------------------*/
//* Set status flag to 9, indicating the record was processed. */
//*------------------------------------------------------------*/
EXEC SQL
Update AEP811 set xSts = 9
Where RRN(AEP811) = :htmRRN;