最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

12.9.Q.画面のカーソル位置の取りだし方を教えて下さい

[ Previous ] [ HOME ] [ Upper ] [ Next ]


ファイル情報データ構造から取りだす

AS/400 RPG/400 解説書

2.3.1.1 ファイル依存フィードバック情報

ファイル依存フィードバック情報の詳細な説明は、データ管理機能の手引きにあります。『入出力フィードバック域』の項およびその項のファイル依存域の一覧表を参照してください。

ファイル依存域のファイル情報データ構造(INFDS) のサブフィールドを指定する始めおよび終りの位置(入力仕様書の44 〜 47桁目および 48 〜 51桁目)を計算するためには、データ管理機能の手引き にあるオフセット、データ・タイプ、および長さを使用して、以下の計算を行います。

  • 始めの位置 = 367 + オフセット

  • 終りの位置 = 始めの位置 - 1 + 文字の長さ

  • 文字の長さ = 長さ(バイト数)

たとえば、サブファイル・レコードの相対レコード番号の場合には、データ管理機能の手引きから次のようになります。

オフセット = 9
データ・タイプは2進数です。
長さ = 2

したがって、

始めの位置 = 367 + 9 = 376、
終りの位置 = 376 - 1 + 2 = 377

データ管理バージョン 3

A.2.2 ICF ファイルおよび表示装置ファイルの入出力フィードバック域

表  A-5. ICF ファイルおよび表示装置ファイルの入出力フィードバック域 
オフセット データタイプ 長さ 内容 ファイル タイプ
3 文字 2 カーソル位置(行および桁)。データをプログラムに戻す サブファイル操作ではない入力操作で更新されます。たとえば、16 進 0102 は 1 行目の 2 桁目を意味し、10 行目の 33 桁目は 16 進数 0A21 になります。

表示装置

始めの位置 = 367 + オフセット = 367 + 3 = 370

終りの位置 = 始めの位置 - 1 + 文字の長さ = 370 - 1 + 2 = 371

これで、データ構造に指定すべき桁数が分かりました。

(14.22. ICF ファイルおよび表示装置ファイルの入出力フィードバック域を参考にして下さい。)

画面ファイル TESTDI          
A                                      CA03(03) 
A*-------------------------------------*        
A          R FMT01                              
A*-------------------------------------*       
A*                                               
A                                  7 36'LINE'     
A                                  7 45'COLUMN'   
A            V1LIN          3S 0O  8 36DSPATR(HI) 
A            V1COL          3S 0O  8 47DSPATR(HI) 
                         
RPGソースファイル TESTI          
      FTESTDI  CF  E                    WORKSTN                          
      F                                              KINFDS INFDS        
      I******************************************************            
      I*     D E F I N E    D A T A  - S T R U C T U R E    *            
      I******************************************************            
      IINFDS       DS                                                    
      I                                      370 371 LINCLM              
      I            DS                                                    
      I                                    B   1   20DSLIN               
      I                                        2   2 DSLINB              
      I            DS                                                    
      I                                    B   1   20DSCLM               
      I                                        2   2 DSCLMB              
      C******************************************************            
      C*             M A I N -  R O U T I N E               ;            
      C******************************************************            
 B001 C           *IN03     DOUEQ*ON                        :            
  001 C                     EXFMTFMT01                      :            
 B002 C           *IN03     IFEQ *OFF                       :            
  002 C                     Z-ADD0         DSLIN            :            
  002 C                     MOVELLINCLM    DSLINB           :            
  002 C                     Z-ADDDSLIN     V1LIN            :            
  002 C*                                                    :            
  002 C                     Z-ADD0         DSCLM            :            
  002 C                     MOVE LINCLM    DSCLMB           :            
  002 C                     Z-ADDDSCLM     V1COL            :            
  002 C*                                                    :            
 E002 C                     END                             ;            
 E001 C                     END                             ;            
      C*                                                    ;            
      C                     MOVE *ON       *INLR            ;            
      C                     RETRN                           ;            
                         

Z-ADD0をしっかりしている事を見て下さい。バイナリはソースで定義が2桁なら、プログラム内部では4桁のパックの数字になります。そのとき DS初期値のX40(ブランク)も数字に変換してしまいます。これをさけるために、*LOVALをセットしても良いのですが、どうせ数字なので、バイナリフィールドを0クリアした方がわかりやすいと、思います。

csr02.gif (5529 バイト)

