Salesforceで定期的に実行する方法
Salesforceで定期的に実行する方法
ここらへんを参考に
- http://blog.flect.co.jp/salesforce/2010/08/apex-02db.html
- http://matano-bros.com/blog/archives/category/salesforce
参考
- Salesforce技術サポート Apexスケジューラを分単位で
- 開発コンソールから、スケジュールを登録できる
考慮事項
- 1回のジョブで実行可能なSOQLは100回まで
- 1回のジョブで実行可能なDML処理(Update)は100回まで
日付型は yyyy-MM-dd で指定できる
global with sharing class UpdateContuctOpportunityBatch implements Schedulable { /** * cronにジョブを登録する * 登録するには、VisualForceからメソッドを呼び出す */ public void start() { // この場合、毎時0分0秒に実行 System.schedule('ScheduleName', '0 0 * * * ?', new UpdateContuctOpportunityBatch()); } /** * 強制的に実行 */ public void force() { main(); } /** * cronに登録されたジョブを停止する * [管理者設定] -> [監視] -> [スケジュール済みジョブ]上でジョブを消してもOK */ public void stop() { // 止める処理を書く } /** * スケジューラで起動時に実行される処理 */ global void execute(SchedulableContext sc) { main(); } public void main() { // 実際のバッチ処理内容を書く // スケジュール実行させたい処理 /* // キーマンのリストを取得 List<Contact> contacts = [SELECT id, oppNum__c FROM Contact Limit 1 ]; // キーマンでループ for(Contact contact : contacts ) { // Contactの所有する案件数を取得 List<Opportunity> opps = [SELECT id FROM Opportunity WHERE KeymanRef__r.id = :contact.id]; if(opps.size() >= 0) { contact.oppNum__c = opps.size(); update contact; } } */ // SOQLを大量に呼べないので、あらかじめデータを取得してループで何とかする List<Contact> contacts = [SELECT Id, oppNum__c FROM Contact]; List<Opportunity> opps = [SELECT Id, KeymanRef__r.Id FROM Opportunity WHERE CloseDate >= 2013-01-01 AND ( StageName = '受注' OR StageName = '完了') ]; Map<String, Integer> contactMap = new Map<String, Integer>(); for(Opportunity opp : opps) { Integer i = contactMap.get(opp.KeymanRef__r.Id); if(i != null) { contactMap.put(opp.KeymanRef__r.Id, i + 1); } else { contactMap.put(opp.KeymanRef__r.Id, 1); } } Integer count = 0; for( Contact contact : contacts) { if(count > 100) { break; } Integer i = contactMap.get(contact.id); if(i != null && contact.oppNum__c != i) { contact.oppNum__c = i; update contact; count++; } } } }
開発コンソールから、スケジュールジョブを実行
- Salesforce管理画面から開発コンソールを起動
- [Debug] - [Open Execute Anonymous Window] をクリック
- 以下のコードを入力(毎時1分にHogeScheduleクラスを起動する例)
String jobId_1 = System.schedule('毎時1分に開始','0 1 * * * ?', new HogeSchedule()); system.debug('JobId: ' + jobId_1);
- [Execute]クリック