1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IBM i 開発者向け! VSCode拡張機能 #6

1
Posted at

IBM i DSPF Screen Designerをアップデートしました

はじめに

IBM i のディスプレイファイル(DSPF/DDS)を VSCode 上で視覚的に確認・編集するために開発している IBM i DSPF Screen Designer について、対応キーワードと編集機能をさらに拡充しました。

今回の更新では、単純に「読み込めるキーワード」を増やすだけではなく、

  • プロパティ画面から編集できる
  • IBM i の仕様に合わない組み合わせを検証できる
  • 画面イメージへ反映できるものはプレビューする
  • 既存 DDS の書き方をできるだけ維持する
  • 未対応部分は原文を残す
  • ソース編集ペインの表示および操作パフォーマンスの向上

という方針で対応しています。

特に今回紹介したいのは、次のキーワード・機能です。

分類 今回取り上げる追加・強化内容
フィールド CNTFLD
入力検査 AUTO / CHECK の相互扱い
入力検査 COMP
選択フィールド SNGCHCFLD / CHOICE
一時変更 OVRATR / OVRDTA
キー・画面制御 ERASE の編集
ヘルプ ALTHELP / HLPTITLE / HLPPNLGRP / HLPARA
表示モード DSPMOD / SLNO / ALWROL / INVITE / INDARA / USRDSPMGT
カーソル SFLMODE
画面編集 WINDOW 枠のマウス移動・リサイズ
画面編集 複数要素のコピー/貼り付け
検証 エラー/警告/情報の分類強化

本記事では、最新の操作マニュアルで追加・強化された内容のうち、前回までの記事で十分に取り上げていなかったものを中心に紹介します。


1. CNTFLD ― 複数行の継続入力フィールドに対応

まず紹介したいのが CNTFLD です。

CNTFLD は、1つの入力フィールドを 「桁幅 × 行数」の長方形入力フィールドとして扱うためのキーワードです。

例えば、90桁の文字フィールドに

CNTFLD(30)

を指定すると、

30桁 × 3行

の入力領域になります。

DSPF Screen Designerでは、フィールドプロパティから継続入力の桁幅を指定できるようにしました。

90A
 +
CNTFLD(30)

      ↓

30桁
┌──────────────────────────────┐
│                              │
│                              │
│                              │
└──────────────────────────────┘

画面イメージだけではなく、Excel出力でも長方形として扱います。

また、2行目以降も実際に画面を占有するため、他の項目との重なりについても「配置の警告」で検出します。

IBM i仕様上の制約もチェック

CNTFLD にはいくつか制約があります。

DSPF Screen Designerでは、例えば次のような指定を検証します。

  • データタイプ A の入力可能フィールドであること
  • サブファイルでは使用しないこと
  • CNTFLDの桁幅がフィールド全体の桁数より小さいこと
  • EDTMSK と併用しないこと
  • CHECK(AB MF RB RZ) と併用しないこと
  • オプション標識を付けないこと

新しく作るときだけでなく、既存ソースを読み込んだ場合も、仕様に合わない指定は検証結果へ表示します。


2. AUTOをCHECKとして扱えるようにした

IBM i の DDS には、古い資産で AUTO が使われていることがあります。

今回、AUTO を単なる未対応キーワードとして残すのではなく、IBM i の仕様に合わせて CHECK の別表記として扱えるようにしました。

対応関係は次のとおりです。

AUTO 同じ意味のCHECK
AUTO(RA) CHECK(ER)
AUTO(RAB) CHECK(RB)
AUTO(RAZ) CHECK(RZ)

例えば、

AUTO(RAZ)

を含むDDSをインポートすると、プロパティ上では CHECK(RZ) 相当として編集できます。

一方で重要なのは、読み込んだAUTOを勝手にCHECKへ書き換えないことです。

別の位置や桁数を変更しただけなら、

AUTO(RAZ)

はそのまま維持します。

AUTO表記で出力する設定も追加

新規に設定するときは、基本的には CHECK 表記を使用します。

ただし既存資産のコーディングスタイルに合わせたい場合は、

ER / RB / RZ を AUTO 表記で書く

を有効にすることで、

CHECK(ER) → AUTO(RA)
CHECK(RB) → AUTO(RAB)
CHECK(RZ) → AUTO(RAZ)

として出力できます。

既存DDSを保守するツールとしては、意味だけでなく元の書き方をできるだけ保持することも重要だと考えています。


3. COMP ― 入力値の比較検査に対応

入力フィールドの比較検査を行う COMP にも対応しました。

例えば、

COMP(GE 0)

なら、

