Получить номер записи подфайла для неактивных подфайлов

У меня есть программа, которая отображает 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), но я не могу сказать, что это запись 75 в SFLBB.

---- КОНЕЦ РЕДАКТИРОВАНИЯ ----

Я пробовал 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

person Benny Hill    schedule 26.08.2013    source источник


Ответы (1)


В опубликованном коде была опечатка (SFLBB наложен на SFLAA). Я добавил немного клея, чтобы он скомпилировался, и запустил его на IBM i 7.1. Моя машина тока с ПТФ. Работает, как и ожидалось. Вот полный код:

ДДС:

 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, и они всегда выглядят нормально. Посмотрите, будут ли у вас одинаковые результаты с этим тестовым кодом (оба названы SOTEST). Если этот тестовый код работает должным образом, проблема в производственном коде, вероятно, не связана со строкой/столбцом. Если в этом тестовом коде указаны неправильные номера строк/столбцов, проверьте уровни PTF. Если актуально, назовите это ошибкой.

EDIT: я неправильно понял проблему. RPG будет заполнять поля ввода-вывода (например, SFLCSRRRN) из управляющей записи только тогда, когда управляющая запись находится в состоянии READ. EXFMT обрабатывает это для CTLAA. Чтобы обработать его для других контрольных записей, вставьте READ внутрь вычислений, где вы определили, в каком подфайле находится пользователь.

person Buck Calabro    schedule 26.08.2013
comment
Извини, Бак, я не смог передать свою проблему. Получение строки/столбца работает нормально. Моя проблема заключается в том, что пользователь прокручивает SFLBB/CC/DD до (например) записи подфайла 75, а затем щелкает подфайл. Я могу сказать, что пользователь щелкнул строку X экрана (которая, как мы скажем, находится в SFLBB), но я не могу определить, какая запись подфайла отображается в данный момент. - person Benny Hill; 27.08.2013
comment
Извини, Бенни, моя ошибка, а не твоя. Смотрите мою правку. Нужно ПРОЧИТАТЬ формат контрольной записи, чтобы получить в нем поля ввода-вывода (например, SFLCSRRRN). - person Buck Calabro; 27.08.2013
comment
Спасибо, Бак, так оно и было. После прочтения вашего комментария мне пришло в голову, что я уже однажды сталкивался с подобной проблемой, но забыл, что мне нужно ПРОЧИТАТЬ другие контрольные записи. Цените помощь! - person Benny Hill; 27.08.2013