自動生成サブルーチン #disp_recordについて
#disp_recordは画面入出力を行うサブルーチンです。
0010 //--------------------------------------------------------------------
0011 // #DSP01入出力
0012 //--------------------------------------------------------------------
0013 BEGSR #DSP01;
0014 DPFKEY = @FKEY(1);
0015 WRITE DSPFKEY; //操作説明を表示
0016 EXFMT DSP01; //画面レコードの出入力
0017 EXSR #DSP01_INITATR; //画面表示属性の初期化
0018 SELECT;
0019 WHEN *IN(03) = *ON;
0020 WSTS = '99';
0021 WHEN *IN(04) = *ON;
0022 EXSR #DSP01_SEARCH;
0023 WHEN *IN(12) = *ON;
0024 EXSR #SCREEN_BACK;
0025 OTHER;
0026 EXSR #DSP01_CHECK;
0027 IF *IN90 = *OFF;
0028 EXSR #DSP02_INITFLD;
0029 EXSR #DSP02_INITATR;
0030 WKI = WKI + 1;
0031 @WSTS(WKI) = WSTS;
0032 WSTS= '2';
0033 ENDIF;
0034 ENDSL;
0035 ENDSR;
0010~0017はシステム設定の入出力Logicで定義しています。開発環境に合わせて設定変更が可能です。
0019、0021、0023は画面設計のKEYBORD OWN CODEを書いた場合(=Fキー有効)に挿入され、0020,0022,0024のオウンコード入ります。
0025~0033は実行キー処理で、自動的に挿入されるコードです。
0026入力チェック
0027エラーが無ければ(*IN90はエラー代表標識で予約しています)
0028次画面のフィールド初期化
0029次画面の属性初期化
0030~0032次画面への遷移
を行っています。
画面遷移の最終画面は、次画面ではなくファイル更新処理が自動生成されます。
自動生成を使いたくない場合は、画面設計の[ENTER]コードにオウンコードを書きます。
今回は以上です。
自動生成サブルーチン #SCREEN_BACKについて
#SCREEN_BACKは前画面に遷移(戻る)するためのサブルーチンです。
//------------------------------------------------------------
// #SCREEN_BACK 前画面に戻る
//------------------------------------------------------------
BEGSR #SCREEN_BACK;
//WKI=0 の場合は WSTS を先頭値にセットして、第一画面を初期化する
IF WKI = 0;
WSTS = '1';
EXSR #DSP01_INITFLD;
EXSR #DSP01_INITATR;
ELSE;
WSTS = @WSTS(WKI);
WKI = WKI - 1;
SELECT;
WHEN WSTS = '1';
EXSR #DSP01_INITATR;
WHEN WSTS = '2';
EXSR #DSP02_INITATR;
WHEN WSTS = '3';
EXSR #DSP03_INITATR;
ENDSL;
ENDIF;
ENDSR;
自動生成のパターンは、直前の画面番号@WSTS(WKI)をWSTSに戻して、属性初期化サブルーチンを行います。
1つ前に戻るのでWKIもー1しています。
#SCREEN_BACKとは関係ありませんが、強制的に先頭画面に戻したい場合はWSTSを'1'にWKIを0にセットし、フィールド初期化サブルーチンと属性初期化サブルーチンを行います。
今回は以上です。
自動生成サブルーチン #INITについて
初期処理サブルーチン[#INIT]のご紹介です。
#INITのオウンコード部分は、サブルーチン一覧に登録が必要です。
後半に第一画面への遷移コードが自動生成されます。
//------------------------------------------------------------------------------
// 初期処理 #INIT
//------------------------------------------------------------------------------
BEGSR #INIT;
//SQL設定
EXEC SQL SET OPTION COMMIT = *NONE;
//画面遷移
EXSR #DSP01_INITFLD;
EXSR #DSP01_INITATR;
WKI = *ZERO;
WSTS = '1';
ENDSR;
赤字がサブルーチンに登録したオウンコード部分です。
青字が自動生成されたコードです。
#DSP01_INITFLDは、画面設計の各フィールドの[フィールド初期化コード]に書いたコードを集めたサブルーチンです。
正確にはBEGSR/ENDSRだけが自動生成ですね。
//--------------------------------------------------------------------
// #DSP01_INITFLD フィールド初期化
//--------------------------------------------------------------------
BEGSR #DSP01_INITFLD;
D1NMTK = *BLANK; // 得意先名
ENDSR;
フィールド初期化コードが無い場合は、*BLANK/*ZEROの設定を自動的に組み込むことも可能です。
#DSP01_INITATRも同様で、[属性初期化コード」に書いたコードを集めたサブルーチンです。
//--------------------------------------------------------------------
// #DSP01_INITATR 属性初期化
//--------------------------------------------------------------------
BEGSR #DSP01_INITATR;
*IN31 = *OFF; //PC標識 得意先名
D1P31 = X'34'; // Pフィールド
ENDSR;
属性初期化コードが無い場合は、初期値の設定を自動的に組み込むことも可能です。
WKIとWSTSは画面遷移の制御用ワークです。データ定義の基本ワークとして定義しています。
WSTSに画面設計の[画面番号]をセットすることで、表示する画面を決定しています。[画面番号]は画面設計一覧の上から順に1,2,3,・・・が自動設定されます。
WKIは画面遷移を保存するための配列@WSTSの指標です。画面遷移する前に今表示している[画面番号]を@WSTSに保存しています。これは前画面に戻るときに使用しています。
今回は以上です。
サブルーチンの自動生成について
ASSGの対話型プログラムでは、「サブルーチンの自動生成」が可能です。
自動生成されるルーチンは下記の通りです。
MAIN:メインルーチン(画面遷移の制御部分のみ)
#INIT:初期処理(第一画面への画面遷移部分のみ)
#SCREEN_BACK:前画面遷移
#disp_record :画面入出力
#disp_record_INITFLD:フィールド初期化
#disp_record_INITATR:属性初期化
#disp_record_CHECK:入力チェック
#disp_record_SEARCH:検索
(disp_record:画面レコード名)
-----------------------------------------------------------------------------------
MAINルーチンはサブルーチンではありませんが、次のようなコードが生成されます。
(赤字は任意に設定可能、青字は自動生成)
//--------------------------------------------------------------------
// MAIN ROUTINE
//--------------------------------------------------------------------
//画面遷移初期化
WSTS = '0';
//画面処理
DOU WSTS = '99';
SELECT;
WHEN WSTS = '0';
EXSR #INIT;
WHEN WSTS = '1';
EXSR #DSP01;
WHEN WSTS = '2';
EXSR #DSP02;
WHEN WSTS = '3';
EXSR #DSP03;
ENDSL;
ENDDO;
EXSR #END;
DSP01→DSP02→DSP03と順に遷移するためのコードを生成します。
この遷移に乗らない画面、例えばメッセージ表示画面や組み込みの検索画面は、「自動生成しない」設定にできます。
その場合オウンコードでWRITE/EXFMTを書きます。
他のサブルーチン紹介は次回にします。
AS400のWINDOW表示と罫線に悩む
AS400でもWINDOW表示が使えるようになり、画面デザインの幅が広がりました。
ところが、WINDOW内に罫線を引くのにとても悩みました。
WINDOW本体のレコードと罫線レコードのレコードキーワードで、
WINDOW(2 60 10 10)
のように指定しても罫線は表示できません。正確に言うと、一瞬罫線が見えてから本体が表示されます。もちろん本体レコードにはOVERLAYを指定しています。
試行錯誤の結果、以下の方法で解決しました。
QDSPSRC----------------------------------------
R WINDOW1 WINDOW(2 60 10 10)
R DSP01 WINDOW(WINDOW1)
OVERLAY
R DSP01LIN WINDOW(WINDOW1)
QRPGSRC----------------------------------------
WRITE WINDOW1;
WRITE DSP01LIN;
EXFMT DSP01;
DSP01はWINDOW枠で表示される行桁がずれますが、DSP01LINはずれないようなので、1桁右の桁位置にしました。
参考マニュアル(出典:IBM Knowledge Center)
表示装置ファイルの WINDOW (ウィンドウ) キーワード (ibm.com)
ひとりごと、光回線
いま、我が家のインターネット回線はNTTのフレッツ光回線です。契約プランは「光ネクスト ファミリー・ハイスピードタイプ」。下り200Mbps/上り100Mbpsなんですが、去年の夏ころから速度が出なくなりました。どうもコロナで在宅勤務が増えたのが原因らしいです。
そこでIPV6で繋ぐようにしたところ速度改善したのですが、仕事先のVPN接続が遅くて使えないことが判明。時間帯でIPV4とIPV6を切り替えるという面倒なことになりました。
先日、改めてNTTのHPを見ていたとこと、下り上り1GMbpsの「光ネクスト ギガファミリー・スマートタイプ」を見つけました。料金は局内工事の2000円と月額料金+200円とのこと。たったこれだけで速度改善するなら安いもの。工事は明後日。さてどうなるか?
できれば下り上り10GMbpsの「クロス」にしたいけど、提供エリアは東京だけでした。
ドキュメントの機能改善
ドキュメントの機能改善 途中経過報告です。
テンプレートを使うことはできました。
Sheets.Add(before:=Worksheets("sheet1"), Type:=Template_Path).name = new_name
Template_Path:テンプレート用ブックファイルのPath
new_name:追加するシート名
ただ、課題が残っています。
ドキュメントシートには「別ウィンドウ表示」をしたいので、シートのActivateのイベントにちょっとしたVBAコードを書きこむ必要があります。その場合、VBAProjectのUnprotect⇒VBAコード書込み⇒VBAProjectのProtect をしたいのですが、最後のProtectが分かりません。(ブック自体のProtectはできるけど・・・)
ThisWorkbook.Unprotect password:="**********"
(VBAコード書込み)
ThisWorkbook.Protect password:="**********" (本当はVBAProjetcをProtectしたい)
どなたか助けてくれないでしょうか。