入力値が 0 以上

という条件になります。

フィールドプロパティでは、演算子をプルダウンから選択し、比較する値を入力します。

対応する演算子は次の8種類です。

演算子 意味
EQ 等しい
NE 等しくない
LT より小さい
NL より小さくない
GT より大きい
NG より大きくない
LE 以下
GE 以上

数値フィールドなら、

0
+021920
-100

のように指定できます。

文字フィールドでは、

'ABC'

のように単一引用符で囲みます。

COMPの不正指定も検証

次のようなケースは検証結果へ表示します。

  • 1フィールドに複数のCOMP
  • 入力可能フィールド以外への指定
  • 浮動小数点フィールドへの指定
  • COMPへのオプション標識
  • 数値フィールドに文字列を指定するなど、型と値が一致しない場合

なお、COMPのエラーメッセージを差し替える CHKMSGID は、現時点では編集対象外です。


4. SNGCHCFLD / CHOICE ― 単一選択項目に対応

今回の更新の中でも、比較的大きな対応が SNGCHCFLD / CHOICE です。

SNGCHCFLD は、複数の選択肢から1つを選ぶフィールドです。

5250画面では、ラジオボタンに近い見え方になります。

DSPF Screen Designerでは、フィールドプロパティから次の指定を編集できます。

カーソル移動

*NORSTCSR
*RSTCSR

自動選択

*NOAUTOSLT
*AUTOSLT
*AUTOSLTENH

選択標識

*NOSLTIND
*SLTIND

自動入力

*NOAUTOENT
*AUTOENT
*AUTOENTNN

行・列配置

*NUMCOL n
*NUMROW n
*GUTTER n

CHOICE

「+ 選択項目追加」から、各CHOICEについて次の内容を指定できます。

  • 選択番号 1~99
  • 'ラジオON' のような固定テキスト
  • &フィールド名 による用途Pフィールドの参照
  • *SPACEB
  • 条件標識
  • ORを含む条件グループ

例えば概念的には、

SNGCHCFLD(...)
CHOICE(1 'ラジオ1')
CHOICE(2 'ラジオ2')
CHOICE(3 'ラジオ3')

という定義をプロパティから扱えます。

画面イメージでも選択項目を表示

*SLTIND の場合は、画面イメージ上で概ね、

o ラジオ1
o ラジオ2
o ラジオ3

のように表示します。

*NOSLTIND の場合は選択標識を表示せず、テキストのみ表示します。

条件標識付きのCHOICEは、標識ペインのON/OFFに応じて表示・非表示を切り替えます。

用途Pフィールドを参照している場合も、参照先の桁数を使ってプレースホルダー表示します。

実機のコンパイル条件も意識して検証

SNGCHCFLDは指定条件が多いため、検証もかなり重要です。

例えば、

  • データタイプ Y
  • 桁数 2
  • 小数桁 0
  • 用途 B/I
  • CHOICEが1つ以上必要
  • FLDCSRPRGとの同時指定不可
  • CHECK(ER)と*AUTOENT系の同時指定不可
  • COMPやVALUESなど、SNGCHCFLDに指定できないキーワード
  • &フィールド名で参照する用途Pフィールドが存在するか
  • 選択項目全体が画面内へ収まるか

などを検証します。

画面収まりについては、実機の CPD5313 や CPD5303 に相当する条件も考慮しています。


5. OVRATR / OVRDTA ― PUTOVRの一時変更を編集可能に

画面制御では、PUTOVR と組み合わせて使われる

OVRATR
OVRDTA

の編集を追加しています。

OVRATR

表示済みレコードの表示属性を一時的に変更します。

対象には、

  • DSPATR
  • CHECK(ER / ME)
  • DUP

などがあります。

OVRDTA

表示済みレコードのデータ内容を一時的に変更します。

レコードレベルだけでなく、項目レベルにも指定できます。

要素 OVRATR OVRDTA
フィールド ○ ○
テキスト ○ ×
DATE/TIME等の定数 ○ ×

項目側に指定がある場合は、項目側が優先されます。

既存DDSで、

OVERLAY PUTOVR OVRDTA

のように同じ行へ書かれている場合も、他の属性を編集しただけで勝手に行を組み替えないようにしています。


6. ERASEを属性指定から編集

ERASE も属性指定(R)から編集できるようになっています。

ERASE(レコード名1 レコード名2 ...)

のように、現在のレコードを書き込むときに画面から消去するレコードを指定します。

編集画面では「+ 追加」で複数指定でき、それぞれ条件標識も設定できます。

