MENU

IBM iつれづれ草|IBM iの小ネタシリーズ 第2回~知っていると便利な4つの小ワザ(高橋昌宏)*IBM i

「知らない人は知らないが、知ってる人なら知っている」って感じで、今回からIBM iに関する知識の小ネタをお伝えしたいと思います。

第2回は知っていると便利な4つのTIPSです。

1 標識を使用せずに、画面項目の制御を行う

通常、画面項目の制御は 標識とDSPATR(XX)で行うが、標識が不足してしまうこともある。そんな時に、標識を使用せずに制御するには以下のような方法がある。

DDSの場合

0113.00 A            D1KIEN         2Y 0B  5  9TEXT('枝番 ')    
0114.00 A                                      CHECK(RB)             
0115.00 A                                      EDTCDE(Z)             
0116.00 A                                      DSPATR(UL)            
0117.00 A                                      DSPATR(&P1KIEN)       

0259.00 A            P1KIEN         1A  P      TEXT('枝番 ')     

RPGの場合

0136.00      I*==============================================================*					
0137.00      I*           デ  ー  タ  構  造                         *					
0138.00      I*==============================================================*					
0139.00      I* 固定値(表示属性 16 進 フィールド)                                		16進で定義
0140.00      I              X'24'                 C         P#CLR             		下線
0141.00      I              X'A0'                 C         P#PRO             		通常
0142.00      I              X'2A'                 C         P#ERR             		高輝度
					
0732.00      C                     MOVELP#PRO     P1KIEN            枝番        	
                  画面項目に16進をセットすればOK
0732.00      C                     MOVELP#CLR     P1KIEN            枝番   					
0732.00      C                     MOVELP#ERR     P1KIEN            枝番   					


表示属性の16進一覧 (マニュアルより抜粋)

AS/400 データ記述仕様書 V3
有効な P フィールド値

DSPATR のP フィールドは、次の表示属性をサポートしない。

表示属性   意味
MDT       表示時点での変更データ・タグのセット
OID     操作員識別
PC                   カーソル位置決め
SP                    ライト・ペン選択可能

◎有効なPフィールド値(無保護)

(C) Copyright IBM Corp. 1994, 1996 3.3.39.3 – 1

◎有効なPフィールド値

◎有効な P フィールド値(保護)

(C) Copyright IBM Corp. 1994, 1996 3.3.39.3 – 2

◎有効な P フィールド値

2 RPG内で異常終了が起こった場合、システムメッセージを表示させずに内部で処理する

通常、RPG内での異常終了(10進エラー等)は、システムメッセージが表示され、異常終了となるが、ユーザー側で独自の異常終了処理を行いたい場合がある。

そんなときはサブルーチン名を*PSSRで作成すれば、エラー時に*PSSRが自動的に呼び出され、独自の処理が可能となる。

0001.00      C*==============================================================*  	
0002.00      C*           アプリケーションプログラム異常終了処理  (オンライン)       	
0003.00      C*==============================================================*  	
0004.00      C           *PSSR     BEGSR                        サブルーチン名を*PSSRで定義する。
0005.00      C**-- メッセージ を 全社 サーバー へ送信する                             	
0006.00      C                     CALL 'SNEMSG'                                	
0007.00      C**-- ダンプ出力                                                   	
0008.00      C                     DUMP                                         	
0009.00      C**-- LR 標識 ON                                                   	
0010.00      C                     SETON                     LR    :LR 標識     	
0011.00      C**-- RETURN                                                       	
0012.00      C           \PSSR     ENDSR                                  

またファイルのエラーに関しては、個々に定義する必要がある。その場合は、個々のエラーサブルーチンを定義できる。

ただし画面に関しては、*PSSRの指定は避けたほうがよいかもしれない。通常では無視されている処理がエラーとみなされ、*PASSに飛ぶからだ。

たとえばROLLUPキーに指標を付けなかった場合、通常はスクロールされるが、サブルーチンを指定した場合はエラーとみなされる(標識のないページダウンキーが押された)。

0015.00      F*==============================================================*  
0016.00      F*           フ  ァ  イ  ル                                  
0017.00      F*==============================================================*  
0018.00      F**-- 画面ファイル                                                 
0019.00      FDSP01   CF  E                    WORKSTN      KINFSR *PSSR        
0020.00      F                                              KINFDS WINFDS       
0021.00      F**-- D/B更新ファイル                                           
0022.00      FTEMP01  O   E           K        DISK         KINFSR @SB01 A      
0023.00      F**-- D/B更新ファイル                                           
0024.00      FMMAA    IF  E                    DISK         KINFSR *PSSR      

上記の例では、TEMP01のファイルエラーは@SB01が呼び出される。

