外部キーと複合キー (4) 親子孫の関係で紐づく親を変更できるようにする

最終更新日: 2022年7月4日

設定方法

前ページで説明したサンプルでは、孫モデルCの新規登録画面で、紐づく子モデルBを指定することはできませんでした。そこでスクリプトを使って子モデルBを指定できるように改良します。

読み取り専用設定の解除

モデル参照項目 MODELA_NAME を登録画面で入力可能とします。

モデル参照項目 MODELA_NAME の登録画面で読み込み専用を解除する

絞り込みの設定

同様にモデル参照項目 MODELB_NAME も登録画面で入力可能とします。

さらに絞り込み設定を行い、MODELA_NAME の値によって MODELB_NAME の選択肢を絞り込むものとします。

モデル参照項目 MODELB_NAME の登録画面で読み込み専用を解除し、絞り込み設定を行う

絞り込み元である MODELA_NAME の値が変更されたとき、無効となった選択肢は選択状態を維持しないようにします。

無効となった選択肢は選択状態を維持しない

必須指定

登録画面で入力できるようになった項目 MODELA_NAME と MODELB_NAME は主キーの値を保持するため、必須指定を行います。

MODELA_NAME 項目を必須入力とする
MODELB_NAME 項目を必須入力とする

登録スクリプト

登録のタイミングで、入力項目であるモデルAの選択肢、およびモデルBの選択肢から主キーをセットします。

入力項目から主キーをセットする
// モデルAの選択肢から主キーをセットする
MODELC.MODELAPKEYMODELB = MODELC.MODELANAME;
// モデルBの選択肢から主キーをセットする
MODELC.MODELAPKEYNMODELB = MODELC.MODELBNAMEMODELAPKEY;
MODELC.MODELBPKEY = MODELC.MODELBNAMEMODELBPKEY;

プレゼンテーションモデルからストアモデルへの変換スクリプト

モデルAの選択肢を変更すると、絞り込み処理が行われます。このとき、画面動作を規定するp.actionはAjax処理を行うためGetXmlという値が格納されています。Ajax処理の詳細は「画面機能 > Ajaxによる画面描画」をお読みください。

このタイミングでストアモデルMODELCの入力項目を主キー項目にセットします。これによって(登録画面で)入力値を変更すると同時に参照連動の値も書き変わるようになります。

入力値の変更と同時に参照連動の値を書き換える
if (p.action == "GetXml") {
    if (MODELC.MODELANAME > 0) {
        // モデルAの選択肢から主キーをセットする
        MODELC.MODELAPKEYMODELB = MODELC.MODELANAME;
    }
    if (MODELC.MODELBNAMEMODELAPKEY > 0) {
        // モデルBの選択肢から主キーをセットする
        MODELC.MODELAPKEYNMODELB = MODELC.MODELBNAMEMODELAPKEY;
        MODELC.MODELBPKEY = MODELC.MODELBNAMEMODELBPKEY;
    }
    helper = p.appctx.getBean("MODELCHelper");
    helper.resolvRelatedItem(MODELC, p);
}

動作例

孫モデルCの登録画面では「モデルAの名前 (MODELA_NAME)」「モデルBの名前 (MODELB_NAME)」は初期セットされています。さらに、この値を変更し、紐づく子モデルBを選択し直すこともできます。

孫モデルCの登録画面

「モデルBの名前 (MODELB_NAME)」は絞り込み設定によって、絞り込み元項目「モデルAの名前 (MODELA_NAME)」に関連するものだけを選択できるようになっています。

絞り込み設定が動作している

ここで絞り込み元である「モデルAの名前 (MODELA_NAME)」を変更すると、無効になった選択肢が解除されます。

絞り込み元を変更する

選択し直したタイミングで「プレゼンテーションモデルからストアモデルへの変換スクリプト」が呼び出されます。参照連動を再度、行います。

絞り込みにあわせて参照連動項目が解決される

登録後の詳細画面では、主キー(外部キー)項目が入力された値から適切に設定されています。これは「登録スクリプト」によるものです。

登録スクリプトで主キーの値が適切にセットされる