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

时间:2013-08-26 14:06:04

标签: ibm-midrange rpgle

我有一个显示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显示)。到目前为止,我还没有弄清楚如何确定哪个子文件的记录是SFLBBSFLCCSFLDD

每个子文件最多可容纳约100条记录(全部一次加载),因此用户可以(并且可能)在点击子文件之前滚动子文件。

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

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

我可以获得用户在屏幕上点击的位置的Row / Col,我的问题是当用户向下滚动SFLBB,SFLCC或SFLDD以说出第75个子文件记录然后他们点击该子文件。我可以告诉他们点击了屏幕上的第8行(这将是SFLBB的第一行) - 但我无法分辨SFLBB中的记录75.

----结束编辑----

我尝试了各种组合中的SFLCSRRRNSFLRCDNBRSFLSCROLL,但却无法获得任何可用于非活动子文件的内容。

以下是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/CTLCCSFLDD/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

1 个答案:

答案 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,确定用户所在的子文件。