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他のすべての制御フォーマットは を介し​​て表示されます)。これまでのところ、サブファイルのどのレコードがクリックされたかを判断する方法がわかりませんでした。SFLAAEXFMT CTLAAWRITESFLBBSFLCCSFLDD

各サブファイルには最大 100 件のレコード (一度にすべて読み込まれる) が保持されるため、ユーザーがサブファイルをクリックする前にスクロールした可能性があります (おそらくそうです)。

「アクティブでない」サブファイルの 1 つをクリックした場合、ユーザーがクリックしたサブファイル レコードを特定するにはどうすればよいですか?

---- 編集開始 ----

ユーザーが画面上でクリックした行/列を取得できます。問題は、ユーザーが SFLBB、SFLCC、または SFLDD を下にスクロールして 75 番目のサブファイル レコードを表示し、そのサブファイルをクリックしたときです。画面の 8 行目 (これは SFLBB の最初の行になります) をクリックしたことはわかりますが、それが SFLBB のレコード 75 であることはわかりません。

---- 編集終了 ----

SFLCSRRRNSFLRCDNBR、およびをさまざまな組み合わせで試しまし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/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
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'

そして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 で行番号と列番号を確認すると、常に問題ないように見えます。このテスト コード (両方とも SOTEST という名前) で同じ結果が得られるかどうかを確認します。このテスト コードが期待どおりに実行される場合、製品コードの問題はおそらく行/列ではありません。このテスト コードで行番号と列番号が正しくない場合は、PTF レベルを確認してください。現在の場合は、バグとして呼び出します。

編集:私は問題を誤解しました。RPG は、制御レコードが READ の場合にのみ、制御レコードから入出力フィールド (SFLCSRRRN など) を埋めます。EXFMT は CTLAA に対してこれを処理します。他の制御レコードに対してそれを処理するには、ユーザーがどのサブファイルにいるかを判断した計算内に READ を挿入します。

于 2013-08-26T18:42:11.137 に答える