Force.com開発者コース研修のDEV541内演習1-1です。
ApexトリガHelloWorldPositionTriggerから
ApexクラスHelloWorldPositionClassを呼び出す
シンプルなコード。
// Apex Code 演習1-1
// 募集職種(Position__c)に新規レコードが格納される直前、もしくは更新直前に
// 処理される
//
// 起動はSystem権限で行われる
//
// Apexトリガを宣言する場合、classキーワードの代わりにtriggerを使う
// onの後に発生元オブジェクト、括弧内は発生の原因となるイベントを書く
trigger HelloWorldPositionTrigger on Position__c (before insert, before update) {
// Apexクラスのクラス名、トリガ名、メソッド名、変数名などは
// 大文字小文字区別しない
// Apexトリガ内で使えそうなTriggerクラスの主要な静的フィールド
// Trigger.new: トリガ発生元となったレコード群
// Trigger.newMap: 同じく発生元となったレコード群だが
// IDとレコードのMapとして使える
// Trigger.old: トリガ発生元となったレコード群だがレコード操作前の
// 状態で格納されている
// Trigger.oldMap: Mapのold版
// Trigger.isInsert: 発生原因が新規追加の場合、真
// Trigger.isUpdate: 発生原因が更新だった場合、真
// Trigger.isDelete: 発生原因が削除だった場合、真
// Trigger.isUndelete: 発生原因がゴミ箱から復帰の場合、真
// Trigger.isBefore: 発生原因が格納直前の場合、真
// Trigger.isAfter: 発生原因が格納直後の場合、真
List<position__c> positions = Trigger.new;
// ApexクラスHelloWorldPositionClassの静的メソッドhelloWorld()を
// 呼び出している
// メソッド呼び出しはそっくりJavaとおなじ
// 勿論インスタンスメソッドとしても実装できる
HelloWorldPositionClass.helloWorld(positions);
}
こっちがApexトリガから
呼び出されるApexクラス。
// アクセス修飾子はほぼJavaと同じ
// (globalやwebserviceなどJavaにないものもある)
public class HelloWorldPositionClass {
// 静的メソッドhelloWorld()
// 引数: positions 募集職種レコード群
// 戻り値: なし
public static void helloWorld(List<Position__c> positions){
// Java5風のfor文も書ける
for (Position__c p:positions){
// Javaと違うのは文字列はシングルクォート
// で囲むこと
if (p.Hello__c != 'World') {
// カスタムオブジェクトや項目は__cがつく
p.Hello__c = 'World';
}
}
}
}
宣言的なトリガ(ワークフロー)では
起動時に条件や対象レコードの選択が出来たが、
Apexコードでトリガを書く場合は
このtriggerクラスで
条件チェックやレコードのより分けをして
実際の処理を別のクラスに記述するのが
一般的である。
この辺りはコーディングなので
正直実装はバラバラになってしまうので
コーディング規約で開発者間で品質が均質に
したほうがいいだろう。
追記:
この処理両方とも insert や update がなく、
単にTrigger.new上のレコード情報を上書きしているだけ
である。
これはbefore insert, before updateでのトリガ起動
であるためこの処理の後に
実際の追加・更新処理が働くため記述されていない。
0 件のコメント:
コメントを投稿