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