2012-04-04 3 views
1

У меня есть одна головоломка с проблемой, из-за которой я не могу найти решение.Параметр Salesforce/Apex, проходящий в цикле отчетов

Я делаю страницу VisualForce как PDF для клиента, это, в основном, аккуратно отформатированный отчет, никаких текстовых полей ввода и т. Д., И у меня возникают проблемы с доступом к некоторым данным, а именно к вложениям.

Вложения обычно являются частью возможностей, однако это довольно настраиваемая настройка, так что у нас есть два пользовательских объекта, зависающих от таблицы возможностей, в которой хранятся данные. Я извлекал все обычные данные отдельно от вложений изображений.

В основном возможности имеют пользовательский объект SFDC_520_Quote__c, который клиент называет «комнатой», в каждой комнате есть набор прикрепленных к нему объектов SFDC_520_QuoteLine__c, которые имеют ссылки на продукты и т. Д., Это я могу сделать.

Однако изображения, прикрепленные на уровне «комнаты», получают ParentID поля SFDC_520_Quote__c.id, из-за чего мне сложно получить инструкцию SOQL вместе, чтобы прочитать данные, поскольку между SFDC_520_Quote__c нет определенных отношений и приложение.

Я понимаю, что могу добавить поле, но я понятия не имею, как я обновляю существующие данные за доступное мне время, поскольку я собираюсь от кого-то другого уйти.

Что мне в идеале нужно сделать на моей странице visualforce, это передать параметр классу контроллера во время цикла повтора, а затем вызвать другой геттер, который может действовать на него, но у меня возникли проблемы с настройкой переменной на стороне контроллера.

Пример (сильно усеченный):

<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 некоторому getter, например 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() метод, чтобы сделать выше за один раз, нет поля отношений, и я не могу понять, как сделать подзаголовок с ГДЕ, который компилируется правильно.

Я видел множество примеров, в которых все говорят об использовании параметров строки запроса, но нет формы, нет обновления, просто вызов страницы VF.

Пожалуйста, помогите.

+0

Обновление: было предложено только сделать это _may_ с компонентом вершины T – JamesB

ответ

1

JamesB,

Похоже, у вас уже есть решение в запросе 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> 
Смежные вопросы