右下のエミュレーションの出すカーソル位置に注目(11/033)ですね。これで、実行キーをたたくと、ファイル情報データ構造からカーソル位置を取りだします。

csr03.gif (5509 バイト)

尚、この機能は、ファイル情報データ構造の機能の一つです。画面ファイルも「装置ファイル」なので、そのファイルの情報を取り出せます。

RTNCSRLOCに付いて

カーソル位置を取りだす目的が、フィールドの割り出しならば、こちらが便利です。カーソル位置は分かりませんが、実行キーを押されたときのカーソルが置かれていたレコード様式やフィールド名や、フィールド内のカーソルの位置をもらえます。

画面ファイル TESTD
A                                      PRINT                       
A                                      INDARA                      
A                                      CA03(03)                  
A*-------------------------------------*                           
A          R FMT01                                                 
A*-------------------------------------*                           
A                                      RTNCSRLOC(*RECNAME &RCDNAM  
A                                      &CSRLOC)                    
A            FLDNAM        10A  H                                  
A            RCDNAM        10A  H                                  
A            CSRLOC         4S 0H                                  
A*                                                                 
A                                  7 36'LINE'                      
A                                  7 45'COLUMN'                    
A                                  8 24'INFDS ==>'                 
A            V1LIN          3S 0O  8 36DSPATR(HI)                  
A            V1COL          3S 0O  8 47DSPATR(HI)                  
A                                 10 20'RTNCSRLOC ==>'             
A            V1RCD         10A  O 10 36DSPATR(HI)                  
A            V1FLD         10A  O 10 47DSPATR(HI)                  
A            V1CSR          4S 0O 10 58DSPATR(HI)                  
RPGソース TEST
 FTESTD   CF  E                    WORKSTN                          
 F                                              KINFDS INFDS        
 I******************************************************            
 I*     D E F I N E    C O N S T A N T                 *            
 I******************************************************            
 I              X'33'                 C         F3                  
 I******************************************************            
 I*     D E F I N E    D A T A  - S T R U C T U R E    *            
 I******************************************************            
 IINFDS       DS                                                    
 I                                      369 369 PUSHED              
 I                                      370 371 LINCLM              
 I            DS                                                    
 I                                    B   1   20DSWRK               
 I                                        2   2 DSWRKB              
 C******************************************************            
 C*             M A I N -  R O U T I N E               ;            
 C******************************************************            
 C           *IN03     DOUEQ*ON                        :            
 C                     EXFMTFMT01                      :            
 C           *IN03     IFEQ *OFF                       :            
 C*                                                    :            
 C                     Z-ADD0         DSWRK            :            
 C                     MOVELLINCLM    DSWRKB           :            
 C                     Z-ADDDSWRK     V1LIN            :            
 C*                                                    :            
 C                     Z-ADD0         DSWRK            :            
 C                     MOVE LINCLM    DSWRKB           :            
 C                     Z-ADDDSWRK     V1COL            :            
 C*                                                    :            
 C                     MOVELRCDNAM    V1RCD            :            
 C                     MOVELFLDNAM    V1FLD            :            
 C                     Z-ADDCSRLOC    V1CSR            :            
 C*                                                    :            
 C                     END                             ;            
 C                     END                             ;            
 C*                                                    ;            
 C                     MOVE *ON       *INLR            ;            
 C                     RETRN                           ;           

先ほどのサンプルと違えて、わざと、DSWRKを一つでやってみました。勿論、行と桁を各々一個ずつ定義しても良いのです。(その方がきれいですね。)別に、このDSWRKやファイル情報データ構造は、RTNCSRLOCとは関係ないです。RTNCSRLOCを単独で使うことも勿論可能です。ここでは、比較したかったのです。

csr11.gif (8054 バイト)

csr12.gif (7759 バイト)

もう一度、呼び出して、今度はフィールドの存在しない場所にカーソルを移動して、実行キーを押して見ると、

csr13.gif (8187 バイト)

csr14.gif (8046 バイト)

となり、RTNCLSLOCでは何も戻ってきません。

また、上記サンプルのRTNCSRLOCは便利なので、知って置いた方がいいでしょう。実行キーを押すと、そのときカーソルの置かれていた、「レコード様式名」「フィールド名」「そのフィールドの左から何桁めか」を返してきます。上記のプログラムをコピーして、実行してみて下さい。また、サブファイルの上のカーソルの置かれていたサブファイルレコードの位置を取りだすのは、SFLCSRRRNがあります。

1999/7/11


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送