Salesforceで定期的に実行する方法

Salesforceで定期的に実行する方法

ここらへんを参考に

参考

考慮事項

  • 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]クリック

参考