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 件のコメント:

ClaudeをOpenAI O1のように思考させるDifyサンプルを試す

 Difyの「探索」タブにはさまざまなサンプルが載っており、その1つに「Thinking Claude (OpenAI O1 Alternative)」というものがある。   このサンプルがどういうものか、未だに自分でも解けない以下の問題をためしに聞いてみることにした。 『人類の...