さらに、次のIBM i仕様を検証します。

  • OVERLAYとの併用
  • 参照先レコードが同じファイルに存在するか
  • 1指定あたり20レコードまで

DSPFではレコード間の関係が実際の表示結果へ大きく影響するため、この種のチェックはビジュアルエディタとの相性がよい部分だと思います。


7. HELP関連キーワードを大幅に拡充

今回、オンラインヘルプ関連についても対応範囲を広げています。

対象は次のキーワードです。

ALTHELP
HLPTITLE
HLPPNLGRP
HLPARA

ALTHELP

CAキーへHelpキーの機能を割り当てます。

CA01 ~ CA24

を指定できます。

HLPTITLE

全画面ヘルプのタイトルを指定します。

HLPTITLE('ヘルプタイトル')

HLPPNLGRP

ヘルプを取得するUIMパネルグループを指定します。

HLPARA

Helpキーを押したとき、カーソル位置によって使用するヘルプ領域を指定します。

対応形式は、

*RCD
上行 左桁 下行 右桁
*NONE
*FLD フィールド名 [選択番号]
*CNST ヘルプ識別番号

です。

H仕様も専用UIで編集

HLPARAとHLPPNLGRPは、通常のフィールドやレコードキーワードではなく H仕様として記述されます。

DSPF Screen Designerでは、

H仕様 1
H仕様 2
...

という形で編集できるようにしています。

カーソル位置ごとに異なるヘルプを設定する既存DSPFでも、DDSを直接読み解かなくても構造を把握しやすくなります。

まだ未対応のHELP関連もあります

現時点では、次のキーワードは編集対象外です。

HLPRCD
HLPDOC
HLPBDY
HLPEXCLD
HLPID
HLPSCHIDX

これらが含まれる場合は、編集せず原文を保持します。


8. MNUDDSでよく使う表示モード系キーワードも編集可能に

SDAで作成されるメニューDDS(MNUDDS)でよく使用されるキーワードについても、編集範囲を広げました。

対象は次のとおりです。

DSPMOD
SLNO
ALWROL
INVITE
INDARA
USRDSPMGT

DSPMOD

DSPSIZで宣言した画面サイズを切り替えます。

例えば、

*DS4

などです。

SLNO

レコードの開始行番号を指定します。

SLNO(1)
SLNO(*VAR)

ALWROL

プログラム側からウィンドウ内をロールできるようにします。

INVITE

後続の読み取りに備えて、装置へ送信勧誘を行います。

INDARA

オプション標識・応答標識を99バイトの独立標識域で受け渡します。

USRDSPMGT

画面上のデータを、重ね書きまたはCLRLで消去されるまで保存します。

これらについても、

  • 指定可能なレベル
  • 条件標識の可否
  • SFL/SFLCTLで使用できるか
  • DSPSIZとの整合
  • KEEPやCLRL等との組み合わせ

を検証します。

MNUDDSを扱う場合には、かなり実用的な追加だと思います。


9. SFLMODEをカーソル関連へ追加

カーソル関連では、

SFLMODE(&フィールド)

も扱えるようになりました。

SFLMODEは、入力時にサブファイルが

0 = 継続
1 = 切り捨て

のどちらのモードだったかをプログラムへ返すためのキーワードです。

サブファイル制御レコードで指定し、参照用の用途Hフィールドが存在しない場合は、仕様に合う属性で自動作成します。

同じカーソル関連画面では、

CSRLOC
RTNCSRLOC
SFLCSRRRN
SFLMODE

をまとめて確認できます。


10. WINDOWを画面上から直接移動・リサイズ

キーワード対応以外で、今回かなり使いやすくなったと感じるのが WINDOW枠のマウス操作です。

WINDOWレコードを表示すると、枠そのものをドラッグできます。

枠をドラッグ

WINDOWの行・桁を変更

四隅・四辺の8つのつまみをドラッグ

WINDOWの高さ・幅を変更

枠をダブルクリック

属性指定(R)のWINDOW編集欄を開く

ウィンドウの中の項目は「窓の内側からの相対位置」で保持しているため、枠を移動しても項目側のDDS行・桁は変えません。

WINDOW(レコード名)にも対応

他のレコードで定義したWINDOWを参照している場合も、画面上から調整できます。

変更されるのはWINDOWを定義している側のレコードです。

複数レコードから参照されている場合は、

この窓は n レコードで使われています

と表示します。

*DFTや変数位置も考慮

WINDOW(&行 &桁 ...)

のようにプログラム変数で位置を決めるWINDOWは、画面上の見え方のみ変更します。

*DFTの場合は、位置をドラッグした時点で数値指定へ切り替えます。


