自動生成サブルーチン #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接続が遅くて使えないことが判明。時間帯でIPV4IPV6を切り替えるという面倒なことになりました。

先日、改めて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図やテスト仕様書を書く場合は書式を揃える作業が必要になる。あ~面倒くさい・・・

またまた唐突ですが、追加するシートに「テンプレート」を使えるように機能改善します。

今日はここまでです。