我是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-the-the-the-the -s-schedulerwith-the-apex-s.html以及官方Apex指南中的教程14,但我仍然遇到麻烦。
我非常感谢您对我的代码/新资源链接的任何帮助/见解。
答案 0 :(得分: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对象上,我还假设电子邮件模板需要到期的帐户才能成功创建。
希望这可以帮到你。
答案 1 :(得分: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