我有一个问题,我似乎无法找到解决方案。
我正在为客户端创建一个VisualForce页面作为PDF,这基本上是一个整齐格式化的报告,没有输入文本框等,我无法访问一些数据 - 即附件。
附件通常是商机的一部分,但是,这是一个相当自定义的设置,因此我们所拥有的是两个自定义对象,它们悬挂在存储数据的商机表之外。我已经检索了除图像附件之外的所有常规数据。
基本上,商机有一个自定义对象SFDC_520_Quote__c,客户端称之为“房间”,每个房间都有一个SFDC_520_QuoteLine__c对象的选择,它附有产品等链接,我可以这样做。
但是,在这个“房间”级别附加的图像被赋予SFDC_520_Quote__c.id字段的ParentID,这使我很难一起获取SOQL语句来读取数据,因为SFDC_520_Quote__c和之间没有定义的关系。附件。
我意识到我可以添加一个字段,但我不知道如何在我可用的时间内更新现有数据,因为我正在接收其他人离开。
我在visualforce页面中理想的做法是在重复循环期间将参数传递给控制器类,然后调用另一个可以对其执行操作的getter但我在控制器端设置变量时遇到问题。 / p>
示例(严重截断):
<apex:page renderAs="pdf" standardController="Opportunity" extensions="myController">
<apex:repeat value="{!allRooms}" var="room">
<h1>{!room.Name}</h1>
<apex:repeat value="{!room.QuoteLines__r}" var="ql">
<p>{!ql.Product2__r.Name}: {!ql.Product2__r.Description} - {!ql.Description__c}</p>
</apex:repeat>
</apex:repeat>
</apex:page>
我的控制器:
public class myController {
public List<SFDC_520_Quote__c> getAllRooms() {
List<SFDC_520_Quote__c> roomWithQuoteList = [select id, Name, Quote_Amount__c, Quote__c,
(select Item_Order__c, Product2__r.ProductCode, Product2__r.Name, Product2__r.Description, Description__c from QuoteLines__r order by Item_Order__c)
from SFDC_520_Quote__c where Opportunity__c =: ApexPages.currentPage().getParameters().get('id')];
return roomWithQuoteList;
}
}
以上工作正常,但在第一个内部之后我需要获得附件。附件基于room.id,所以理想情况下我需要将room.id传递给像'getAttachments'这样的getter,除非你无法将参数从visualforce传递给getter。
所以,它可能看起来像:
<apex:page renderAs="pdf" standardController="Opportunity" extensions="myController">
<apex:repeat value="{!allRooms}" var="room">
--> something to call a setter with value from {!room.id} <--
<h1>{!room.Name}</h1>
<apex:repeat value="{!room.QuoteLines__r}" var="ql">
<p>{!ql.Product2__r.Name}: {!ql.Product2__r.Description} - {!ql.Description__c}</p>
</apex:repeat>
<apex:repeat value="{!allAttachments}" var="attachment">
<apex:image height="200px" value="{!URLFOR($Action.Attachment.Download, attachment.Id)}"/>
</apex:repeat>
</apex:repeat>
</apex:page>
然后添加到控制器:
private String oppParentID;
public void setParentID(string theID) {
oppParentID = theID;
}
public List<Attachment> getAllAttachments() {
List<Attachment> theAttachments = [select Id, Name, ContentType, .... from Attachment where parentiD =: oppParentID];
return theAttachments;
}
那或者一种方法来修改我的原始getAllRooms()方法来一次执行上述操作,没有关系字段,我无法弄清楚如何使用正确编译的WHERE进行子选择。
我看过很多关于使用查询字符串参数的例子,但没有涉及表格,没有刷新,只是调用VF页面。
请帮忙。
答案 0 :(得分:1)
JamesB,
看起来您已经在getAllRooms
方法中使用的SOQL查询中找到了解决方案!
这是你写的:
List<SFDC_520_Quote__c> roomWithQuoteList = [select id, Name, Quote_Amount__c, Quote__c,
(select Item_Order__c, Product2__r.ProductCode, Product2__r.Name, Product2__r.Description, Description__c from QuoteLines__r order by Item_Order__c)
from SFDC_520_Quote__c where Opportunity__c =: ApexPages.currentPage().getParameters().get('id')];
在我看来,你要做的就是在SOQL查询中添加一个额外的元素:
List<SFDC_520_Quote__c> roomWithQuoteList = [select id, Name, Quote_Amount__c, Quote__c,
(select Item_Order__c, Product2__r.ProductCode, Product2__r.Name, Product2__r.Description, Description__c from QuoteLines__r order by Item_Order__c),
(select Id, Name, ContentType from Attachments)
from SFDC_520_Quote__c where Opportunity__c =: ApexPages.currentPage().getParameters().get('id')];
这应该允许你的嵌套重复与第二次重复的小调整:
<apex:page renderAs="pdf" standardController="Opportunity" extensions="myController">
<apex:repeat value="{!allRooms}" var="room">
<h1>{!room.Name}</h1>
<apex:repeat value="{!room.QuoteLines__r}" var="ql">
<p>{!ql.Product2__r.Name}: {!ql.Product2__r.Description} - {!ql.Description__c}</p>
</apex:repeat>
<apex:repeat value="{!room.Attachments}" var="attachment">
<apex:image height="200px" value="{!URLFOR($Action.Attachment.Download, attachment.Id)}"/>
</apex:repeat>
</apex:repeat>
</apex:page>