Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ibm midrange 获取非活动子文件的子文件记录编号_Ibm Midrange_Rpgle - Fatal编程技术网

Ibm midrange 获取非活动子文件的子文件记录编号

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-------------------------

我有一个程序,它显示了与此类似的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条记录(一次加载所有记录),因此用户有可能(而且很可能)在单击子文件之前滚动这些记录

如果用户单击其中一个“非活动”子文件,我如何确定他们单击了哪个子文件记录?

----开始编辑----

我可以很好地获得用户在屏幕上单击的行/列,我的问题是当用户向下滚动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,然后单击