1

我有一个问题,我似乎无法找到解决方案。

我正在为客户制作一个作为 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 页面。

请帮忙。

4

1 回答 1

1

詹姆斯B,

看起来您已经在方法中使用的 SOQL 查询中找到了解决方案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')];

在我看来,您所要做的就是在 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>
于 2012-04-05T03:34:48.400 回答