第一次发送时附件为空白,但通过Apex控制器第二次发送时有数据 - SFDC NPSP

问题描述:

我正在处理一个要求,即必须通过SFDC中的Apex类发送pdf作为附件。NPSP。所以下面是我的程序结构 -第一次发送时附件为空白,但通过Apex控制器第二次发送时有数据 - SFDC NPSP

VisualForcePage1有两个输入 - input1和input2。该页面还有 3个按钮 - 预览,发送电子邮件和取消。根据 input1和input2的值,ApexClass1使用方法getOutputMethod()计算output1, output2,output3,output4和output5的值。 这些output1 ... 5变量的值存储在自定义对象 中,比如Custom_Object__c。

public void getOutputMethod() { 
    // calculate values of output1...5 
    // store these values in Custom_Object__c 
} 

当用户点击预览按钮,方法previewPDF()被调用,后者又调用getOutputMethod()。输出变量(output1 ... 5)存储在Custom_Object__c中,然后控件被重定向到VisualForcePage2,该属性的renderAs ='pdf'。生成的pdf有准确的数据。

当用户单击发送电子邮件按钮时,将调用emailPDF()方法,该方法将调用getOutputMethod()。输出变量(output1 ... 5)存储在Custom_Object__c中。 但是邮件发送的附件pdf第一次没有数据。对于相同的输入值,当第二次发送发送电子邮件按钮以及随后的试验时,附件pdf具有数据。以下是PDF格式发送电子邮件的代码片段 -

Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); 
// Reference the attachment page and pass in the account ID 
PageReference pdf = Page.VisualForcePage2;       
pdf.getParameters().put('paramater1',input1); 
pdf.getParameters().put('paramater2',input2);    
pdf.setRedirect(true);  
// Take the PDF content  
Blob b = pdf.getContentAsPDF();    
// Create the email attachment  
String filename = 'myPage.pdf'; 
Messaging.EmailFileAttachment efa = new Messaging.EmailFileAttachment(); 
efa.setFileName(filename); 
efa.setBody(b);     
// Sets the paramaters of the email  
String subject = 'Subject';             
body = 'Hello';    
email.setSubject(subject); 
email.setToAddresses('[email protected]'); 
email.setPlainTextBody(body);  
email.setFileAttachments(new Messaging.EmailFileAttachment[] {efa});  
// Sends the email 
Messaging.SendEmailResult [] r = Messaging.sendEmail(new Messaging.SingleEmailMessage[] {email}); 

VisualForcePage2的ApexClass2查询Custom_Object__c与输入1 和输入2为如下参数 -

public ApexClass2() { // constructor 
    var1 = ApexPages.currentPage().getParameters().get('paramater1'); 
    var2 = ApexPages.currentPage().getParameters().get('paramater2');    getCustomObject(); 
}  

public List<Custom_Object__c> getCustomObject() { 
    List<Custom_Object__c> coList = new List<Custom_Object__c>([ 
SELECT field1, field2, field3, field4, field5 
FROM Custom_Object__c 
WHERE field1 =: var1 
AND field2 =: var2 ]);  
    return coList;                       
}  

请建议。

问题已解决。发送附件的代码在更新之前从数据库中提取记录。因此,它选择空白或旧数据。

我在负责发送附件邮件的方法开始时添加了@future(callout=true)