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

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

DerivedLC (派生値双方) 項目フックメソッド

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

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

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

ローカルピースおよびセントラルピースの双方に同一のものを配置する、またはどちらにも配置しない。一方だけに配置することは禁止されている。

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

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

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

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

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

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

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

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

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

デフォルト動作: なし。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

関連事項

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

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

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

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

使用例

' 受注合計金額を計算して表示する。
Friend Function 派生値双方(ByVal 計_受注金額 As WrpDecimal) As WrpDecimal
    Return 計_受注金額
End Function ' 派生値双方
// 受注合計金額を計算して表示する。
internal WrpDecimal 派生値双方( WrpDecimal 計_受注金額 ) {
    return 計_受注金額;
} // 派生値双方
// 受注合計金額を計算して表示する。
BigDecimal 派生値双方( BigDecimal 計_受注金額 ) {
    return 計_受注金額;
} // 派生値双方
' 受注金額を計算して表示する。
Friend Function 派生値双方(ByVal fB As FormBase, ByVal 受注個数 As WrpDecimal, ByVal 商品単価 As WrpDecimal, ByVal 受注金額 As WrpDecimal, ByVal 商品コード As String, ByVal 前_商品コード As String) As WrpDecimal
    If 商品コード = String.Empty Then
        Return Nothing
    ElseIf 前_商品コード <> 商品コード AndAlso 受注個数 Is Nothing Then
        Return Nothing
    ElseIf 商品単価 Is Nothing Then
        Return Nothing
    ElseIf 受注個数 Is Nothing Then
        Return 受注金額
    Else
        Return New WrpDecimal(受注個数.DecimalV * 商品単価.DecimalV)
    End If
End Function ' 派生値双方
// 受注金額を計算して表示する。
internal WrpDecimal 派生値双方( FormBase fB, WrpDecimal 受注個数, WrpDecimal 商品単価, WrpDecimal 受注金額, string 商品コード, string 前_商品コード ) {
    if( 商品コード == string.Empty ) {
        return null;
    }
    else if( 前_商品コード != 商品コード && 受注個数 == null ) {
        return null;
    }
    else if( 商品単価 == null ) {
        return null;
    }
    else if( 受注個数 == null ) {
        return 受注金額;
    }
    else {
        return new WrpDecimal(受注個数.DecimalV * 商品単価.DecimalV);
    }
} // 派生値双方
// 受注金額を計算して表示する。
BigDecimal 派生値双方( FormBase fB, BigDecimal 受注個数, BigDecimal 商品単価, BigDecimal 受注金額, String 商品コード, String 前_商品コード ) {
    if( 商品コード.length() == 0 ) {
        return null;
    }
    else if( 前_商品コード != 商品コード && 受注個数 == null ) {
        return null;
    }
    else if( 商品単価 == null ) {
        return null;
    }
    else if( 受注個数 == null ) {
        return 受注金額;
    }
    else {
        return new BigDecimal(受注個数.DecimalV * 商品単価.DecimalV);
    }
} // 派生値双方
' 受注合計金額を計算して表示する。
Friend Function 派生値双方(ByVal 計_受注金額 As WrpDecimal) As WrpDecimal
    Return 計_受注金額
End Function ' 派生値双方
// 受注合計金額を計算して表示する。
internal WrpDecimal 派生値双方( WrpDecimal 計_受注金額 ) {
    return 計_受注金額;
} // 派生値双方
// 受注合計金額を計算して表示する。
BigDecimal 派生値双方( BigDecimal 計_受注金額 ) {
    return 計_受注金額;
} // 派生値双方