2022年7月27日水曜日

ページ・アイテムを無効化すると発生するエラーの対応

 動的アクションの無効化をページ・アイテムに対して実行すると、ページの送信時にエラーが発生することがあります。

以下のページでは、チェックボックス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アクションとして値の設定を選択します。設定タイプの設定としてJavaScript 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のアプリケーション作成の参考になれば幸いです。