我有一个显示4个子文件的程序,与此类似:
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条记录(全部一次加载),因此用户可以(并且可能)在点击子文件之前滚动子文件。
如果用户点击其中一个“非活动”子文件,如何确定用户点击了哪个子文件记录?
----开始编辑----
我可以获得用户在屏幕上点击的位置的Row / Col,我的问题是当用户向下滚动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
答案 0 :(得分:1)
发布的代码有拼写错误(SFLBB覆盖了SFLAA)。我添加了一点胶水,使其编译并在IBM i 7.1上运行。我的机器是最新的PTF。按预期运行。这是完整的代码:
DDS:
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(03)
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
A SFLCSRRRN(&BRRN)
A 15 SFLDSP
A SFLDSPCTL
A N15 SFLCLR
A 16 SFLEND(*MORE)
A BRRN 5S 0H
A* Doesn't work BRRN2 5S 0H SFLSCROLL
A 8 2'SFLBB'
和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
我在调试中运行它并查看SELECT中的行#和col#,它们看起来总是正常。看看你的测试代码是否有相同的结果(都是名为SOTEST)。如果此测试代码按预期运行,则生产代码中的问题可能不是行/列。如果此测试代码显示错误的行/列编号,请检查您的PTF级别。如果是最新的,请将其称为错误。
编辑:我误解了这个问题。只有当控制记录为READ时,RPG才会从控制记录中填写I / O域(如SFLCSRRRN)。 EXFMT为CTLAA处理此问题。为了处理其他控制记录,在计算中插入一个READ,确定用户所在的子文件。