「知らない人は知らないが、知ってる人なら知っている」って感じで、今回からIBM iに関する知識の小ネタをお伝えしたいと思います。
第2回は知っていると便利な4つのTIPSです。
1 標識を使用せずに、画面項目の制御を行う
通常、画面項目の制御は 標識とDSPATR(XX)で行うが、標識が不足してしまうこともある。そんな時に、標識を使用せずに制御するには以下のような方法がある。
DDSの場合
1 2 3 4 5 6 7 |
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の場合
1 2 3 4 5 6 7 8 9 10 11 12 |
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フィールド値(無保護)
◎有効なPフィールド値
◎有効な P フィールド値(保護)
◎有効な P フィールド値
2 RPG内で異常終了が起こった場合、システムメッセージを表示させずに内部で処理する
通常、RPG内での異常終了(10進エラー等)は、システムメッセージが表示され、異常終了となるが、ユーザー側で独自の異常終了処理を行いたい場合がある。
そんなときはサブルーチン名を*PSSRで作成すれば、エラー時に*PSSRが自動的に呼び出され、独自の処理が可能となる。
1 2 3 4 5 6 7 8 9 10 11 12 |
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キーに指標を付けなかった場合、通常はスクロールされるが、サブルーチンを指定した場合はエラーとみなされる(標識のないページダウンキーが押された)。
1 2 3 4 5 6 7 8 9 10 |
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まであり、その内容を配列に格納したい場合は以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 営業所 コード |
物理ファイルとのリンクは、以下の方法で配列とのリンクが可能である。
1 2 3 |
0536.00 I*------------------------------------< 取扱部門 0537.00 I E DSXXXXXP00 0538.00 I 429 6240T#BU |
4 画面ファンクションKEYの標識に対して、*INKCや*IN03を使用せずに、標識の節約を行う
画面ファンクション標識は、*INKC形式で行うとソース上でわかりにくくなり、使い勝手もよくない。
また*IN03形式は、使い勝手はよいが、1~24までの標識を無駄使いしてしまう。
そこで使い勝手がよく、標識の無駄使いもなくしたい場合にはINFDSを利用する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
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つれづれ草
第4回 IBM iの小ネタシリーズ 第1回~画面(DSS)周りのカーソル制御