2013-08-26 43 views
1

我有同樣顯示4子文件到該程序:獲取文件記錄數量的非活躍子文件(S)

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

每個子文件最多可容納約100條記錄(全部一次加載),因此用戶在點擊子文件之前可能(有可能)滾動子文件。

如何判斷用戶點擊哪個子文件記錄,如果他們點擊其中一個「非活動」子文件?

---- BEGIN編輯----

我可以得到行/用戶點擊屏幕上就好了,其中山口,我的問題是當用戶滾動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 

回答

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 

我在調試運行它,看看行號和列#在選擇,他們總是看行。看看你是否與這個測試代碼有相同的結果(都命名爲SOTEST)。如果此測試代碼按預期運行,則生產代碼中的問題可能不是行/列。如果此測試代碼顯示不正確的行/列號,請檢查您的PTF級別。如果當前,請將其作爲錯誤進行調用。

編輯:我誤解了這個問題。只有在控制記錄爲READ時,RPG纔會從控制記錄填入I/O域(如SFLCSRRRN)。 EXFMT爲CTLAA處理這個問題。爲了對其他控制記錄進行處理,在計算中插入一個READ,用於確定用戶所在的子文件。

+0

對不起巴克,我沒有表達出我的問題。獲取行/列工作正常。我的問題是,當用戶滾動SFLBB/CC/DD到(例如)子文件記錄75,然後點擊子文件。我可以告訴用戶點擊了屏幕的X行(我們會說在SFLBB中),但我無法確定當前顯示哪個子文件記錄。 –

+0

對不起本尼,我的錯誤不是你的。看我的編輯。需要讀取控制記錄格式才能獲取I/O域(如SFLCSRRRN)。 –

+0

謝謝巴克,就是這樣。閱讀你的評論後,我發現我曾經遇到過類似的問題,但忘記了我需要閱讀其他控制記錄。感謝幫助! –