如何搜索记录?

问题描述

如何在RPGLE中按字段搜索跳转到位置?

这是我的屏幕:

enter image description here

比方说,我想转到日期 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. 有错误的第一个子文件行
  2. 要填写的位置
  3. 上一个输入操作的子文件顶部字段
  4. 1

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...