1

我是 apex 的新手,正在尝试构建一个每天运行的 apex 时间表课程。如果佣金的帐户审核日期是两周(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 天发送。基于时间的工作流将在设置为触发一年后运行一次,但不要重复。它们不会按设计重复出现。请参阅: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 中的模式/元数据方法一起使用,以获取有关字段本身的信息,例如它的类型、标签等。帮助的这一部分应该为您提供更多关于该主题的信息http://www.salesforce .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 回答