Memos About Salesforce

Salesforceにハマってたこと!

Salesforce System ValidationとCommandButtonのActionの処理順番およびinputFieldのエラー表示2重?

どこよりもお手軽に不動産投資を!【不動産の道しるべ】

こんにちは、管理人の@Salesforce.Zです。

SalesforceのVisualforcePageを使い、エラーや警告メッセージを表示させる場合がでしょう

今回、System ValidationとCommandbuttonのActionどっちが先に動作するかを共有します

さらに、inputFieldタグのエラー表示挙動も

お楽しみにみてください。

読んだら得ること

★ システムチェックとコマンドボタンのアクション処理順番

目次

システムチェックとコマンドボタンのアクション処理順番

VisualforcePage側で <apex:inputField/>タグと<apex:pageMessages id="msgId"/>タグ を同時に使う場合挙動をしっかりしたほうがいい

なぜなら、エラーがあるのに、ボタンの動きが怪しい時ある

処理順番

結論は

1:System Validation

2:システムチェックでエラーがなければ、ボタンのアクションが動作する

では、System Validationはどのようなものかですね

System Validationの例

イメージをつくため、いくつかの例を列挙させていただきます。

存在しないルックアップ値でボタン操作

前提:フォームにルックアップ項目とボタンがあるとする

StepA.ルックアップ項目にデータベースに存在しない値を入力する

StepB.ボタンを押下する

期待結果:ボタンのアクションに埋めたメソッドは動作しない

原因:ページ側のinputfieldタグによって、ルックアップのSystem Validationが先にに動作する

   エラーがあると、ボタンのアクションメソッドは動作しません

//サンプルページ

<apex:form >
  <apex:inputField id="Field" value="{!acc.Name}"/>
  <apex:message for="Field"/>
  <apex:commandButton value="ボタン操作" action="{!doAction}"/>
</apex:form>

//サンプルクラス

public class TestStudy {
    public Account acc {get; set;}

    public PageReference doAction() {
        try {
            insert acc;
        } catch (Exception ex) {
            acc.Name.addError(ex);
        }
        return null;
    }
}

inputFieldのエラー表示が2重?

オブジェクト設定側の項目名とフォーム上にinputFiedlタグでのラベルと異なる場合に

System Validationによって、下記のようなエラーが発生する オブジェクト設定側の設定で項目名は「顧客名」 フォーム上でラベルを変更し「お客様名」

f:id:jude2016:20181126170802p:plain

前提:フォームにルックアップ項目とボタンがあるとする

   テストオブジェクトの参照項目A(ラベル:顧客名)があるとする

StepA.ルックアップ項目にデータベースに存在しない値を入力する

StepB.ボタンを押下する

期待値が下記のような感じ

f:id:jude2016:20181126170802p:plain

解決方法

オブジェクト設定側で、項目のラベルをページ上でそのまま使う

こんな2重エラーが発生するには、異常系しかないはず