我编写了下面的可扩展子文件程序,其中似乎存在一个问题,一旦使用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'
答案 0 :(得分:0)
我认为您的问题的一部分是SFLRCDNBR
设置为用于子文件IO操作RRN1
的相对记录号的相同字段。因此,无论您做什么,当按下Enter
或Page 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)。