问题描述
这是我的屏幕:
比方说,我想转到日期 02/06/2016 的位置,然后在“Position to..”字段中输入,据说光标将转到 02/06/2021 和之后的记录。
但似乎我有一个无限循环。当我调试时,我意识到日期是 02/06/2021 并且在那之后没有去下一个日期。我应该怎么办?请帮我。提前致谢:)
解决方法
Date reade curexg
dou %eof
select
exgcod wheneq 'USD'
move exgrat usd
exgcod wheneq 'GBP'
move exgrat gbp
exgcod wheneq 'EUR'
move exgrat eur
exgcod wheneq 'AUD'
move exgrat aud
exgcod wheneq 'SGD'
move exgrat sgd
endsl
Date reade curexg
enddo
这对我来说就像一个无限循环。您使用 reade(read equal) 读取文件,但从未更新 Date 变量,您一遍又一遍地读取同一条记录,但未达到 %eof。
,循环中的循环对我来说太复杂了。返回特定交换日期的每个汇率的 RPG 程序将有助于简化。
** ------------------------ curexg_readExchangeRates --------------
pcurexg_readExchangeRates...
p b
dcurexg_readExchangeRates...
d pi
d outUsd 5p 2
d outGbp 5p 2
d outEur 5p 2
d outAud 5p 2
d outSgd 5p 2
d inExgDat d const
/free
outUsd = 0 ;
outGbp = 0 ;
outEur = 0 ;
outAud = 0 ;
outSgd = 0 ;
setll ( inExgDat ) curexg ;
dow 1 = 1 ;
reade ( inExgDat ) curexg ;
if %eof ;
leave ;
endif ;
if exgcod = 'USD' ;
outUsd = exgrat ;
elseif exgcod = 'GBP' ;
outGbp = exgrat ;
elseif exgcod = 'EUR' ;
outEur = exgrat ;
elseif exgcod = 'AUD' ;
outAud = exgrat ;
elseif exgcod = 'SGD' ;
outSgd = exgrat ;
endif ;
enddo ;
return ;
/end-free
p e
然后你可以有一个简单的循环从开始日期读取汇率日期:
dow 1 = 1 ;
setll ( startDate ) curexg ;
read curexg ;
if %eof ;
leave ;
endif ;
cur_date = exgdat ;
curexg_readExchangeRates( usd: gbp: eur: aud: sgd:
cur_date ) ;
// write exchange rates of current date to subfile.
write sflrec ;
// advance to next exchange rate date
setgt ( cur_date ) curexg ;
read curexg ;
if %eof ;
leave ;
endif ;
startDate = exgdat ;
enddo ;
,
每个人都缺少的关键是 DDS 关键字:SFLRCDNBR[([CURSOR] [*TOP])]
这个关键字告诉在写屏幕时显示哪个子文件页面。在 IBM 手册 https://www.ibm.com/docs/en/i/7.3?topic=80-sflrcdnbr-subfile-record-number-keyword-display-files 中查找。那里有一个如何使用它的例子,但高层次的飞越是你在加载它时会计算子文件记录,并找到由 find/position to 字段指定的记录,然后将该值放入该字段在写入子文件控制记录之前。如果位置字段中没有值,则应使用前一个顶部记录编号或 1 加载此字段。
为完整起见,可以在显示文件反馈区找到之前的最高记录号。
如果子文件中可能有错误,逻辑会变得有点复杂,因此您可能希望将位置子文件逻辑放入子过程中,因为您需要在处理字段定位逻辑之前处理错误。我发现最好的优先级是:
- 有错误的第一个子文件行
- 要填写的位置
- 上一个输入操作的子文件顶部字段
- 1