020-040 画面エントリー系その１

## 本記事の内容とサンプルコード

本記事では、「単票形式の画面プログラム」の解説を行う。
IBM i 上に QEOLFF 環境が存在する場合は`/QEOLFF/QRPGLESRC/IPL010@YU2.RPGLE` を、環境がない場合でもサンプルコードは次のURLより取得、閲覧可能である。

■例で使用するサンプルコード
- [ 品目マスタ照会（ＦＦ - /QEOLFF/QRPGLESRC/IPL010@YU2.RPGLE](https://github.com/IBMCJ-2023-C06/020-FF_RPG_samples/blob/main/QRPGLESRC/IPL010%40YU2.RPGLE)
- [ 品目マスタ照会（画面装置 - /QEOLFF/QDSPSRC/IPL010D.DSPF](https://github.com/IBMCJ-2023-C06/020-FF_RPG_samples/blob/main/QDSPSRC/IPL010D.DSPF)

---

■表示イメージ
![040-010-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520639/cdc200e9-9180-5852-26da-741a17550e86.png)

## 前提条件

以下のリンクより、本コンテンツの **FF-RPG** サンプルコードを閲覧、実行する環境を整備する

- [010-前提条件／環境構築](https://qiita.com/ibm_knowledge_mall/items/0536889104b90990e074)
- [前回の記事）032-帳票系プログラムその３（SQLを用いた応用](https://qiita.com/ibm_knowledge_mall/items/c1da675e50b13347b331)

## 参考リンク

以下、リンクは OS バージョンが **V7R5** のリンク先となっているが、サイト左の **「バージョンの変更」** より、自身の環境に合ったバージョンへ変更可能。

- [IBM i - ILE RPG 解説書(V7R5)](https://www.ibm.com/docs/ja/i/7.5?topic=rpg-ile-reference)
- [IBM i - DDS 表示装置ファイル](https://www.ibm.com/docs/ja/i/7.5?topic=dds-display-files)
- [ＦＦで許可されていない記述集１（ＦＦ - /QEOLFF/QRPGLESRC/@USHIDAY11.RPGLE](https://github.com/IBMCJ-2023-C06/020-FF_RPG_samples/blob/main/QRPGLESRC/%40USHIDAY11.RPGLE)

## 画面における固定形式と自由形式の違い

これまで帳票系の自由形式について、解説をしてきたが、画面系だからといって、特にコーディングや学習内容に差異はない。固定形式と自由形式の差異という意味ではこれまでの解説で十分であろう。
むしろ違いは、帳票系の基本的なプログラム構造と画面系の基本的なプログラム構造の違いによるところの方が大きい。帳票系は処理が **「上から下へ流れる制御」** 、画面系は処理が **「キー入力イベントによる制御」** と基本構造が異なる。帳票と同様にこれらは、制作者や会社によって流儀が異なり、文化上どの様なプログラム構造を好むかによって、コーディングが大きく異なるが、本サンプル `/QEOLFF/QRPGLESRC/IPL010@YU2.RPGLE` は `QEOL/QEOLRPGLE.IPL010.RPGLE` をベースに作成されている。

自由形式とは関係ないが、幾つか実装方法等が異なる点を次にあげておく。

## QEOLサンプルとの相違点

1. 自由形式で作られいている
2. 名前付き画面標識を使用している
3. PageUp/PageDown機能を追加している

「1.」については、言わずもがなであるが、「2.」については次のセクションのコーディングをする事により、通常の `*IN` 標識を可読性の良い名前付き標識に置き換える事が出来る。「3.」は実際に使用してみると良いだろう。

### 2. 名前付き標識の使用方法

■名前付き標識(画面設定)
```DSPF:IPL010D.DSPF
     A*****************************************************************
     A**         品目マスター照会画面                              **
     A**          DISPLAY FILE(NAME---IPL010D)                       **
     A*****************************************************************
     A                                      PRINT
     A                                      CF03(03 '終了')
     A                                      INDARA
```

■名前付き標識(RPG)
```RPGLE:IPL010@YU2.RPGLE
//   F*画面装置
DCL-F    IPL010D       WORKSTN  INDDS(DSP_PF    )                            ;
DCL-DS DSP_PF                                                             ;
  F03         IND POS(03)     ;
  F12         IND POS(12)     ;
  PAGEUP      IND POS(33)     ;
  PAGEDOWN    IND POS(34)     ;
  ERR60       IND POS(60)     ;
  ERR61       IND POS(61)     ;
END-DS                                                                    ;

～～～中略～～～

//   C*-***************************************************************
//   C*-* @HED        画面処理（見出し                             **
//   C*-***************************************************************
BEGSR @HED                                  ;

     WRITE PANEL03                                   ;
     EXFMT PANEL01                                   ;
     ERR61  = *OFF       ;

     IF  F03   = *ON                   ;
       W#CTL   = 'END'                                 ;    //画面制御
       LEAVESR                                         ;
     ENDIF                                  ;

  //前を取得
     IF  PAGEUP     = *ON              ;
       EXSR @UP                                        ;
       LEAVESR                                         ;
     ENDIF                                  ;
```

1. 画面ファイルに機能 `INDARA` 標識域を設定し **名前付き標識** を使用可能状態にする
2. RPGのファイルステートメントのキーワード `INDDS` で **名前付き標識** のデータ構造 `DSP_PF` に割り当てる
3. `PAGEUP IND POS(33)` **名前付き標識** `PAGEUP` に `*IN33` を割り当てる

上記は、`*IN33` と意味を持たいない標識名から、意味を持つ `PAGEUP` とう名前付き標識に割当をして、RPG で使用する例である。
この様にする事で実際に割り当てる番号は「01～99」の何番でもよくなり、可読性が向上する。
例えば、よくある開発ルールで、次の様ケースだと考察してみる。

- *IN60 : 画面全体エラー
- *IN61～69 : 入力項目1～9のエラー

上記のルールで __「入力項目が追加となりチェック用の標識が1つ必要。*IN70以降は他に既に使用されているため、空いている *IN47 を割り当てる」__ となった場合、入力順と標識の順序が一致せず見通しや可読性が低下する。その際に **名前付き標識** であれば番号に意味を持たせる必要がなく対応出来る。

例） `*IN47` ： 品番エラー
```RPGLE:番号標識
// 品番エラー
IF IN_HNCD <= *ZERO ;
  *IN47 = *ON ;
ENDIF ;
```

例） `ERRHNCD` ： 品番エラー
```RPGLE:名前付き標識標識 
DCL-DS DSP_PF                                                             ;
  F03         IND POS(03)     ;
  ～～～中略～～～
  ERRHNCD     IND POS(47)     ;
END-DS       

～～～中略～～～

// 品番エラー
IF IN_HNCD <= *ZERO ;
  ERRHNCD = *ON ;
ENDIF ;
```

## 本サンプルの参考リンク

ここでは本サンプルで使用された技術の参考リンクを掲載する。

■参考リンク
- [表示装置ファイルの INDARA (標識域) キーワード](https://www.ibm.com/docs/ja/i/7.5?topic=80-indara-indicator-area-keyword-display-files)
- [INDDS (データ構造名)](https://www.ibm.com/docs/ja/i/7.5?topic=keywords-inddsdata-structure-name)

## 終わりに

以上で **画面系プログラムその１（単票形式** の解説を終了する。自由形式に関しては冒頭でも述べた通り帳票系と特に変わるわけではなく、帳票で学習した内容は画面系でも活かせる。他にも一覧形式の画面のサンプルが以下のリンクに掲載されているのでコーディングの参考にすると良い。
- [ 品目マスタ一覧照会（ＦＦ - /QEOLFF/QRPGLESRC/IPL020@YU2.RPGLE](https://github.com/IBMCJ-2023-C06/020-FF_RPG_samples/blob/main/QRPGLESRC/IPL020%40YU2.RPGLE)
- [ 品目マスタ照会 SFL（画面装置 - /QEOLFF/QDSPSRC/IPL020D.DSPF](https://github.com/IBMCJ-2023-C06/020-FF_RPG_samples/blob/main/QDSPSRC/IPL020D.DSPF)

■表示イメージ
![040-050-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520639/8934a803-ba41-18a4-d1c8-f68af1b8d2f1.png)


## 編集履歴

- 作成日：IBMCJ-2023-C06 (CSC)Y.USHIDA 2023.08.29 15:30 [新規投稿]
- 更新日：IBMCJ-2023-C06 (___)_.______ 20__.__.__ __:__ []

## 資料に関する注意書き

本資料の著作権は、日本アイ・ビー・エム株式会社（IBM Corporationを含み、以下、IBMといいます。）に帰属します。
ワークショップ、セッション、および資料は、IBMまたはセッション発表者によって準備され、それぞれ独自の見解を反映したものです。それらは情報提供の目的のみで提供されており、いかなる参加者に対しても法律的またはその他の指導や助言を意図したものではなく、またそのような結果を生むものでもありません。本資料に含まれている情報については、完全性と正確性を期するよう努力しましたが、「現状のまま」提供され、明示または暗示にかかわらずいかなる保証も伴わないものとします。本資料またはその他の資料の使用によって、あるいはその他の関連によって、いかなる損害が生じた場合も、IBMまたはセッション発表者は責任を負わないものとします。 本資料に含まれている内容は、IBMまたはそのサプライヤーやライセンス交付者からいかなる保証または表明を引きだすことを意図したものでも、IBMソフトウェアの使用を規定する適用ライセンス契約の条項を変更することを意図したものでもなく、またそのような結果を生むものでもありません。

本資料でIBM製品、プログラム、またはサービスに言及していても、IBMが営業活動を行っているすべての国でそれらが使用可能であることを暗示するものではありません。本資料で言及している製品リリース日付や製品機能は、市場機会またはその他の要因に基づいてIBM独自の決定権をもっていつでも変更できるものとし、いかなる方法においても将来の製品または機能が使用可能になると確約することを意図したものではありません。本資料に含まれている内容は、参加者が開始する活動によって特定の販売、売上高の向上、またはその他の結果が生じると述べる、または暗示することを意図したものでも、またそのような結果を生むものでもありません。 パフォーマンスは、管理された環境において標準的なIBMベンチマークを使用した測定と予測に基づいています。ユーザーが経験する実際のスループットやパフォーマンスは、ユーザーのジョブ・ストリームにおけるマルチプログラミングの量、入出力構成、ストレージ構成、および処理されるワークロードなどの考慮事項を含む、数多くの要因に応じて変化します。したがって、個々のユーザーがここで述べられているものと同様の結果を得られると確約するものではありません。

記述されているすべてのお客様事例は、それらのお客様がどのようにIBM製品を使用したか、またそれらのお客様が達成した結果の実例として示されたものです。実際の環境コストおよびパフォーマンス特性は、お客様ごとに異なる場合があります。

IBM、IBM ロゴは、米国やその他の国におけるInternational Business Machines Corporationの商標または登録商標です。他の製品名およびサービス名等は、それぞれIBMまたは各社の商標である場合があります。現時点での IBM の商標リストについては、ibm.com/trademarkをご覧ください。