Salesforceのプロセスビルダーはフロー図を描くようにビジネスフローを定義でき、
あるオブジェクトの作成時や更新時の項目の値などをもとに、他の項目の値を更新したり出来ます。
使いこなすと非常に便利な機能で、ワークフローよりもメンテナンスも楽に設計することも可能なのではないかと思います。
また、オブジェクトの項目設定だけではなく、メールアクションを呼んだり、Apexクラスを呼んだりすることも出来るので、複数のオブジェクトを更新したり、外部のWebサービスを呼んだりなど、もう少し複雑なビジネスロジックを処理したい場合も重宝します。
ただ、最初にオブジェクトの種類を決めて、そのオブジェクトの項目値によって条件分岐等を行うので、複数の種類のオブジェクトが作成・更新されたときに、汎用的にログを書いたりするのは難しいかと思っていましたが、引数の渡し方も結構フレキシブルにできる方法がありましたので、ご紹介しておきます。
ProcessBuilderからApexクラスを呼ぶためのクラスとその設定
はじめに、呼ばれる側のApexクラスを作成します。
InvocableLoggerというクラスにします。
内容は、デバッグログを吐くだけのクラスですが、ログ出力の部分を変更して、ビジネスロジックを入れれば、様々なことができます。
global class InvocableLogger {
global class LoggingRequest {
@InvocableVariable(required=true)
public ID objId;
@InvocableVariable
public String strComment;
}
@InvocableMethod(label='Called Method for Logging')
global static void createLog(List<LoggingRequest> requests){
for(LoggingRequest requestObj:requests){
System.debug('requestObj.objId@@:'+requestObj.objId);
System.debug('requestObj.strComment@@:'+requestObj.strComment);
//Do something for business logic
}
}
簡単に解説すると、
「@InvocableMethod」のアノーテーションのついたメソッドを、プロセスビルダーの中から呼ぶことができます。そのときの名称(見え方)は「label=」のところに記述します。
今回の場合は、「Called Method for Logging」ですね。
次のここがミソですが、引数のリストのクラスをグローバルで定義します。
「LoggingRequest」としました。なお、この引数の変数に「@InvocableVariable」アノーテーションをつけることで、引数として、プロセスビルダーの中で指定することができます。
今回は、「objId」と「strComment」を定義しましたが、好きなだけ増やすことも出来ますので、ご自由に。
では、上で作成したApexクラスを呼びだすプロセスビルダーを作成してみましょう。
はじめに行うのは、プロセス名と開始のタイミングの指定ですね。
それが終わったら、プロセスを開始する対象のオブジェクトを指定します。
今回は、「リード」オブジェクトにしました。
それが終わったら、発動の条件を設定します。
今回は、「メールアドレス」がNullで無かった場合 と指定しています。
いよいよ、Apexの指定です。Apexクラスのプルダウンには「@InvocableMethod」のアノーテーションがついたメソッドが表示されますので、「createLog」メソッド(見た目は「Called Method for Logging」)を指定します。
すると、自動で、「@InvocableVariable」の必須項目である「objId」が表示されますので、値を設定します。
もうひとつの「strComment」は必須ではないですが、ログに設定するコメント文言を設定したいので、「行を追加」で追加して、任意の文字列を設定しておきます。
以上で、設定は終了です。右上の「有効化」ボタンを押して、有効化し、リードオジェクトを作成して、メールアドレスがNullで無いように設定します。
これで、設定したプロセスが発動し、Apexが呼ばれることになります。
すると、デバッグログを確認すると、値が渡ってきていることが分かりますね。