1

私は apex を初めて使用し、毎日実行される apex スケジュール クラスを構築しようとしています。コミッションのアカウント審査日が 2 週間 (14 日) 先の場合、スケジューラーは当社の営業部門に電子メールを送信します。

プログラムはほぼ完了しましたが、次のエラーが発生し続けます。

エラー: コンパイル エラー: 比較引数は互換性のある型である必要があります: Schema.SObjectField、行 9 列 9 の日付

これが私のコードです:

global class AccountReviewScheduler implements Schedulable
{
    global void execute (SchedulableContext ctx) 
    {
        sendEmail();
    }
public void sendEmail()
{
    if (Account__r.Next_Account_Review_Date__c == System.today().addDays(14))
    {
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        Mail.setTemplateId('00XF0000000LfE1');
        Messaging.sendEmail(new Messaging.SingleEmailMessage[] {mail });
    }
}

}

私はいくつかの調査を行い、別のディスカッション ボードのコメント投稿者は、Account__r.Next_Account_Review_Date__c は単なるフィールドであるため、機能していないと言いました。

値を持たせるには、レコードで使用する必要があります。次に、その値を system.today() と比較できます。

私はそれが何を意味するのか分かりません....カスタムオブジェクトを作成しますか? これを行う方法がわかりません。これが私が問題を抱えている修正されたコードです。これが私の修正されたコードです:

これが改訂されたコードです(アスタリスク**は変更を示します)

global class AccountReviewScheduler implements Schedulable
{
    global void execute (SchedulableContext ctx) 
    {
        sendEmail();
    }
public void sendEmail()
{
    **CustomObj__c co = [select Account__r.Next_Account_Review_Date__c from CutomObj__c limit 1];**
    **if(co.Account__r.Next_Account_Review_Date__c == system.today().addDays(14))** 
    {
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        Mail.setTemplateId('00XF0000000LfE1');
        Messaging.sendEmail(new Messaging.SingleEmailMessage[] {mail });
    }
}

}

変更点は太字で示されています...カスタム obj コードが間違っている可能性があることはわかっています...他の人から取得したので、どうすればよいかわかりません。

注: 時間ベースのワークフローはここでは機能しません。このメールは毎年 (何年にもわたって) アカウントの審査日の 14 日前に送信される必要があるためです。時間ベースのワークフローは、1 年間トリガーするように設定された後、1 回だけ機能しますが、繰り返されません。設計上、再発しません。参照: http://success.salesforce.com/questionDetail?qId=a1X30000000JnPMEA0

スケジューリングに関するドキュメントを読みました: http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_scheduler.htm

Apex ワークブックのチュートリアル: http://blogs.developerforce.com/developer-relations/2010/02/spring-10-saw-the-general-availability-of-one-of-my-favorite-new- features-of-the-platform-the-apex-schedulerwith-the-apex-s.html および公式 Apex ガイドのチュートリアル 14 を参照しましたが、まだ問題が発生しています。

私のコードへのヘルプ/洞察/新しいリソースへのリンクは大歓迎です。

4

2 に答える 2

1

問題はAccount__r.Next_Account_Review_Date__c、この状況でこれを使用することです。フィールドトークンはデータを参照していません。このトークンは、Apex の schema/metadata メソッドで使用され、フィールド自体に関する情報 (タイプ、表示ラベルなど) を取得します。 .com/us/developer/docs/apexcode/index_Left.htm#CSHID=apex_methods_system_fields_describe.htm

この問題が発生する理由は、作業するデータベースからデータを選択していないためです。このように見えれば、メール送信メソッドが機能すると思います

public void sendemail(){
  for(Account acc : [SELECT Id FROM Account WHERE Next_Review_Date__c = :system.today().addDays(14)]){

    Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
    mail.setTemplateId('00XF0000000LfE1');
    mail.setTargetObjectId(acc.Id);
    Messaging.sendEmail(new Messaging.SingleEmailMessage[] {mail });


  }

}

これにより、次のレビュー日が 14 日に等しいすべてのアカウントが選択されます。次に、それらをループしてメールを送信します。Next_Review_Date__c フィールドが Account オブジェクトにあると仮定し、電子メール テンプレートがそれ自体を正常に作成するために期日が迫っている Account が必要であると仮定しました。

うまくいけば、これはあなたを助けます。

于 2012-07-16T14:50:25.557 に答える
0

ここで本当にやりたいことは、バッチ可能なインターフェイスとスケジュール可能なインターフェイスです。

スケジュール インターフェイスでは、バッチ インターフェイスを実行できます。バッチ インターフェースを使用して、14 日間の通知ウィンドウを超えた状態になる可能性のあるアカウントの数に合わせてコードを拡張することをお勧めします。そのための必要最小限のコードは次のようになります。

global without sharing class AccountReviewScheduler implements 
Database.Batchable<sObject>
, Database.Stateful, Schedulable
{
//Batchable Methods
global Database.Querylocator start(Database.BatchableContext bcContext) {
    return Database.getQueryLocator([SELECT 
                                        Id
                                        , Next_Account_Review_Date__c 
                                    FROM 
                                        Account 
                                    WHERE 
                                        Next_Account_Review_Date__c = :System.today().addDays(14)]);
}

global void execute(Database.BatchableContext bcContext, List<sObject> listAccounts)
{
    for (sObject oSObject : listAccounts) {
        Account oAccount = (Account) oSObject;

        //Build a list of email messages here
    }

    //Send Email Here
}

global void finish(Database.BatchableContext bcContext) {}

//Schedulable Methods
global void execute(SchedulableContext sc) {
    Id batchJobId = Database.executeBatch(new AccountReviewScheduler());
}
}

電子メールのロジックは、バッチでアカウントを処理するバッチ実行メソッドにあります。各バッチには、ガバナー制限に関して独自のコンテキストがあります。バッチ サイズは変更できますが、デフォルトでは一度に 200 レコードを処理します。

これは、いくつかの空白を埋めるのに役立つはずのバッチ インターフェイスに関するドキュメントへのリンクです。

http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_batch_interface.htm

于 2012-07-16T14:45:53.223 に答える