У меня есть одна головоломка с проблемой, из-за которой я не могу найти решение.Параметр 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.
Пожалуйста, помогите.
Обновление: было предложено только сделать это _may_ с компонентом вершины T – JamesB