Apexにスケジューラを実装するにはどうすればよいですか?
-
08-10-2019 - |
質問
Salesforce にはスケジューラのような機能がありますが、これは Salesforce が提供する既存の機能と多少結びついており、私の調査の限りサンプル ソース コードは提供されていません。
私がやりたいのは、日付に基づいて単純な電子メールを送信する独自のスケジューラーを作成することです。
ゴール:
カスタムオブジェクト Player
フィールドがあります
startDate : date like '2010-11-01'
email : text field like foo@bar.com
name : player's name like John.
今日の日付が startDate の 1 日前である場合、プレーヤーに電子メールを送信したいと考えています。たとえば、プレイヤーの名前は John
そして今日だったら 2010-12-10
そして1人のプレイヤーの startDat
e は次のように設定されます 2010-12-11
, と言うメール "hello John"
が送信されます。
残念ながら、Apex を使用してこれを行う方法について、オンラインで良い例やチュートリアル、または Salesforce ドキュメントが見つかりません。どこから始めればよいか誰か教えていただけますか?
アップデート
からの答えを拡張したいと思います eyescream.
スケジューラを設定した後、テンプレートを使用して電子メールを送信するなどのフォローアップ アクションを設定したり、カスタム オブジェクト フィールドをいくつかの値に設定したりできます。
以下に、Visualforce 形式のメールテンプレートを使用している人にとって役立つことがわかりました。
他のオブジェクト「custom」への参照を持つカスタムオブジェクト「alertTester」があり、このオブジェクト「custom」でも別のオブジェクト「custom1GrandChild」への参照があり、すべての関係(最大3または5レイヤーまでだと思います)には以下のようにアクセスできます。
以下でテストしましたが、正常に動作します。今、条件が設定されたメールを受信しています:)
<messaging:emailTemplate subject="Hello" recipientType="User" relatedToType="alertTester__c" >
<messaging:plainTextEmailBody >
{!relatedTo.name}
{!relatedTo.custom__r.name}
{!relatedTo.custom__r.custom1GrandChild__r.name}
</messaging:plainTextEmailBody>
</messaging:emailTemplate>
解決
Apex について詳しく説明する前に、コードを含まないソリューションを確認してください。
電子メール アラート + ワークフロー ルールは、このシナリオで必要なすべての機能を提供し、コードなしでクリックするだけで済みます。
他のヒント
もう一度自分の質問に答えます..
以下のリンクから検索してください schedule
http://www.salesforce.com/us/developer/docs/apexcode/index.htm
Apex には、cron タスクを実装して設定できる Schedulable インターフェイスがあるようです。
以下はドキュメントで提供されているサンプルコードです。
global class TestScheduledApexFromTestMethod implements Schedulable {
// This test runs a scheduled job at midnight Sept. 3rd. 2022
public static String CRON_EXP = '0 0 0 3 9 ? 2022';
global void execute(SchedulableContext ctx) {
CronTrigger ct = [SELECT id, CronExpression, TimesTriggered, NextFireTime
FROM CronTrigger WHERE id = :ctx.getTriggerId()];
System.assertEquals(CRON_EXP, ct.CronExpression);
System.assertEquals(0, ct.TimesTriggered);
System.assertEquals('2022-09-03 00:00:00', String.valueOf(ct.NextFireTime));
Account a = [SELECT id, name FROM Account WHERE name =
'testScheduledApexFromTestMethod'];
a.name = 'testScheduledApexFromTestMethodUpdated';
update a;
}
}