1

カスタム クラスを使用するコンポーネントを作成しました。このコンポーネントを電子メール テンプレートに追加しました。テンプレートを読み込もうとすると、次のようなエラー メッセージが表示されます。List には、 SObject に割り当てる行がありません。私が作成した属性から、クラスに値を渡していないことがわかります。

また、最初にメールを送信するためにタスク ページを表示したとき、OpportunityID はクエリ文字列の一部であり、キーはp3_lkidです。ただし、テンプレートを選択すると、クエリ文字列がリセットされます。

以下に関連するコードを同封しました。

成分

<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>

メール テンプレート

<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>

アペックスクラス

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;
    }


}
4

1 に答える 1

1

コンストラクター内で機会 ID 変数にアクセスしていることが関係している可能性があると思います。コンストラクターは、変数が設定される前に最初に呼び出されます。代わりに、このロジックをセッターに入れたいと思うかもしれません。

于 2009-08-06T16:31:52.973 に答える