解決策が見つからないような問題のヘッドスクラッチャーが1つあります。
VisualForceページをクライアント用のPDFとして作成しています。これは基本的に、きちんとフォーマットされたレポートであり、入力テキストボックスなどがなく、一部のデータ(添付ファイル)にアクセスできません。
添付ファイルは通常、商談の一部ですが、これはかなりカスタマイズされた設定であるため、データを格納する商談テーブルにぶら下がっている2つのカスタムオブジェクトがあります。画像の添付ファイルを除いて、すべての通常のデータを取得しました。
基本的に、OpportunitiesにはカスタムオブジェクトSFDC_520_Quote__cがあり、クライアントはこれを「部屋」と呼びます。各部屋には、製品などへのリンクを持つSFDC_520_QuoteLine__cオブジェクトの選択がアタッチされています。これは私が行うことができます。
ただし、この「部屋」レベルで添付された画像には、SFDC_520_Quote__c.idフィールドのParentIDが与えられます。これにより、SFDC_520_Quote__cと添付ファイルの間に定義された関係がないため、SOQLステートメントをまとめてデータを読み取ることが困難になります。
フィールドを追加できることはわかっていますが、他の誰かが離れているところから拾い上げているので、利用可能な時間内に既存のデータをどのように更新するのかわかりません。
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に基づいているため、理想的には、visualforceからゲッターにパラメーターを渡すことができないことを除いて、「getAttachments」などのゲッターにroom.idを渡す必要があります。
したがって、次のようになります。
<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ページを呼び出すだけです。
助けてください。