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

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

★ sss 仕様のフックメソッド (通常の開発では DerivedLC をお使いください)

DerivedCLC 項目フックメソッド

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

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

項目フックメソッド DerivedLC と同様の役割を果たすものであり、その違いは DerivedLC よりも呼び出される機会が少なくなるように最適化されている点である。 たとえば、再計算 (Recalc) モードにおいては、呼び出されることがない。

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

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

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

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

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

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

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

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

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

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

デフォルト動作: なし。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

関連事項

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

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

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

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

使用例

' 受注合計金額を計算して表示する。
Friend Function DerivedCLC(ByVal 計_受注金額 As WrpDecimal) As WrpDecimal
    Return 計_受注金額
End Function ' DerivedCLC
// 受注合計金額を計算して表示する。
internal WrpDecimal DerivedCLC( WrpDecimal 計_受注金額 ) {
    return 計_受注金額;
} // DerivedCLC
// 受注合計金額を計算して表示する。
BigDecimal DerivedCLC( BigDecimal 計_受注金額 ) {
    return 計_受注金額;
} // DerivedCLC
' 受注金額を計算して表示する。
Friend Function DerivedCLC(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 ' DerivedCLC
// 受注金額を計算して表示する。
internal WrpDecimal DerivedCLC( 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);
    }
} // DerivedCLC
// 受注金額を計算して表示する。
BigDecimal DerivedCLC( 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);
    }
} // DerivedCLC
' 受注合計金額を計算して表示する。
Friend Function DerivedCLC(ByVal 計_受注金額 As WrpDecimal) As WrpDecimal
    Return 計_受注金額
End Function ' DerivedCLC
// 受注合計金額を計算して表示する。
internal WrpDecimal DerivedCLC( WrpDecimal 計_受注金額 ) {
    return 計_受注金額;
} // DerivedCLC
// 受注合計金額を計算して表示する。
BigDecimal DerivedCLC( BigDecimal 計_受注金額 ) {
    return 計_受注金額;
} // DerivedCLC