Ibm midrange 可扩展子文件问题

Ibm midrange 可扩展子文件问题,ibm-midrange,rpgle,Ibm Midrange,Rpgle,我编写了下面的可扩展子文件程序,其中似乎存在一个问题,即一旦使用“定位到”功能定位到特定记录,它就无法正常工作。一旦显示器定位到特定记录,程序似乎不再检测到向下翻页/向上翻页按键。不知道为什么。如果未使用“定位到”功能,分页将按预期工作。我不认为显示文件DDS有问题,因此没有发布它 HOPTION(*NODEBUGIO) FSFLTBL IF E K DISK Rename(SFLTBL:SFLTBLR) FSFLDSPF CF E

我编写了下面的可扩展子文件程序,其中似乎存在一个问题,即一旦使用“定位到”功能定位到特定记录,它就无法正常工作。一旦显示器定位到特定记录,程序似乎不再检测到向下翻页/向上翻页按键。不知道为什么。如果未使用“定位到”功能,分页将按预期工作。我不认为显示文件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

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

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

When (CfKey = Enter and Ptname <> *Blanks);
  Setll (PtName) Sfltbl;
  Exsr Clear_Subfile;
  Exsr Build_Subfile;
  Clear PtName;
如果未找到子文件记录,则此子过程返回-1。要使用此设置
sflrcdnbr
,您需要执行以下操作:

When (CfKey = Enter and Ptname <> *Blanks);
  sflrrn = FindNameInSubfile(Ptname);
  if sflrrn > 0;
    sflrcdnbr = sflrrn;
  endif;
  Ptname = '';
When(CfKey=输入,Ptname*空白);
sflrrn=FindNameInSubfile(Ptname);
如果sflrrn>0;
sflrcdnbr=sflrrn;
endif;
Ptname='';

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

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

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

When (CfKey = Enter and Ptname <> *Blanks);
  Setll (PtName) Sfltbl;
  Exsr Clear_Subfile;
  Exsr Build_Subfile;
  Clear PtName;
如果未找到子文件记录,则此子过程返回-1。要使用此设置
sflrcdnbr
,您需要执行以下操作:

When (CfKey = Enter and Ptname <> *Blanks);
  sflrrn = FindNameInSubfile(Ptname);
  if sflrrn > 0;
    sflrcdnbr = sflrrn;
  endif;
  Ptname = '';
When(CfKey=输入,Ptname*空白);
sflrrn=FindNameInSubfile(Ptname);
如果sflrrn>0;
sflrcdnbr=sflrrn;
endif;
Ptname='';

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

需要DDS来理解指示器。您所说的“程序似乎没有检测到向下翻页/向上翻页按键”是什么意思?您是否试图滚动到子文件的末尾?Pagedown/Page up不会导致终端返回到程序,除非它位于子文件的末尾,并且您已指定关键字。DDS现在已包括在内。我的意思是,一旦我定位到一个特定的记录,按Page up应该会显示右侧子文件的顶部?在这种情况下,控件不会返回到程序,因为没有ROLLDOWN关键字,但操作系统不应该这样做吗?另外,假设我从下面的某个地方定位到最上面的记录,向下翻页似乎不起作用。在这种情况下,我希望控件返回到程序。但事实并非如此。您说过“一旦显示器定位到特定记录,程序似乎无法检测到向下/向上翻页键”。但是我在RPG源代码中没有看到子文件的明确定位。您能解释一下“显示器定位后”是什么意思吗?需要DDS来理解指示灯。您所说的“程序似乎没有检测到向下翻页/向上翻页按键”是什么意思?您是否试图滚动到子文件的末尾?Pagedown/Page up不会导致终端返回到程序,除非它位于子文件的末尾,并且您已指定关键字。DDS现在已包括在内。我的意思是,一旦我定位到一个特定的记录,按Page up应该会显示右侧子文件的顶部?在这种情况下,控件不会返回到程序,因为没有ROLLDOWN关键字,但操作系统不应该这样做吗?另外,假设我从下面的某个地方定位到最上面的记录,向下翻页似乎不起作用。在这种情况下,我希望控件返回到程序。但事实并非如此。您说过“一旦显示器定位到特定记录,程序似乎无法检测到向下/向上翻页键”。但是我在RPG源代码中没有看到子文件的明确定位。您能解释一下“显示器定位后”是什么意思吗?您好,Murph,我正试图通过一个SQL将所需记录的行号插入到SFLRCDNBR字段中,使用上面的行号(按lname排序)。从sfltbl(其中lname=:Ptname)中选择行号()到:Rrn1 OVER(按lname排序)。但这不起作用。您能在这里给我介绍一下吗?您是在加载子文件时还是在加载子文件后执行此操作?我不会使用DB表来确定记录在子文件中的位置。我将通读该子文件,以确定包含您正在查找的记录的子文件rrn。加载该子文件后,以及当用户尝试定位到特定记录时。不确定如何读取子文件。我还没做过这样的事。但是如果能够理解如何使用ROW_NUMBER()函数
ROW_NUMBER
与子文件无关,因为它是一个SQL函数,那就太好了。无法使用SQL读取子文件。我添加到答案中的
findnameinsbfile()
过程读取了子文件。嗨,马克,非常感谢您的回复。我就快到了,但我做的事情和你描述的略有不同。我不明白如何将sflrcdnbr与sflrcdnbr DDS关键字相关联。因此,如果找到具有匹配键的记录,子过程返回的值将直接分配给Rrn1。此外,调用子过程之前的Rrn1值保存在savrrn变量中。如果未找到匹配项,则将Rrn1设置为该值。我必须这样做,因为每个连锁经营内的