Ibm midrange 获取非活动子文件的子文件记录编号
我有一个程序,它显示了与此类似的4个子文件:Ibm midrange 获取非活动子文件的子文件记录编号,ibm-midrange,rpgle,Ibm Midrange,Rpgle,我有一个程序,它显示了与此类似的4个子文件: COL1 COL2 COL3 SFLAA----------------------------| 1 9999 9999 9999 2 9999 9999 9999 3 9999 9999 9999 *More... SFLBB-------------------------
COL1 COL2 COL3
SFLAA----------------------------|
1 9999 9999 9999
2 9999 9999 9999
3 9999 9999 9999
*More...
SFLBB----------------------------|
1 9999 9999 9999
2 9999 9999 9999
3 9999 9999 9999
*More...
SFLCC----------------------------|
1 9999 9999 9999
2 9999 9999 9999
3 9999 9999 9999
*More...
SFLDD----------------------------|
1 9999 9999 9999
2 9999 9999 9999
3 9999 9999 9999
*More...
这些子文件显示各种类型的摘要信息,用户希望能够单击这些摘要编号中的任何一个,并“深入”到基础详细信息。为了做到这一点,我必须知道他们单击了哪个子文件中的哪个记录
我正在从INFDS
检索光标位置,因此当用户单击屏幕时,我知道他们正在单击哪个子文件(因为我知道他们单击的是哪一行)
SFLCSRRRN
关键字对于SFLAA
子文件非常有效,因为它是“活动”子文件(程序执行EXFMT CTLAA
,所有其他控制格式通过WRITE
显示)。到目前为止,我还无法确定如果子文件的记录是SFLBB
、SFLCC
或SFLDD
,如何确定单击了哪个记录
每个子文件最多可保存约100条记录(一次加载所有记录),因此用户有可能(而且很可能)在单击子文件之前滚动这些记录
如果用户单击其中一个“非活动”子文件,我如何确定他们单击了哪个子文件记录?
----开始编辑----
我可以很好地获得用户在屏幕上单击的行/列,我的问题是当用户向下滚动SFLBB、SFLCC或SFLDD以显示第75个子文件记录,然后单击该子文件时。我可以说他们点击了屏幕上的第8行(这将是SFLBB的第一行),但我不能说这是SFLBB的记录75
----结束编辑----
我尝试了各种组合的SFLCSRRRN
、SFLRCDNBR
和SFLSCROLL
,但无法为非活动子文件提供任何有用的功能
以下是来自DSPF的相关代码:
A DSPSIZ(24 80 *DS3)
A MOUBTN(*ULP CF06)
A R SFLAA SFL
A RRN1 4Y 0O 4 11EDTCDE(Z)
A R CTLAA SFLCTL(SFLAA)
A SFLSIZ(9999)
A SFLPAG(0003)
A CF03
A OVERLAY
A SFLCSRRRN(&ARRN)
A 10 SFLDSP
A SFLDSPCTL
A N10 SFLCLR
A 11 SFLEND(*MORE)
A ARRN 5S 0H
A 3 2'SFLAA'
A R SFLBB SFL
A RRN2 4Y 0O 9 11EDTCDE(Z)
A R CTLBB SFLCTL(SFLBB)
A SFLSIZ(9999)
A SFLPAG(0003)
A OVERLAY
A* Doesn't work SFLCSRRRN(&BRRN)
A 15 SFLDSP
A SFLDSPCTL
A N15 SFLCLR
A 16 SFLEND(*MORE)
A* Doesn't work BRRN 5S 0H
A* Doesn't work BRRN2 5S 0H SFLSCROLL
A 8 2'SFLBB'
子文件和控制记录SFLCC/CTLCC
和SFLDD/CTLDD
在逻辑上与SFLBB/CTLBB
相同,因此我省略了它们
相关RPGLE代码:
ftestd cf e workstn sfile(sflaa: rrn1)
f sfile(sflbb: rrn2)
f sfile(sflcc: rrn3)
f sfile(sfldd: rrn4)
f infds(cusloc)
...
dcusloc ds
d rowcol 370 371b 0
...
drrn1 s 4 0 inz(0)
drrn2 s 4 0 inz(0)
drrn3 s 4 0 inz(0)
drrn4 s 4 0 inz(0)
...
c/free
...
begsr mouse_sr;
row# = rowcol / 256;
col# = %rem(rowcol: 256);
select;
when row# >= 4 and row# <= 6;
chain arrn sflaa;
if %found();
exsr detail1_sr;
endif;
when row# >= 9 and row# <= 11;
chain brrn sflbb;
if %found();
exsr detail2_sr;
endif;
when row# >= 14 and row# <= 16;
chain crrn sflcc;
if %found();
exsr detail3_sr;
endif;
when row# >= 19 and row# <= 21;
chain drrn sfldd;
if %found();
exsr detail4_sr;
endif;
endsl;
endsr;
...
c/end-free
ftestd cf e工作文件(sflaa:rrn1)
f sfile(sflbb:rrn2)
f sfile(sflcc:rrn3)
f sfile(sfldd:rrn4)
f infds(cusloc)
...
dcusloc ds
d rowcol 370 371b 0
...
drrn1 s 4 0英寸(0)
drrn2 s 4 0英寸(0)
drrn3 s 4 0英寸(0)
drrn4 s 4 0英寸(0)
...
免费的
...
begsr小鼠;
行#=行COL/256;
列#=%rem(行列:256);
选择;
当第4行、第9行、第14行、第19行和第行时,发布的代码有一个拼写错误(SFLBB覆盖SFLAA)。我添加了一点胶水使其能够编译并在IBMi7.1上运行。我的机器目前有PTFs。按预期运行。以下是完整的代码:
DDS:
和RPG:
fsotest cf e workstn sfile(sflaa: rrn1)
f sfile(sflbb: rrn2)
f infds(cusloc)
dcusloc ds
d rowcol 370 371b 0
drow# s 10i 0 inz(0)
dcol# s 10i 0 inz(0)
c/free
*in10 = *off; // SFLDSP AA
*in15 = *off; // SFLDSP BB
write ctlbb;
write ctlaa;
*in10 = *on; // SFLDSP AA
*in15 = *on; // SFLDSP BB
for rrn1 = 1 to 5;
rrn2 = rrn1;
write sflaa;
write sflbb;
endfor;
dow 1=1;
write ctlbb;
exfmt ctlaa;
if *in03;
*inlr = *on;
leave;
endif;
exsr mouse_sr;
enddo;
begsr mouse_sr;
row# = rowcol / 256;
col# = %rem(rowcol: 256);
select;
when row# >= 4 and row# <= 6;
chain arrn sflaa;
if %found();
// exsr detail1_sr;
endif;
when row# >= 9 and row# <= 11;
ADD THE FOLLOWING LINE
read ctlbb; // to get SFLRRN
chain brrn sflbb;
if %found();
// exsr detail2_sr;
endif;
endsl;
endsr;
/end-free
fsotest cf e worktn sfile(sflaa:rrn1)
f sfile(sflbb:rrn2)
f infds(cusloc)
dcusloc ds
d rowcol 370 371b 0
卓尔的10i0英寸(0)
dcol#s 10i 0 inz(0)
免费的
*in10=*关;//SFLDSP AA
*in15=*关闭;//SFLDSP BB
写ctlbb;
写ctlaa;
*in10=*on;//SFLDSP AA
*in15=*on;//SFLDSP BB
对于rrn1=1到5;
rrn2=rrn1;
编写sflaa;
编写sflbb;
endfor;
道指1=1;
写ctlbb;
exfmt-ctlaa;
如果*in03;
*inlr=*on;
离开
endif;
exsr小鼠;
enddo;
begsr小鼠;
行#=行COL/256;
列#=%rem(行列:256);
选择;
当第#>=4行、第#=9行和第#行发布的代码有一个拼写错误(SFLBB覆盖SFLAA)。我添加了一点胶水使其能够编译并在IBMi7.1上运行。我的机器目前有PTFs。按预期运行。以下是完整的代码:
DDS:
和RPG:
fsotest cf e workstn sfile(sflaa: rrn1)
f sfile(sflbb: rrn2)
f infds(cusloc)
dcusloc ds
d rowcol 370 371b 0
drow# s 10i 0 inz(0)
dcol# s 10i 0 inz(0)
c/free
*in10 = *off; // SFLDSP AA
*in15 = *off; // SFLDSP BB
write ctlbb;
write ctlaa;
*in10 = *on; // SFLDSP AA
*in15 = *on; // SFLDSP BB
for rrn1 = 1 to 5;
rrn2 = rrn1;
write sflaa;
write sflbb;
endfor;
dow 1=1;
write ctlbb;
exfmt ctlaa;
if *in03;
*inlr = *on;
leave;
endif;
exsr mouse_sr;
enddo;
begsr mouse_sr;
row# = rowcol / 256;
col# = %rem(rowcol: 256);
select;
when row# >= 4 and row# <= 6;
chain arrn sflaa;
if %found();
// exsr detail1_sr;
endif;
when row# >= 9 and row# <= 11;
ADD THE FOLLOWING LINE
read ctlbb; // to get SFLRRN
chain brrn sflbb;
if %found();
// exsr detail2_sr;
endif;
endsl;
endsr;
/end-free
fsotest cf e worktn sfile(sflaa:rrn1)
f sfile(sflbb:rrn2)
f infds(cusloc)
dcusloc ds
d rowcol 370 371b 0
卓尔的10i0英寸(0)
dcol#s 10i 0 inz(0)
免费的
*in10=*关;//SFLDSP AA
*in15=*关闭;//SFLDSP BB
写ctlbb;
写ctlaa;
*in10=*on;//SFLDSP AA
*in15=*on;//SFLDSP BB
对于rrn1=1到5;
rrn2=rrn1;
编写sflaa;
编写sflbb;
endfor;
道指1=1;
写ctlbb;
exfmt-ctlaa;
如果*in03;
*inlr=*on;
离开
endif;
exsr小鼠;
enddo;
begsr小鼠;
行#=行COL/256;
列#=%rem(行列:256);
选择;
当第4排、第9排和第3排的时候,对不起,巴克,我没能把我的问题转达出来。获取行/列运行良好。我的问题是,用户将SFLBB/CC/DD滚动到(例如)子文件记录75,然后单击该子文件。我可以告诉用户点击了屏幕的X行(我们会说是在SFLBB中),但我无法确定当前显示的是哪个子文件记录。对不起,Benny,我的错误不是你的。请参阅我的编辑。需要读取控制记录格式才能获取其中的I/O字段(如SFLCSRRRN)。谢谢Buck,就是这样。在阅读您的评论后,我突然想到,我曾经遇到过类似的问题,但我忘记了我需要阅读其他控制记录。谢谢你的帮助!对不起,巴克,我没能表达我的问题。获取行/列运行良好。我的问题是,用户将SFLBB/CC/DD滚动到(例如)子文件记录75,然后单击