Java 如何为apex scheduler创建带有apex的自定义对象?(编译错误:比较参数必须是兼容类型)

Java 如何为apex scheduler创建带有apex的自定义对象?(编译错误:比较参数必须是兼容类型),java,salesforce,apex-code,scheduler,visualforce,Java,Salesforce,Apex Code,Scheduler,Visualforce,我是apex的新手,正在尝试建立一个每天运行的apex时间表类。如果佣金的账户审核日期为两周(14天),计划员将向我们的销售部门发送电子邮件 我几乎完成了该程序,但我不断遇到以下错误: 错误:编译错误:比较参数必须是兼容的类型:Schema.SObjectField,第9行第9列的日期 这是我的密码: global class AccountReviewScheduler implements Schedulable { global void execute (SchedulableC

我是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\u r.Next\u Account\u Review\u Date\u c只是一个字段

我必须将其与记录一起使用,以使其具有价值。然后我可以将该值与system.today()进行比较

我不知道这意味着什么…创建自定义对象?我不知道该怎么做。这是我修改过的代码,我遇到了麻烦。这是我修改后的代码:

这是修改后的代码(星号**表示更改)

更改以粗体显示…我知道自定义obj代码可能是错误的…我是从其他人那里得到的,我不知道该怎么办

注意:基于时间的工作流在此不起作用,因为此电子邮件必须每年(多年)在帐户审核日期前14天发送。基于时间的工作流将在设置为触发一年后工作一次,但不会重复。它们不是有意重现的。见:

我已经阅读了日程安排文档:

并浏览了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,但我仍然有困难


如果您对我的代码有任何帮助/了解,或链接到新资源,我们将不胜感激

我相信您真正想要做的是一个可批处理的接口和一个可调度的接口

schedule界面将允许您执行批处理界面。您将希望使用批处理接口,以便您的代码能够随着可能处于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());
}
}
global不共享类AccountReviewScheduler实现
数据库。可批处理
,Database.Stateful,可调度
{
//批处理方法
全局数据库.Querylocator启动(Database.BatchableContext-bcContext){
返回数据库。getQueryLocator([SELECT
身份证件
,下一个账户审核日期
从…起
账户
哪里
Next_Account_Review_Date_uuc=:System.today().addDays(14)];
}
全局void execute(Database.BatchableContext bcContext,List listcounts)
{
对于(sObject-oSObject:listAccounts){
账户OAAccount=(账户)oSObject;
//在此处建立电子邮件列表
}
//在这里发送电子邮件
}
全局void finish(Database.BatchableContext bcContext){}
//可调度方法
全局无效执行(SchedulableContext sc){
Id batchJobId=Database.executeBatch(新AccountReviewScheduler());
}
}
您的电子邮件逻辑将在batch execute方法中,该方法将成批处理帐户。每个批次在调速器限制方面都有自己的上下文。您可以更改批大小,但默认情况下,它一次处理200条记录

下面是有关批处理接口的一些文档的链接,这些文档有助于填补一些空白


我相信您真正想在这里做的是一个可批处理的接口和一个可调度的接口

schedule界面将允许您执行批处理界面。您将希望使用批处理接口,以便您的代码能够随着可能处于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());
}
}
global不共享类AccountReviewScheduler实现
数据库。可批处理
,Database.Stateful,可调度
{
//批处理方法
全局数据库.Querylocator启动(Database.BatchableContext-bcContext){
返回数据库。getQueryLocator([SELECT
身份证件
,下一个账户审核日期
从…起
账户
哪里
Next_Account_Review_Date_uuc=:System.today().addDays(14)];
}
全局void execute(Database.BatchableContext bcContext,List listcounts)
{
对于(sObject-oSObject:listAccounts){
账户OAAccount=(账户)oSObject;
//在此处建立电子邮件列表
}
//在这里发送电子邮件
}
全局void finish(Database.BatchableContext bcContext){}
//可调度方法
全局无效执行(SchedulableContext sc){
Id batchJobId=Database.executeBatch(新AccountReviewScheduler());
}
}
您的电子邮件逻辑将在batch execute方法中,该方法将成批处理帐户。每个批次在调速器限制方面都有自己的上下文。您可以更改批大小,但默认情况下,它一次处理200条记录

下面是有关批处理接口的一些文档的链接,这些文档有助于填补一些空白


问题在于
帐户。下一个\u帐户\u审查\u日期\u c
在这种情况下,它只是一个字段标记,不引用任何数据。此标记与Apex中的schema/metadata方法一起使用,以获取有关字段本身的信息,例如字段的类型、标签等。帮助的这一部分应该为您提供更多关于该主题的信息
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 });


  }

}