フック一覧 Derived (項目フック) 前の項目フック 次の項目フック

VB C# ALL プログラミング言語によるフィルタ (ここで選んだ言語で選別された説明や図だけが表示されます)

Derived (派生値) 項目フックメソッド

役割 (この項目フックメソッドに委託されている処理)

この項目の派生元項目へのデータのインプットの完結を契機として、この項目にある値 (派生値) を設定して表示する。

配置 (ツーピーススタイルの場合にこの項目フックメソッドをどこに配置できるか)

セントラルピースに配置するか、または配置しない。ローカルピースに配置することは禁止されている。

代表的な書き方 (詳しい構文はフックメソッドの書き方を参照)

VB での書き方:
 Friend Function Derived(パラメタ宣言列) As 型名
 または
 Friend Function 項目略称_Derived(パラメタ宣言列) As 型名

C# での書き方:
 internal 型名 Derived(パラメタ宣言列)
 または
 internal 型名 項目略称_Derived(パラメタ宣言列)

Java での書き方:
 型名 Derived(パラメタ宣言列)
 または
 型名 項目略称_Derived(パラメタ宣言列)

なお、フック名としては、Derived の他に派生値を用いることができる。

呼び出される契機 (以下が切っ掛けとなりこのフックメソッドが呼び出される)

この項目の派生元項目に関する Check 系フックメソッドがエラーを検出せずに処理を終えた直後。または、この項目の派生元項目に関する Derived 系フックメソッドが動作を終えた直後。または、初期値派生オプションをオンに指定してある場合には、この項目の派生元項目に対して InitVal 系フックメソッドによって初期値が設定された直後。

戻り値の意味とデフォルト動作 (戻り値による ItemBase への伝言)

この項目に派生値として設定すべき値 (数値または文字列)。

デフォルト動作: なし。

代行メッセージ (処理の流れに応じて発せられるメッセージ; カスタマイズ可能)

(関係する代行メッセージなし)

使用上のヒントと注意事項

派生値を求める (算出する) 際にセントラル側の特定の資源 (データベースの参照など) が必要な場合には、この項目フックメソッドを用いるのがよい。セントラル側およびローカル側の特定の資源を必要としない場合には (あるいは双方に同じ資源がある場合には)、項目フックメソッド DerivedLC を用いるのがよい。

このフックメソッドのパラメタとして指定した一つまたは複数の項目が、派生元項目になる。

複数の派生元項目がある場合、それぞれの派生元の値の変化に応じてこのフックメソッドが呼び出されることになる。

項目に値を設定する方法には、キーボードやマウスで直接インプットする方法 (手入力) と他の項目へのインプットを契機とする Derived フックメソッドで値を設定する方法 (派生設定) の 2 種類がある。ところで、RelCheck フックメソッドは項目間の関係に関する整合性をチェックするものであるが、これが呼び出されるのは、手入力による場合であって、派生設定の場合には呼び出されないことに注意が必要である。すなわち、Derived フックメソッドの中で項目の値を派生設定する場合には、もしも RelCheck フックメソッドがあれば、そこで行う関係チェックに矛盾しない値にする必要がある。

普通には、項目への値の設定は、手入力または派生設定のどちらか一方で行うだけである。しかし、手入力と派生設定の両方を用いる可能性のある項目も存在する。このような項目を二股データ項目と呼ぶ。すなわち、二股データ項目とは、入力項目であって、なおかつ Derived フックメソッドによって値が設定されることのある項目である。

二股データ項目の制御は、一筋縄ではいかない。すでに一方の方法で値が設定されている際に、もう一方の方法での値の設定方法が問題になるからである。つまり、どちらの値を優先するのかという問題があるのである。さらに、二股データ項目への値の設定は、MANDALA.net が起動する再計算 (Recalc) 処理の中でも実施されるので、いつ再計算がなされても正しい値が設定されるように、プログラムを作成しておく必要がある。