3 フィールドと配列と関連づける

たとえば、画面上に営業所コードが1~10まであり、その内容を配列に格納したい場合は以下のようになる。

0065.00      I**サブファイル 営業所 コード 配列定義                      						
0066.00      I                                        1  96 T#WHC 						
0067.00      I                                        1   4 D2WH01						
0068.00      I                                        5   8 D2WH02						
0069.00      I                                        9  12 D2WH03						
0070.00      I                                       13  16 D2WH04						
0071.00      I                                       17  20 D2WH05						
0072.00      I                                       21  24 D2WH06						
0073.00      I                                       25  28 D2WH07						
0074.00      I                                       29  32 D2WH08						
0075.00      I                                       33  36 D2WH09						
0076.00      I                                       37  40 D2WH10						
						
0030.00      E*==============================================================*						
0031.00      E*           テ ー ブ ル / 配 列                         *						
0032.00      E*==============================================================*						
0033.00      E*                                                               						
0034.00      E                    T#WHC      10  4                営業所 コード 

物理ファイルとのリンクは、以下の方法で配列とのリンクが可能である。

0536.00      I*------------------------------------<  取扱部門                       			
0537.00      I          E DSXXXXXP00                                                 					
0538.00    I                                      429 6240T#BU   

4 画面ファンクションKEYの標識に対して、*INKCや*IN03を使用せずに、標識の節約を行う

画面ファンクション標識は、*INKC形式で行うとソース上でわかりにくくなり、使い勝手もよくない。
また*IN03形式は、使い勝手はよいが、1~24までの標識を無駄使いしてしまう。

そこで使い勝手がよく、標識の無駄使いもなくしたい場合にはINFDSを利用する。

0014.00      I**--ファンクション 戻り値定義                                    
0015.00      I              X'31'                 C         F01         
0016.00      I              X'32'                 C         F02         
0017.00      I              X'33'                 C         F03         
0018.00      I              X'34'                 C         F04         
0019.00      I              X'35'                 C         F05         
0020.00      I              X'36'                 C         F06         
0021.00      I              X'37'                 C         F07         
0022.00      I              X'38'                 C         F08         
0023.00      I              X'39'                 C         F09         
0024.00      I              X'3A'                 C         F10         
0025.00      I              X'3B'                 C         F11         
0026.00      I              X'3C'                 C         F12         
0027.00      I              X'B1'                 C         F13         
0028.00      I              X'B2'                 C         F14         
0029.00      I              X'B3'                 C         F15         
0030.00      I              X'B4'                 C         F16         
0031.00      I              X'B5'                 C         F17                 
0032.00      I              X'B6'                 C         F18                 
0033.00      I              X'B7'                 C         F19                 
0034.00      I              X'B8'                 C         F20                 
0035.00      I              X'B9'                 C         F21                 
0036.00      I              X'BA'                 C         F22                 
0037.00      I              X'BB'                 C         F23                 
0038.00      I              X'BC'                 C         F24                 
0039.00      I              X'F1'                 C         ENTER               
0040.00      I              X'F4'                 C         ROLLDN              
0041.00      I              X'F5'                 C         ROLLUP              

0045.00      IWINFDS      DS                                                   
0046.00      I                                        1   8 W#DSID             
0047.00      I                                      369 369 W#FUNK             
0048.00      I                                    B 370 3710W#CSL              
0049.00      I                                      370 370 W#LIN1             
0050.00      I                                      371 371 W#COL1             
0051.00      I                                    B 378 3790TPRRN              

0353.00      C**-- アテンション 判定                                     
0354.00      C                     SELEC                           
SOSI         C           W#FUNK    WHEQ F01                        
0356.00      C                     EXSR @D1CLR                     
0357.00      C                     EXSR @D1OFF                     
0358.00      C           W#FUNK    WHEQ F03                        
0359.00      C                     MOVEL'END'     W#CTL     P      
0360.00      C                     MOVEL'PF03'    E#0090           
0361.00      C           W#FUNK    WHEQ F05                        
0362.00      C                     EXSR @D1CLR                     
0363.00      C                     OTHER                           
SOSI         C                     EXSR @D1ENT                     
0365.00      C                     ENDSL     

今回は以上となります。

1つでも、「こんなことできるんだ~~」って思えることがあればうれしいです。

今後も小ネタシリーズとして、いろいろとお伝えできればと思います。ありがとうございました。


IBM iつれづれ草

第1回 フリーフォームRPG!!

第2回 SQLをお勧めする4つの理由

第3回 SQLの索引アドバイザー

第4回 IBM iの小ネタシリーズ 第1回~画面(DSS)周りのカーソル制御

 

新着