|
例えば、オーダー入力で、xxxコードの入力のフィールドのところで、F4を押すと入力候補画面をウィンドウで出したい時ありませんか。あれをいちいち、マスターごとにプログラムを作るのに嫌気がさした私は、QRYのように、事前定義をファイルに登録しておくと、選択画面が出てくるものを作りました。
スペック
- 事前定義により、対象ファイル、表示フィールド、選択時の戻しフィールドなどを指定
- 指定内容を、ウィンドウにて、表示
- オペレータが選択すると、選択内容が値として、パラメータで戻される
このプログラムを呼び出すプログラムは、DDSキーワードRTNCSRLOCにより、F4が押された時のレコード様式名、フィールド名を取り出し、これから、どのような定義の「汎用選択画面」を出すか決定します。
サンプル
定義開始の画面

定義中の画面

定義確認画面

選択後の内容検査画面

実行中の画面

作成のポイント
以下は、最小限の機能としての、作成上のポイントです。
定義部分
定義を取り込むファイルは、以下を含む
見出ファイル
- 定義ID
- ファイル名
- ファイルライブラリー名
- レコード識別コード
- 表示ウインドウのタイトル
明細ファイル
- 定義ID(11バイトの方がいいと思う。最大ファイル名+1バイト)
- 表示フィールドの表示順
- 表示フィールドのフィールド属性とその開始終了位置(バッファー位置のこと)
- 戻しフィールドの戻し順
- 戻しフィールドのフィールド属性とその開始終了位置
- 表示フィールドが数字の場合の編集コードや編集語
- 表示フィールドのタイトル
- 表示フィールドの表示間隔
- 他
また、ファイルのレイアウト変更によるチェックは、現在のレコード様式コードと、定義中のレコード様式コードを元に行う。(実は、自分は作成時にこの点を見逃していた。スペックのバグです。未対応です。むむむ。
表示部分
定義ファイルを元に、
- 対象ファイルのレコードを読み込む(内部記述;複数のレコード様式名を持つファイル(複合ファイル)はサポートできない)
- レコードを1バイトの配列要素に取り込み、表示フィールドの順番どおりに、バッファ単位に、データを取り出す。(、もし、数字で編集を指定されていたら、APIにて編集済み文字列に変換する。(パック化数字も、文字列に展開してくれる。)
- ウィンドウ指定のサブファイルに書き出す。この時、表示間隔に気を付ける。これは、QRYの定義と同じ。(当初、ウィンドウサイズを自由に変えられると勘違いしていたが、DDSキーワードWINDOWSには表示場所は指定できるが、ウィンドウサイズそのものはDDS指定値以外変えられないので、仕方なく固定サイズにした。ASSUME,PUTOVR,OVERLAY,KEEPで出来るウインドウでは、サブファイルは指定できない。)
- サブファイルに書き出す時に、戻しフィールドも順番どおりに、数字編集APIで、文字データに変換して、合成して、1フィールドにして、サブファイルのヒドンフィールドにセットしておく。
- サブファイル表示をする。
- もし、選択された場合は、そのサブファイルレコードのヒドンフィールドをパラメータにセットして返す。
表示プログラムへのパラメータ
- 定義のID
- 選択フィールドを出すかいなか
- 選択後の戻り値
備考
当然、定義プログラムと、表示プログラムは別となる。他の人が使うことを考えて、パラメータは必要最小限にとどめる。
実行時
選択画面を出したいプログラム内部にCALL命令で、表示プログラムを呼び出す。この時、DDSキーワードRTNCSRLOCにより、F4が押された時のレコード様式名、フィールド名を取り出し、定義IDを選択します。(定義IDは通常ファイル名そのもの)。これだけで、選択ウインドウが出る。
強化
- キー付きファイルの場合、キー指定を可能にする(パラメータにて指定)。
- 簡単なデータセレクションを組み込む。早い話、読み飛ばしの指定。遅くなるので、本当はあまり指定したくないのですが、たまに使います。
ファイルレイアウト変更は、まだ未対応ですが、それ以外の部分は結構使えます。本当は、ウインドウサイズが可変になるといいのですが、それは今のところできません。OSが対応してくれるのを待ちます。また、表示位置は*DFTにすれば、現在のカーソル位置に近いところのウインドウが出ますので、便利です。
|