Translate

2011年5月3日火曜日

参照項目をたどって項目を更新するApexトリガのサンプル

Apexトリガで一番最初に考える使い方は

トリガ起動により別のレコードを更新する

というもの。



以下、Force.com開発者コース演習5-1のコード。





// Apex Code 演習5-1
//
// 内定(Offer__c)の新規追加or更新→申込(Job_Application__c)の状況を変更
//
// トリガが複数存在する場合、実行される順番は任意
// ただしSalesforceがいうには現時点での実装はトリガ名の昇順らしい
trigger OfferTrigger on Offer__c (after insert, after update) {

// 申込リスト生成
List<Job_Application__c> jobApps = new List<Job_Application__c>();

// トリガ対象の内定レコードに紐づく申込レコードの名前を取得し
// 内定リストとして入手する
for(List<Offer__c> offers:
[select
// Joinされる場合は
// 内定オブジェクト上に定義されている関連を使用して
// 表現する
// 内定(Offer__c)に関連付けされている親である
// 申込(Job_Application__c)の項目nameをさす
job_application__r.name
// 起点となるオブジェクトを1つだけ指定する
from offer__c
// 内定(Offer__c)のidがトリガ対象レコードのIDに含まれている
where id IN :Trigger.newMap.keySet()]){

// フェッチされた内定リストを1件づつ処理するループ
for(Offer__c offer:offers){

// 内定レコードに紐づく申込レコードのステージを
// Offer Extendedに変更
offer.job_application__r.stage__c = 'Offer Extended';

// 内定レコードに紐づく申込レコードのステータスを
// Holdに変更
offer.job_application__r.status__c = 'Hold';

// 内定リストに追加
jobApps.add(offer.job_application__r);
}
}

// 内定リストに1件以上データがある場合
if (jobApps.size() > 0){
try{
// 内定リストに格納されているレコードを更新し
// 結果を取得する
// 失敗したレコードがある場合でも処理を継続する
// Databaseメソッドの利点の一つとして結果をSaveResult
// クラスインスタンス群として取得できる点にある
Database.SaveResult[] saveResults =
Database.update(jobApps,false);

// エラーとなった件数をカウントする変数
Integer x = 0;
// 更新結果を1件づつ処理するループ
for(Database.SaveResult result:saveResults){
// 更新失敗した場合
if(!result.isSuccess()){
// エラー情報を取得
Database.Error err =
result.getErrors()[0];
// デバッグログへ書き出し
System.debug(
'Unable to update Job Application, ' +
jobApps[x].name +
'. Error:'+ err.getMessage());
}
x++;
}
// 例外発生時処理
} catch (Exception e){
// 例外情報をデバッグログへ出力し、処理継続
System.debug('error updating job applications:' + e);
}
}
}





このサンプルでは

申込と内定の関係を

内定オブジェクト上に申込を格納する参照項目

として定義している。




Salesforce/Force.comでは

DBの関連を

主従関係もしくは参照関係という項目を定義して

実現する。



ここが通常のRDBを使って開発をしている人が

多少違和感を感じてしまう点でもある。



ここでは申し込んだ全員が内定をもらえるわけではないので

主従関係ではなく、参照関係を使用している。


主従関係は強いコンポジション関係になるし
1つのオブジェクトに定義できるカスタム主従関係項目は
数量限定もきびしい(たしか3つだっけ?)されている。

それになにより
ワークフローの項目自動更新は主従関係でないとたどれない。

なので参照項目をたどったトリガ自動更新処理は
Apexトリガを使うことになる。

0 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...