自動生成サブルーチン #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したい)
どなたか助けてくれないでしょうか。
ドキュメントについて
唐突ですが、エクセルって本当に便利なツールですよね。様々な使い方があると思うのですが、アプリの開発でも各種の仕様書やDB設計書やフローチャートなどなど、切り離せない存在です。
ASSGは開発ツールなので、仕様書やフローチャートなどのドキュメントも一体で管理するようにしています。管理方法は以下の通りです。
- ドキュメントとして管理するシート名を[ドキュメント_*]とする
- 設計情報保管では、[ドキュメント_*]シートを別ブックとして保管する
- 設計情報復元では、[ドキュメント_*]シートがあればASSGに復元する
- [ドキュメント_*]シートは別ウィンドウで表示可能とする
別ブック名は保管ファイルの拡張子がxlsxになります。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ここまで書きましたが、やっぱりこの「ドキュメント管理」には不満がありました。
それは、「たんなるシートしか追加できない」ことです。フローチャートを書くのであればこれでもOKですが、ER図やテスト仕様書を書く場合は書式を揃える作業が必要になる。あ~面倒くさい・・・
またまた唐突ですが、追加するシートに「テンプレート」を使えるように機能改善します。
今日はここまでです。