フック一覧 Update (画面フック) | 前の画面フック 次の画面フック |
VB C# ALL プログラミング言語によるフィルタ (ここで選んだ言語で選別された説明や図だけが表示されます)
この画面フックメソッドは、主にアプリフレームと呼ばれる画面アプリのための上位フレームワークを設計する方々がお使いになるものです。一般のアプリ開発者の方々は、上位フレームワーク設計者から示された情報があれば、必ずしもここの内容を詳細に知る必要はありません。
◇ 役割 (この画面フックメソッドに委託されている処理)
カレント画面データに対応するレコード (群) を対象にして、ファイルまたはデータベースの更新 (および追加・削除) 処理をする。つまり、この画面フックメソッドが呼び出される前に、カレント画面データは、(更新モードで行われたアプリ操作者によるインプット操作で) 更新されているので、その更新内容をファイルまたはデータベースに反映するのである。なお、これに先立って、ここで更新処理などを行える状況になっているかどうかのチェック (更新処理などの可否チェック) も必要に応じて行うことができる。
前提とする事前環境: この画面フックメソッドが動作する以前に、画面フックメソッド Open, SelectFh, SelectExec などが処理対象レコード群を決定していて、適当な変数 (上図の灰色の矢印) がそれを指し示すように設定してある。
そして、画面フックメソッド SelectFh または SelectExec などがカレント画面データを選択して、適当な変数 (上図の空色の矢印) がそれを指し示すように設定してある。さらに、Current などがカレント画面データを読み集めて画面に表示してあり、その一部 (または全部) はアプリ操作者によるインプット操作で変更されている。つまり、アプリ操作者は、更新モードでの画面データのインプット (下図) を完了させている。
役割を果たした後の動作: この画面フックメソッドの戻り値は、FormBase への伝言になっており、更新処理の可否、またはここで更新処理を行った後の動作モードを指定する。たとえば、上図の太線のルートのように、更新処理を行った後に引き続き更新モードを継続せよと伝言すると、FormBase は、画面を初期化して、さらに画面フックメソッド NextFh を呼び出して次の画面データを画面に表示して、アプリ操作者からのインプットを受け付けることになる。
この画面フックメソッドの戻り値の指定で更新処理を否とした場合 (つまり FormBase.UPDATE_Nop を指定した場合)、または戻り値の指定に従って呼び出される画面フックメソッド Indicate, AppendChk, SelectFh の中で動作モードの移行が許可されなかった場合は、更新モードでインプットを受け付けていた元の状態に戻る。これらの場合は、何事もなかったかのように画面上のデータも変更されずに残る。
◇ 配置 (ツーピーススタイルの場合にこの画面フックメソッドをどこに配置できるか)
ローカルピースかセントラルピースかのどちらか一方に配置する。または、どちらにも配置しない。
◇ 代表的な書き方 (詳しい構文はフックメソッドの書き方を参照)
VB での書き方:
Friend Function Update(パラメタ宣言列) As Integer
または
Friend Function 画面略称_Update(パラメタ宣言列) As Integer
C# での書き方:
internal int Update(パラメタ宣言列)
または
internal int 画面略称_Update(パラメタ宣言列)
Java での書き方:
int Update(パラメタ宣言列)
または
int 画面略称_Update(パラメタ宣言列)
なお、フック名としては、Update の他に更新処理を用いることができる。
◇ 呼び出される契機 (以下が切っ掛けとなりこのフックメソッドが呼び出される)
アプリ操作者が追加モードでのインプットを終えて、データをファイルまたはデータベースに追加せよという意味の実行の指示 (Execute 指示) を行ったとき。
Execute 指示には、明の Execute 指示と暗の Execute 指示がある。 いずれも“画面上にデータが整ったので登録せよ”という意味の指示である。 この指示がなされると、まず画面データ完備チェックが行われる。 そして、この完備チェックでデータが完備していると判定された場合だけ、この指示は有効になる。 こう判定されないと、この指示は無効になり、何の指示もなかったことになる。
明の Execute 指示とは、アプリ操作者がボタン Cm_Execute をクリックすること、またはメニュー項目 Mn_Execute をクリックすることか、これに相当する操作 (対応するショートカットキーの押下) をすること、または Execute に対応づけられたファンクションキーを押下することを意味する。
暗の Execute 指示とは、カーソルが画面の中のインプット可能な項目うちの最終位置にあるときに Enter キーを押下すること、またはテール部にインプット可能な項目が存在しないケースにおいては拡張ボディ部 (または拡張ボディ部が存在しないケースにおいてはボディ部) のカレント明細 (レコード) の項目がすべて初期状態のときに (つまりカレント明細に何もインプットしていないときに) 必須入力項目上で Enter キーを押下することを意味する。
◇ 戻り値の意味とデフォルト動作 (戻り値による FormBase への伝言)
FormBase.UPDATE_Nop (= 0): 動作モードの変更を行わずに、カレント画面データをそのまま表示せよ。FormBase は、この伝言を受けると、アプリ操作者からなされた Execute 指示を無視して、指示がなされなかったかのように振る舞う。つまり、アプリ操作者からなされた Execute 指示は無効になる。
FormBase.UPDATE_Select (= 1): 選択モードに移行せよ。なお、選択モードに移行する際には、SelectFh フックメソッドがあれば、それが呼び出される。
FormBase.UPDATE_AppType (= 2): アプリの型に従って (データエントリまたはデータ照会の場合) 表示モードに移行してカレント画面データを表示するか、あるいは (データ更新またはデータエントリ更新の場合) 更新モードのままで画面を初期化してカレントの次の画面データを表示せよ。
FormBase.UPDATE_Indicate (= 3): 表示モードに移行して、カレント画面データを表示せよ。
FormBase.UPDATE_Update (= 4): 更新モードのままで、画面を初期化してカレントの次の画面データを表示せよ。
FormBase.UPDATE_Append (= 15): 追加モードに移行して、画面を初期化してデータエントリを受け付けよ。
デフォルト動作: Update 画面フックメソッドが組み込まれていない場合の動作は、FormBase.UPDATE_Nop が設定された場合と同様である。
◇ 代行メッセージ (処理の流れに応じて発せられるメッセージ; カスタマイズ可能)
メッセージコード: "COMPLETEC"
"インプットの必要な項目が残っています。"
"または、 エラーの項目かインプット途中の項目が残っています。"
"インプットを完結させてください。"
メッセージコード: "UPDATE"
"伝票を更新します。"
メッセージコード: "UPDATE2"
"何もインプットされていませんが、 伝票を更新しますか?"
◇ 使用上のヒントと注意事項
このフックメソッドの中で、カレント画面データに対応するファイルまたはデータベースを更新しないことにした場合は、適当なメッセージをアプリ操作者に向けて発してから、戻り値を FormBase.UPDATE_Nop にしてください。
なお、アプリ操作者は、何のメッセージも示されないと、自分の指示どおりにカレント画面データが更新登録されるものと期待する。このフックメソッドの本来の役割は、この期待に応えて更新処理をすることである。
ボディ部または拡張ボディ部をもつ画面においては、単にファイルまたはデータベースの一つのレコードを更新するだけでよいとは限らない。画面の中のすべてのデータ (すべての明細) に対応する更新処理を行うことが必要である。このために、通常は複数のレコードの更新処理が必要である。
また、アプリ操作者は、画面の中に明細を追加したり更新したり削除したりした後に、データ登録の指示 (Execute 指示) をする場合もあるので、単に更新処理をするだけでよいとは限らない。各明細について更新・追加・削除の必要性を判断して、それぞれの処理 (更新・追加・削除) を行わなければならないこともある。
◇ 関連事項
Execute 指示によって呼び出される画面フックメソッドには、 この他に Append, IndicateExec, SelectExec がある。
ファイルまたはデータベースの内容を変更する役割の画面フックメソッドには、 この他に Append, Delete がある。
◇ 使用例
' 受注トランザクションテーブルの現画面に関するレコードの更新を行う (Update)。 Friend Function 更新処理(ByVal fB As FormBase) As Integer TextDBMS.TranStart() ' 伝票の更新処理を行う。 Dim 明細個数 As Integer = Integer.Parse(JutyuTable.明細数) Dim 明細行インデックス As Integer = 0 While 明細行インデックス < 明細個数 明細レコード.DeleteRecord(画面データキー + TextDBMS.AlignRight((明細行インデックス + 1).ToString(), 3)) 明細行インデックス += 1 End While ' 明細行インデックス = 0 While 明細行インデックス < fB.LastDe FromBdToDB(fB, 明細行インデックス) 明細レコード.InsertRecord() 明細行インデックス = 明細行インデックス + 1 End While ' FromHdTlToDB(fB) メインレコード.UpdateRecord(画面データキー) ' TextDBMS.TranCommit() ' fB.StatusOut("伝票を更新しました。(伝票番号 " + VB.Strings.Format(画面データキー, 画面キー項目フォーマット) + ")", _ System.Drawing.Color.Black) ' ' 更新モードのまま、次の画面データを表示する。 Return FormBase.UPDATE_Update End Function ' 更新処理
// 受注トランザクションテーブルの現画面に関するレコードの更新を行う (Update)。 internal int 更新処理( FormBase fB ) { TextDBMS.TranStart(); // 伝票の更新処理を行う。 int 明細個数 = int.Parse(受注レコード.明細数); int 明細行インデックス = 0; while (明細行インデックス < 明細個数) { 明細レコード.DeleteRecord(画面データキー + TextDBMS.AlignRight((明細行インデックス + 1).ToString(), 3)); 明細行インデックス += 1; } // 明細行インデックス = 0; while (明細行インデックス < fB.LastDe) { FromBdToDB(fB, 明細行インデックス); 明細レコード.InsertRecord(); 明細行インデックス = 明細行インデックス + 1; } // FromHdTlToDB(fB); メインレコード.UpdateRecord(画面データキー); // TextDBMS.TranCommit(); // fB.StatusOut("伝票を更新しました。(伝票番号 " + Strings.Format(画面データキー, 画面キー項目フォーマット) + ")", System.Drawing.Color.Black); // // 更新モードのまま、次の画面データを表示する。 return FormBase.UPDATE_Update; } // 更新処理
// 受注トランザクションテーブルの現画面に関するレコードの更新を行う (Update)。 int 更新処理( FormBase fB ) { TextDBMS.TranStart(); // 伝票の更新処理を行う。 int 明細個数 = int.Parse(受注レコード.明細数); int 明細行インデックス = 0; while( 明細行インデックス < 明細個数 ) { 明細レコード.DeleteRecord(画面データキー + TextDBMS.AlignRight((明細行インデックス + 1).toString(), 3)); 明細行インデックス += 1; } // 明細行インデックス = 0; while( 明細行インデックス < fB.LastDe ) { FromBdToDB(明細行インデックス); 明細レコード.InsertRecord(); 明細行インデックス = 明細行インデックス + 1; } // FromHdTlToDB(); メインレコード.UpdateRecord(画面データキー); // TextDBMS.TranCommit(); // fB.StatusOut("伝票を更新しました。(伝票番号 " + VB.Strings.Format(画面データキー, 画面キー項目フォーマット) + ")", System.Drawing.Color.Black); // // 更新モードのまま、次の画面データを表示する。 return FormBase.UPDATE_Update; } // 更新処理