2011-03-29

Force.com : アプリケーションインタフェースにエラーメッセージを表示したい

 
アプリケーションインタフェースにエラーメッセージを表示したい



◆ Trigger

trigger AccountTrigger on Account (before insert) {
 Account[] accounts = Trigger.new;
 for(Account account : accounts) {
  account.addError('全体にえら');
  account.Name.addError('Nameにえら');
 }
}



● sObject Methods

  • void sObject#addError(String msg)
    • レコードにエラーメッセージを追加し、エラー発生から任意の DML 操作を止める
  • void sObject.filed#addError(String msg)
    • レコードのフィールドにエラーメッセージを追加し、 エラー発生から任意の DML 操作を止める
    • インタフェースにフィールドがない場合は[void sObject#addError(String msg)]と同じようにエラーメッセージが表示される
※ [prevents any DML operation from occurring.]が訳せないのであとで確かめる



○ メモ - 取引先(Account)のトリガと salesforce.com 画面

■ insert
trigger AccountTrigger on Account (before insert, after insert) {
 Account[] accounts = Trigger.new;
 if(Trigger.isBefore) {
  for(Account account : accounts) {
   account.addError('ERROR : befor insert');
  }
 } else if(Trigger.isAfter) {
  for(Account account : accounts) {
   account.addError('ERROR : after insert');
  }
 }
}
  1. salesforce.com の編集画面から取引先の保存を行う
  2. 画面上部にエラーメッセージが表示される(取引先の追加は行われない)

■ update
trigger AccountTrigger on Account (before update, after update) {
 Account[] accounts = Trigger.new;
 if(Trigger.isBefore) {
  for(Account account : accounts) {
   account.addError('ERROR : befor update');
  }
 } else if(Trigger.isAfter) {
  for(Account account : accounts) {
   account.addError('ERROR : after update');
  }
 }
}
  1. salesforce.com の編集画面から取引先の保存を行う
  2. 画面上部にエラーメッセージが表示される(取引先の更新は行われない)

■ delete
trigger AccountTrigger on Account (before delete, after delete) {
 Account[] accounts = Trigger.old;
 if(Trigger.isBefore) {
  for(Account account : accounts) {
   account.addError('ERROR : befor delete');
  }
 } else if(Trigger.isAfter) {
  for(Account account : accounts) {
   account.addError('ERROR : after delete');
  }
 }
}
  1. salesforce.com の詳細画面から取引先の削除を行う
  2. 「削除に関する問題」の画面でエラーメッセージが表示される(取引先の削除は行われない)



○ TODO

  • Trigger で別のオブジェクトのレコードを更新した場合の処理



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考

 

Force.com : メッセージを表示したい[Visualforceタグ]


メッセージを表示したい (<apex:pageMessages>)



◆ <apex:pageMessage> コンポーネント

<apex:page>
    <apex:pageMessages />
</apex:page>

属性備考
showDetail="(true|false)"
  • メッセージの詳細を表示するかを指定
  • デフォルト : false
  • 型 : Boolean
※ 詳細は apex:pageMessages を参照



◆ Message クラス

ApexPages.addMessage(new ApexPages.Message(ApexPages.severity, summary[, detail]));

引数備考
ApexPages.severity
  • レベルを指定する
    • CONFIRM
    • ERROR
    • FATAL
    • INFO
    • WARNING
summary
  • メッセージを指定する
detail
  • 詳細メッセージを指定する
※ 詳細は Message Class を参照



○ Visualforce ページでメッセージを表示したい

Ex.
  1. ボタンを押下する
  2. メッセージ(詳細含む)を表示する

■ Visualforce ページ
<apex:page controller="SampleController">
    <apex:form >
        <apex:commandButton value="button" action="{!redraw}" rerender="out" />
    </apex:form>
    <p />
    <apex:outputPanel id="out">
        <apex:pageMessages showDetail="true" />
    </apex:outputPanel>
</apex:page>


■ SampleController クラス
public with sharing class SampleController {
    /** 再描画処理 */
    public PageReference redraw() {
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM, 'summary - confirm', 'detail - confirm'));
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'summary - error', 'detail - error'));
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.FATAL, 'summary - fatal', 'detail - fatal'));
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'summary - info', 'detail - info'));
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.WARNING, 'summary - warning', 'detail - warning'));
        return null;
    }
}


■ 画面イメージ


■ 備考
  • ApexPages.severity の表示順は上記の画像イメージの通り(だと思う)
  • ApexPages.severity が同じメッセージは追加された順に同じ枠にリスト形式で表示される
  • 同じメッセージ(※)は表示されない (※ summary と detail が同じ)
  • 同じメッセージは ApexPages.severity に関係なく最初に追加された ApexPages.severity に表示される



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考