11. 複数要素のコピー/貼り付け

画面設計では、同じ見出しや項目群を別レコードへ配置したいことがよくあります。

今回、

Ctrl + C
Ctrl + V

で要素のコピー/貼り付けができるようになっています。

複数選択した要素も、相対位置を維持してまとめてコピーできます。

例えば、

DSP01

商品コード  [          ]
商品名      [                    ]
数量        [     ]

       ↓ Ctrl+C

DSP02

       ↓ Ctrl+V

商品コード  [          ]
商品名      [                    ]
数量        [     ]

といった利用が可能です。

マウスカーソルが画面イメージ上にある場合は、そのセルをコピーした要素群の左上として配置します。

別レコードへコピーした場合は、元と同じ位置へ配置できます。

また、

  • 画面範囲外
  • WINDOW範囲外
  • サブファイル明細範囲外

など、1つでも配置できない要素がある場合は中途半端に貼り付けず、処理を中止して理由を表示します。

フィールド名が重複する場合は連番へ調整します。


12. 検証結果を「エラー/警告/情報」に整理

DDS対応が増えるほど、単純な「対応/未対応」だけでは判断しにくくなります。

そこで検証結果を、

エラー
警告
情報

の3段階で整理しています。

さらに、ソース内のキーワードについても次の3種類を区別します。

分類 意味
未対応キーワード DSPFの正しいキーワードだが、このエディタに編集UIがない
表示ファイルでは使えないキーワード PF/LF/PRTF/ICF等、別のファイル種別用
DDSキーワードとして認識できない語 打ち間違い、小文字表記など

これは地味ですが、既存DDSを取り込んだときにかなり重要です。

例えば、

MLTCHCFLD
SFLROLVAL

のような「正しいDSPFキーワードだが未対応」のものは情報として扱い、原文を保持します。

一方、

PFILE
SKIPA
EVOKE

のようにDSPFでは使用できないキーワードはエラーとして扱います。

また、

overlay
keep

のように小文字で書かれたものも、DDSキーワードとして認識できないためエラーになります。


今回の更新で目指したこと

今回の更新で重視したのは、単純な対応キーワード数ではありません。

既存のDSPFを保守するうえでは、

キーワードを読み込める
        ↓
意味を画面で確認できる
        ↓
プロパティから編集できる
        ↓
IBM i仕様に合わない組み合わせを検証できる
        ↓
元のDDSの書き方をできるだけ保って書き戻す

という一連の流れが必要だと考えています。

例えば AUTO は、単純に CHECK へ変換してしまえば実装は簡単です。

しかし既存資産では、

AUTO(RAZ)

と書いてあるものを、位置を1桁変更しただけで、

CHECK(RZ)

へ勝手に変更してほしくないケースもあります。

同じように、HELPのH仕様や、一つの行に複数キーワードを書いているソースについても、できるだけ既存の書き方を維持する方向で実装しています。


現時点での未対応例

対応範囲は増えていますが、すべてのDDSキーワードに対応しているわけではありません。

今回の記事に関連するものでは、例えば次のものが未対応です。

MLTCHCFLD
CHKMSGID

HLPRCD
HLPDOC
HLPBDY
HLPEXCLD
HLPID
HLPSCHIDX

未対応キーワードを含んでいても、編集対象外の原文はできるだけ保持します。

そのうえで検証結果へ「情報」として表示し、

何が未対応なのか

を分かるようにしています。


まとめ

今回の更新では、対応キーワードと画面編集機能の両方を拡充しました。

特に大きいものをまとめると、

CNTFLD
AUTO
COMP
SNGCHCFLD / CHOICE
OVRATR / OVRDTA
ERASE
ALTHELP / HLPTITLE / HLPPNLGRP / HLPARA
DSPMOD / SLNO / ALWROL
INVITE / INDARA / USRDSPMGT
SFLMODE

といったキーワードを、単なる読込だけではなく、編集・表示・検証まで含めて扱える範囲を広げています。

さらに、

  • WINDOW枠をマウスで移動・リサイズ
  • 複数要素のコピー/貼り付け
  • 検証結果の重大度分類
  • 未対応キーワードと誤ったキーワードの区別

など、日常のDSPF保守で使いやすくするための機能も追加・強化しています。

IBM iのDSPFには、現在でもかなり多くのDDSキーワードがあり、既存資産にはさまざまな書き方が残っています。

そのため今後も、

実際の既存DSPFを壊さずに読み込み、必要な部分だけをVSCode上で安全に編集できること

を重視しながら対応範囲を広げていく予定です。


関連記事


1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?