我有一个问题,我似乎无法找到解决方案。
我正在为客户制作一个作为 PDF 格式的 VisualForce 页面,这基本上是一个格式整齐的报告,没有输入文本框等,而且我在访问某些数据(即附件)时遇到了麻烦。
附件通常是机会的一部分,但是,这是一个相当定制的设置,所以我们有两个自定义对象挂在存储数据的机会表上。除了图像附件,我已经检索了所有常规数据。
基本上,Opportunities 有一个自定义对象 SFDC_520_Quote__c,客户称之为“房间”,然后每个房间都有一个选择的 SFDC_520_QuoteLine__c 附加到它的对象,这些对象具有产品等的链接,我可以这样做。
但是,附加在这个“房间”级别的图像被赋予了 SFDC_520_Quote__c.id 字段的 ParentID,这使得我很难将 SOQL 语句放在一起来读取数据,因为 SFDC_520_Quote__c 和附件之间没有定义的关系。
我意识到我可以添加一个字段,但我不知道在我从其他人离开时如何在可用的时间内更新现有数据。
理想情况下,我在visualforce页面中需要做的是在重复循环期间将参数传递给控制器类,然后调用另一个可以对其进行操作的getter,但我无法在控制器端设置变量。
示例(严重截断):
<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”这样的吸气剂,除非你不能将参数从 visualforce 传递给吸气剂。
所以,它可能看起来像:
<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 页面。
请帮忙。