2012-07-30 99 views
2

我写一个程序来读取物理文件:只能读取一个值

 
0002.00  A          REF(USRMF)                 
0002.01  A   R TSREC                        
0005.00  A   USRID  R  *user ID                      
0006.00  A   USRDT  R  *date                     
0007.00  A   USRTI  R  *time IN                     
0008.00  A   USRTO  R  *time OUT                     
0009.00  A   K USRID   

如果我允许用​​户输入的日期,时间和超时。

Ofcourse将复制USRID

凡在我的节目,我检查以前的最大值是这样的:

 
0019.01 C  *LOVAL  SETLL  USRTS                     
0019.03 C  USRID   READE  USRTS         45            
0019.04 C     DOW  (*IN45='0')                    
0019.05 C     IF  (USRDT>=MIN)                   
0019.06 C     MOVE  USRTO   MAX                  
0019.07 C     MOVE  USRDT   MIN                  
0019.08 C     ENDIF                        
0019.09 C  USRID   READE  USRTS         45            
0019.10 C     ENDDO                        
0029.00 C     ENDSR 

我有以下用户:

 
Opt USR ID User Name 
A0000001 SAMSUL ARIPIN MISDAR            
A0000002 NUR QISTINA SAFIYYAH            
A0000003 LEE TSAE YUN              
A0000004 SOFFUAN SAURI 

但是,当我尝试与以前的价值进行比较。 我的程序只能检查用户A000000001,而不是其他用户。

如何修改progrtam以便检查所有用户?

回答

3

在19.01行,您为什么使用* LOVAL设置下限?对我来说,你最好用“USRID ... SETLL”服务,那应该能解决你的问题。当您SETLL时,您将光标定位到因子1中的值。当因子1为* LOVAL时,它将定位到文件的开头。

然后下一个(READE)操作检索当前位置/之后的记录,并将其键值与因子1中指定的键进行比较。由于您定位到文件的开头,因此READE将仅匹配文件中的第一个(最低阶)键,所以效果是只有最低的键才能起作用。

出于好奇,你为什么不以自由形式写作?比较/对比...

SETLL usrid USRTS ; 
READE usrid USRTS ; 
DOW Not %EOF(USRTS) ; 
    IF USRDT >= MIN ; 
     MAX = USRTO ; 
     MIN = USRDT ; 
    EndIF ; 
    READE usrid USRTS ; 
EndDO ; 
EndSR ; 
+0

这只会读取与USRID字段匹配的记录。仅当USRID更改时,%EOF才会打开。那是需要的吗? – 2012-07-30 22:53:15

+0

BTW,自由格式评论+1。 – 2012-07-30 22:53:41

+0

@david - 不确定这是否是所需要的(尽管它看起来像是基于内容)。我只模拟上面的代码。或者至少它看起来对我来说。 – Dennis 2012-07-31 23:25:12

0

如果要从文件中读取所有用户记录,请将READE更改为READ(并除去关键参数)。

+0

同意。帖子含糊不清。 – Dennis 2012-08-01 23:39:37