使用SETLL根据取值范围检查记录是否存在

问题描述 投票:0回答:2

有一个包含 validfromDate 和 validtoDateRange 字段的文件。两者都是 LF 中的关键字段。

有没有办法使用 SETLL 或任何其他操作码(无需通读文件)检查是否存在日期介于 fromdate 和 todate 值之间的记录?

等效的 SQL 是:

select 1 from sysibm.sysdummy1 a where exists (
SELECT * FROM ipldtad.iplmai WHERE current_date
 between VALFRDATE and VALTODATE       ) 
ibm-midrange rpg
2个回答
2
投票

你不需要阅读整个文件,但我认为你需要在SETLL之后阅读一条记录。

setll (from) myfile;            
if %found();                      
   read myfile;                 
   if keyfld <= to;               
      have_record = *on;        
   endif;                       
endif;                          

0
投票

如果我错了请纠正我,但我认为解决问题的方法是:

假设我们有一个包含字段的物理文件

(DTEFROM, DTETO)

和一组记录

#1 (01FEB23, 05MAR23)
#2 (01MAR23, 30MAR23)
#3 (05MAR23, 10MAR23)
#4 (05MAR23, 12MAR23)
#5 (15MAR23, 20MAR23)

它有一个逻辑文件(索引)

myFile(DTEFROM)

通过 DTEFROM 字段 假设我们需要找到一条记录

DTECHK = 13MAR23

位于 DTEFROM 和 DTETO 之间。

我会这样做:

setGT (DTECHK) myFile;
readp myFile; // read record #4

dow not %eof(myFile);
  if DTECHK <= DTEFROM; // true for record #2
    hasRec = *on;
    leave;
  endif;
  
  readp myFile; // read records #3, #2, and so on...
enddo;

setGT 将在 DTEFROM >= DTECHK 的第一个条目之前设置指针(或者,如果您愿意,在满足我们正在寻找的范围左端的最后一个条目之后)。 然后我们就可以“向后”读取记录 (readp),检查范围右边界的条件 (DTECHK <= DTEFROM) until we find the desired record (this will be record # 2) or reach the beginning of the file (readp will return % eof=true).

© www.soinside.com 2019 - 2024. All rights reserved.