動的アクションの無効化をページ・アイテムに対して実行すると、ページの送信時にエラーが発生することがあります。
以下のページでは、チェックボックス30歳以上ですか?にチェックを入れたタイミングで、動的アクションによりチェックボックス人間ドックをチェックし、その後無効化しています。
この状態でページを送信すると「人間ドックは値YおよびNに一致する必要があります。」というエラーが発生します。
エラーになる理由と対応方法を紹介します。
上記のページの実装を見てみます。
30歳以上ですか?のチェックボックスはP1_AGE_OVER_30として作成しています。識別のタイプはチェックボックスを選択しています。設定のデフォルトの使用がONなので、チェックが入っているときは、ページ・アイテムの値はY、そうでないときはNになります。
人間ドックのチェックボックスはP1_CLINICAL_SURVEYです。
ページ・アイテムP1_AGE_OVER_30にチェックを入れた時(値がYに変わった時)、ページ・アイテムP1_CLINICAL_SURVEYの値もYにします。
ページ・アイテムP1_AGE_OVER_30に動的アクションを作成します。
識別の名前をCheck ON/OFFとし、タイミングはイベントが変更、選択タイプはアイテム、アイテムはP1_AGE_OVER_30とします。
TRUEアクションとして
値の設定を選択します。
設定の
タイプの設定としてJ
avaScript Expressionを選択し、JavaScript式に以下を記述します。
apex.items.P1_AGE_OVER_30.value
影響を受ける要素の選択タイプをアイテム、アイテムとしてP1_CLINICAL_SURVEYを指定します。
これで、P1_AGE_OVER_30がチェックされたら、P1_CLINICAL_SURVEYにもチェックが入るようになります。P1_AGE_OVER_30のチェックが外れたら、P1_CLINICAL_SURVEYもチェックが外れます。
TRUEアクションを作成し、
アクションとして
無効化を選択します。
影響を受ける要素の
選択タイプは
アイテム、
アイテムは
P1_CLINICAL_SURVEYです。
クライアント側の条件としてタイプがアイテム = 値、アイテムにP1_AGE_OVER_30を選択し、値をYとします。これでページ・アイテムP1_AGE_OVER_30にチェックが入ったとき(値がYになったとき)、P1_CLINICAL_SURVEYもYになりページ・アイテムとして無効化されます。
ページ・アイテムP1_AGE_OVER_30の値がNになったときに、ページ・アイテムP1_CLINICAL_SURVEYを有効化するTRUEアクションも作成します。
識別のアクションは有効化、クライアント側の条件の値はNになります。
以上で、チェックボックス自体は想定通りの動作になります。
30歳以上ですか?のチェックボックスにチェックをいれたときは、人間ドックのチェックボックスはYになります。
この状態で送信ボタンをクリックすると、ページ・アイテムP1_CLINICAL_SURVEYは無効化されているため、サーバーに送信されません。ページ・アイテムP1_CLINICAL_SURVEYの値はYでもNでもないので、エラーが発生します。
クラスapex_disabledを使用すると、画面上の操作を禁止しても、ページの送信の対象とすることができます。
TRUEアクションの無効化を以下に置き換えます。
識別のアクションをJavaScriptコードの実行とし、設定のコードに以下を記述します。クラスapex_disabledはページ・アイテムP1_CLINICAL_SURVEY(要素としてはinput)ではなく、その親となる要素P1_CLINICAL_SURVEY_CONTAINERに追加しています。
document.getElementById("P1_CLINICAL_SURVEY_CONTAINER").classList.add("apex_disabled");
有効化も同様に、以下のコードに置き換えます。
document.getElementById("P1_CLINICAL_SURVEY_CONTAINER").classList.remove("apex_disabled");
以上で対応は完了です。
簡単なアプリケーションですが、以下のエクスポートを置きました。
https://github.com/ujnak/apexapps/blob/master/exports/checkbox-da-error.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完