二股データ項目に正しく対応するには、それぞれの状況に応じて処置することが基本である。すなわち、手入力か派生設定か、どちらの方法で二股データ項目の値が設定されたのかを示すフラグを設けて、手入力があったときに動作するフックメソッド Check (入力チェック)、および Derived (派生値) においてそのフラグを参照して状況に応じた値を設定するわけである。

なお、フラグを設けずにこの問題を解決した例がサンプルの受注業務というアプリにある。使用例の中の商品単価_派生値というフックメソッドをご参照ください。この例では、商品コードが変更されたことによる派生の場合には、派生値を採用し、そうではない場合は、手入力を優先させている。すなわち、商品単価は商品コードによって決まるものであるが、手入力で変更した場合には、それを尊重するようになっている。

MANDALA.net が起動する再計算 (Recalc) 処理の中は、画面の中の項目に関する Check 系フックメソッドの処理の後に、Derived フックメソッドが呼び出されるようになっている。したがって、Check 系フックメソッドの中で読み込んだデータを Derived フックメソッドの中で参照するような場合に、同じバッファをいろいろな項目の Check 系フックメソッドの中で重複して用いていると、問題が生じる。

したがって、異なる項目の Check 系フックメソッド用には、異なるバッファを用いるようにしてください。

フックメソッドすなわち、Derived フックメソッドの中で項目の値を派生設定する場合には、もしも RelCheck フックメソッドがあれば、そこで行う関係チェックでエラーになるような使い方ができる。

派生元としては、ボディ項目および拡張ボディ項目が混在してはならない (ただし、単一スクロール制御オプションがオンの場合は混在可能)。ちなみに、ボディ項目および拡張ボディ項目からヘッド部 (またはテール項目) への派生は、派生を階層化することで実現できる。すなわち、ボディ項目からヘッド部のバーチャル項目 X に派生させ、ボディ項目からヘッド部のバーチャル項目 Y に派生させることにしておき、さらに X および Y からヘッド部 (またはテール項目) への派生させればよい。

関連事項

Check 系の項目フックメソッドの戻り値が 0 の場合 (または Check 系の項目フックメソッドが組み込まれていない場合)、まず関連をもつ項目フックメソッド Derived (本フックメソッド) または DerivedLC が呼び出され、さらにこの後に関係をもつ項目群フックメソッド RelCheck または RelCheckLC が呼び出される。

項目に値を設定する役割を果たす項目フックメソッドには、この他に DerivedLC, Furigana, InitVal, InitValLC, SList, Term がある。また、パラメタに ByRef 指定をした Check 系の項目フックメソッドによっても項目に値を設定することができる。

項目に値を設定する役割を果たす項目フックメソッドには、この他に DerivedLC, Furigana, InitVal, InitValLC, SList, Term がある。

Derived 系の項目フックメソッドに関係の深いプロパティに DerivedByInitVal, DerivedCanceled, DerivedFrom, DerivedOrigin がある。

使用例

' 発注元コードの後に動作して、発注元名称を表示する。
Friend Function 派生値(ByVal fB As FormBase, ByVal 発注元コード As String) As String
    If 発注元コード = String.Empty Then
        Return String.Empty
    Else
        Return CType(fB.myFormHook, 受注業務).発注元レコード.発注元名称
    End If
End Function ' 派生値
// 発注元コードの後に動作して、発注元名称を表示する。
internal string 派生値( FormBase fB, string 発注元コード ) {
    if (発注元コード == string.Empty) {
        return string.Empty;
    }
    else {
        return ((受注業務)fB.myFormHook).発注元レコード.発注元名称;
    }
} // 派生値
// 発注元コードの後に動作して、発注元名称を表示する。
String 派生値( FormBase fB, String 発注元コード ) {
    if (発注元コード.equals("")) {
        return "";
    } else {
        return ((受注業務) fB.myFormHook).発注元レコード.発注元名称;
    }
} // 派生値