Salesforce / Apex参数在报表循环中传递

时间:2012-04-04 15:59:57

标签: salesforce visualforce soql

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

我正在为客户端创建一个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页面。

请帮忙。

1 个答案:

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