可扩展的子文件问题

时间:2017-09-15 14:28:58

标签: ibm-midrange rpgle

我编写了下面的可扩展子文件程序,其中似乎存在一个问题,一旦使用Position to feature定位到特定记录,它就无法正常工作。一旦显示器定位到特定记录,程序似乎不再检测到Pagedown / Page up按键。不知道为什么。如果未使用要素位置,则分页按预期工作。我不认为显示文件DDS存在问题,因此不会发布它。

HOPTION(*NODEBUGIO)
 FSFLTBL    IF   E           K DISK    Rename(SFLTBL:SFLTBLR)

 FSFLDSPF   CF   E             WorkStn SFILE(SFLRCD:RRN1)
 F                                     INFDS(INFO)

 DInfo             DS
 DCfKey                  369    369

 DExit             C                   Const(X'33')
 DCancel           C                   Const(X'3C')
 DEnter            C                   Const(X'F1')
 DRollUp           C                   Const(X'F5')
 DSflPag           C                   Const(15)

 DLstRrn           S              4  0 Inz(0)
 DI                S              4  0 Inz(0)

  /Free
     Exsr Clear_Subfile;
     Exsr Build_Subfile;

     Dou (*Inkc or *InKl);
       Write Footer;
       Exfmt SFLCTLRCD;
       Select;

         When (CfKey = Enter and Ptname <> *Blanks);
           Setll (PtName) Sfltbl;
           Exsr Clear_Subfile;
           Exsr Build_Subfile;
           Clear PtName;

         When (CfKey = Rollup and Not *In32);
           Exsr Build_Subfile;
       EndSl;



     EndDo;

     *Inlr = *On;

     BegSr Clear_Subfile;
       Rrn1   = *Zero;
       LstRrn = *Zero;
       *In31 = *On;
       Write SFLCTLRCD;
       *In32 = *Off;
       *In31 = *Off;
       *In90 = *Off;
     EndSr;

     BegSr Build_Subfile;

       Rrn1 = LstRrn;
       For i = 1 to SflPag;

         Read Sfltblr;
         If %Eof();
           *In90 = *On;
           Leave;
         Else;
           Rrn1 += 1;
           Write SFLRCD;
         EndIf;


       EndFor;
         If (Rrn1 > 0);
           *In32 = *Off;
         EndIf;

         LstRrn = Rrn1;
     EndSr;
  /End-Free

下面的DSPF DDS:

A*%%TS  SD  20170914  151431  THEJU112    REL-V5R3M0  5722-WDS                        
A*%%EC                                                                                
A                                      DSPSIZ(24 80 *DS3)                             
A                                      PRINT                                          
A                                      ERRSFL                                         
A                                      CA03                                           
A                                      CA12                                           
A          R SFLRCD                    SFL                                            
A            FNAME     R        O  5  2REFFLD(SFLTBL/FNAME *LIBL/SFLTBL)              
A            MNAME     R        O  5 24REFFLD(SFLTBL/FNAME *LIBL/SFLTBL)              
A            LNAME     R        O  5 46REFFLD(SFLTBL/FNAME *LIBL/SFLTBL)              
A          R SFLCTLRCD                 SFLCTL(SFLRCD)                                 
A*%%TS  SD  20170914  151431  THEJU112    REL-V5R3M0  5722-WDS                        
A                                      SFLSIZ(0016)                                   
A                                      SFLPAG(0015)                                   
A                                      OVERLAY                                        
A N32                                  SFLDSP                                         
A N31                                  SFLDSPCTL                                      
A  31                                  SFLCLR    
A  90                                  SFLEND(*SCRBAR *SCRBAR)
A                                      ALARM                  
A                                      ROLLUP                 
A            RRN1           4S 0H      SFLRCDNBR              
A                                  1  2USER                   
A                                  1 69DATE                   
A                                      EDTCDE(Y)              
A                                  2 69TIME                   
A                                  4  5'FIRST NAME'           
A                                      COLOR(BLU)             
A                                      DSPATR(UL)             
A                                      DSPATR(RI)             
A                                  4 28'MIDDLE NAME'          
A                                      COLOR(BLU)             
A                                      DSPATR(UL)             
A                                      DSPATR(RI)             
A                                  4 49'LAST NAME'            
A                                      COLOR(BLU)             
A                                      DSPATR(UL)             
A                                      DSPATR(RI)                  
A                                  1 24'EXPANDABLE SUBFILE'        
A                                      COLOR(RED)                  
A                                  3  6'Position To...'            
A            PTNAME        20   I  3 21                            
A          R FOOTER                                                
A                                 23  2'F3 = Exit'                 
A                                 23 16'F12 = Previous'                                                 

1 个答案:

答案 0 :(得分:0)

我认为您的问题的一部分是SFLRCDNBR设置为用于子文件IO操作RRN1的相对记录号的相同字段。因此,无论您做什么,当按下EnterPage Down时,子文件将始终重新定位到写入SFLRCD的最后一条记录。

好的,这是一个问题,但这是另一个问题:

When (CfKey = Enter and Ptname <> *Blanks);
  Setll (PtName) Sfltbl;
  Exsr Clear_Subfile;
  Exsr Build_Subfile;
  Clear PtName;

当您将子文件放在Ptname上时,您正在清除子文件,因此无需回滚。您应该通读子文件,直到找到正确的记录,然后将SFLRCDNBR字段设置为该值,而不是清除子文件。您可能还想在DDS中指定SFLRCDNBR(*TOP),并确保在该记录之后在子文件中有完整页面。

注意:SFLRCDNBR有时可能有点难以处理,因为它不能使用条件指示符,并且可能不是无效值(即它必须具有介于1和记录数之间的值。子文件)。因此,在每次写入子文件控制格式时,您需要确切地知道哪条记录需要是显示器上的第一个子文件记录(如果您使用的是*TOP),或者显示器上至少有一条记录。< / p>

您可以使用子过程在已加载的子文件中查找记录。可以使用CHAIN rrn读取子文件记录,其中rrn是相对记录号。因此,只要我知道有多少记录写入子文件,我就可以使用for循环遍历它们。一旦我找到了我要搜索的记录,我就从程序返回并传回我刚读过的记录号。这将是我在子文件中找到的记录的相对记录号。

dcl-proc FindNameInSubfile;
  dcl-pi *n Int(5) 
    PtName     Char(20) const;
  end-pi;

  dcl-ds sflds     LikeRec(sflrcd: *input) Inz;

  dcl-s ix    Int(5) Inz(0);

  for ix = 1 to maxrrn;
    chain ix sflrcd sflds;
    if sflds.lastname = PtName;
      return ix;
    endif;
  endfor;

  return -1;
end-proc;

如果找不到子文件记录,则此子过程返回-1。要使用此设置sflrcdnbr,您可能需要执行以下操作:

When (CfKey = Enter and Ptname <> *Blanks);
  sflrrn = FindNameInSubfile(Ptname);
  if sflrrn > 0;
    sflrcdnbr = sflrrn;
  endif;
  Ptname = '';

注意,sflrrn是定义为Int(5)的新工作字段,sflrcdnbr是附加到SFLRCDNBR DDS关键字的新字段(不是RRN1)。