Translate

2011年5月3日火曜日

Apexトリガのサンプルコード

以下のコードは、
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 件のコメント:

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

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