views:

412

answers:

2

I have created a component that is using a custom class. I added this component to an email template. When I try and load the template this is the error message I receive. List has no rows for assignment to SObject. From what I can tell the attribute I have created is not passing the value to my class.

Also, when I first pull up the task page to send an email, the OpportunityID is part of the querystring with a key of p3_lkid. However, when I select the template the querystring is reset.

I have enclosed the relevant code below.

Component

<apex:component access="global" controller="ProbeQuoteEmail">
<apex:attribute name="opportunityID"
description="This is the ID of the opportunity."
type="ID" assignTo="{!opportunityID}" />

<apex:repeat value="{!ProbeProducts}" var="p">
<p>{!p.ProductFamily__c}</p>
<table border='1'>
<apex:repeat value="{!p.OpportunityLineItems}" var="line">

<tr>
<td ><apex:outputText value="{!line.Quantity}"/></td>
<td ><apex:outputText value="{!line.PricebookEntry.Name}"/></td>
<td align="right"><apex:outputField value="{!line.UnitPrice}"/></td>
<td align="right"><apex:outputField value="{!line.TotalPrice}"/></td>
</tr>

</apex:repeat>
</table>
</apex:repeat>

</apex:component>

Email Template

<messaging:emailTemplate subject="Your requested quote n° {!relatedTo.Id}" 
      recipientType="Contact" relatedToType="Opportunity">
<messaging:plainTextEmailBody >
Dear {!recipient.name},

        Thank you for your continued interest in our offering. Please see the attached quote per your request.

        Feel free to contact me if you have any questions.

        Regards,
        {!$User.FirstName} {!$User.LastName}

</messaging:plainTextEmailBody>
    <messaging:attachment renderAs="pdf" filename="{!relatedTo.name}">          

    <c:ProbeQuoteProducts opportunityID="{!relatedTo.Id}"/>

    </messaging:attachment>      


</messaging:emailTemplate>

Apex Class

public class ProbeQuoteEmail {
    Schema.DescribeFieldResult F = Product2.Family.getDescribe();
    List<Schema.PicklistEntry> P = F.getPicklistValues();

    public Opportunity Probe { get; set; } 

    public Id opportunityID { get; set; } 

    public List<Opportunity> ProbeProducts = new List<Opportunity>();

    Integer Counter = 1; 

    public ProbeQuoteEmail() {

        for (Schema.PicklistEntry fam:P){
            Integer i = 0;
            String FamilyLabel = fam.GetLabel();

            Probe = [SELECT o.Id, o.Name, o.Amount, o.ProductFamily__c, (SELECT op.Quantity, op.UnitPrice, op.TotalPrice,
                      op.PricebookEntry.Name, op.OpportunityId, op.PricebookEntry.ProductCode, 
                      op.PricebookEntry.Product2.Family, op.LineCount__c  
                      FROM OpportunityLineItems op WHERE op.PricebookEntry.Product2.Family = :FamilyLabel) 
                      FROM Opportunity o where Id = :opportunityID];

               Probe.Amount = 0; 
               Probe.ProductFamily__c = FamilyLabel;

               for(i=0;i<Probe.opportunityLineItems.size();i++) {
                    Probe.Amount += Probe.opportunityLineItems[i].TotalPrice;   
                    Probe.opportunityLineItems[i].LineCount__c = Counter;
                    Counter++;
               }

            ProbeProducts.add(Probe);
        }
    }

    public List<Opportunity> getProbeProducts() {
        return ProbeProducts;
    }


}
A: 

What is the code for your task page?

+1  A: 

I think it may have to do with the fact that you are accessing the opportunityID variable within the constructor. The constructor gets called first, before any variables are set. You may want to put this logic in the setter instead.

Marplesoft

related questions