1

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

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

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

我可以很好地获取用户在屏幕上单击的行/列,我的问题是当用户向下滚动 SFLBB、SFLCC 或 SFLDD 以说出第 75 个子文件记录然后他们单击该子文件时。我可以说他们点击了屏幕上的第 8 行(这将是 SFLBB 的第一行)——但我不能说这是 SFLBB 中的第 75 行记录。

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

我已经尝试过SFLCSRRRN,SFLRCDNBRSFLSCROLL各种组合,但无法为非活动子文件工作。

以下是来自的相关代码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
4

1 回答 1

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'

和角色扮演游戏:

 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 中的 row# 和 col#,它们看起来总是不错。看看这个测试代码(都名为 SOTEST)是否有相同的结果。如果此测试代码按预期运行,则生产代码中的问题可能不是行/列。如果此测试代码显示不正确的行/列号,请检查您的 PTF 级别。如果是当前的,请将其作为错误调用。

编辑:我误解了这个问题。仅当控制记录为 READ 时,RPG 才会从控制记录中填充 I/O 字段(如 SFLCSRRRN)。EXFMT 为 CTLAA 处理此问题。为了为其他控制记录处理它,请在您确定用户所在的子文件的计算中插入一个 READ 。

于 2013-08-26T18:42:11.137 回答