カスタムリストコントローラによるレコードの一括更新
一括更新を実行するページを作成するには、StandardSetController クラスに含まれるプロトタイプオブジェクトを使用します。
リストコントローラは、2 つのレコードセットを追跡します。1 つは、条件検索で選択されたすべてのレコードが含まれるプライマリリストで、もう 1 つはユーザが選択したレコードが含まれるセカンダリリストです。セカンダリリストは通常、ユーザがチェックボックスをオンにしてレコードを選択できる、標準リストビューページで設定されます。設定後、ユーザはカスタムリストボタンをクリックしてカスタム一括更新ページに移動できます。カスタム一括更新ページでは、プロトタイプオブジェクトが使用されて新しい項目値がユーザの選択したレコードに適用されます。プロトタイプオブジェクトは、ユーザが選択したすべてのレコードを操作します。カスタムコントローラでプロトタイプオブジェクトを取得するには、StandardSetController の getRecord メソッドを使用します。たとえば、Opportunities の一括更新を有効にするには、その関連付けられたオブジェクトの単数形 (Opportunity) を使用して、選択したすべてのレコードの項目値を設定します。
- massupdatestages という Visualforce ページを作成します。
- 次のコントローラを指定します。
1swfobject.registerObject("clippy.codeblock-0", "9"); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17public class selectedSizeWorkaround { 18 19 ApexPages.StandardSetController setCon; 20 21 public selectedSizeWorkaround(ApexPages.StandardSetController controller) { 22 setCon = controller; 23 } 24 25 public integer getMySelectedSize() { 26 return setCon.getSelected().size(); 27 } 28 public integer getMyRecordsSize() { 29 return setCon.getRecords().size(); 30 } 31} 32 - 次のマークアップを指定します。
1swfobject.registerObject("clippy.codeblock-1", "9"); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17<apex:page 18 standardController="Opportunity" 19 recordSetVar="opportunities" 20 extensions="selectedSizeWorkaround" 21 showHeader="false" 22 id="muopp" 23> 24 <apex:form id="muform"> 25 <apex:pageMessage 26 summary="Selected Collection Size: {!mySelectedSize}" 27 severity="info" 28 id="mupms" 29 /> 30 <apex:pageMessage 31 summary="Record Set Size: {!myRecordsSize}" 32 severity="info" 33 id="mupmr" 34 /> 35 <apex:pageBlock title="Opportunity Mass-Update" mode="edit" id="mub1"> 36 <apex:pageMessages /> 37 <apex:pageBlockSection id="mus1"> 38 <apex:inputField value="{!opportunity.stagename}" id="stagename"> 39 <apex:actionSupport event="onchange" rerender="muselectedlist"/> 40 </apex:inputField> 41 </apex:pageBlockSection> 42 <apex:pageBlockButtons location="bottom" id="mubut"> 43 <apex:commandButton value="Save" action="{!save}" id="butsav"/> 44 <apex:commandButton value="Cancel" action="{!cancel}" id="butcan"/> 45 </apex:pageBlockButtons> 46 </apex:pageBlock> 47 <apex:pageBlock title="Selected Opportunities" id="muselectedlist"> 48 <apex:pageBlockTable value="{!selected}" var="opp" id="mutab"> 49 <apex:column value="{!opp.name}" id="oppname"/> 50 <apex:column value="{!opp.stagename}" id="oppstage"/> 51 </apex:pageBlockTable> 52 </apex:pageBlock> 53 </apex:form> 54</apex:page> - [設定] から、[ボタン、リンク、およびアクション] をクリックします。
- [新規ボタンまたはリンク]をクリックします。
- [ボタン表示ラベル] を「フェーズの一括更新」 に設定し、[名前] を「MassUpdateStages」に設定します。
- [表示の種類] を「リストボタン」に設定し、[チェックボックスの表示 (複数レコード選択用)] がオンになっていることを確認します。[動作] を「サイドバーを持つ既存のウィンドウで表示」に設定し、[内容のソース] を「Visualforce ページ」に設定します。作成したページの名前をクリックしてこのボタンに関連付けます。
- [保存] をクリックします。
- [設定] から、 をクリックします。次に、[商談] リストビューの横にある [編集] をクリックします。
- [カスタム���タン] の下で、[フェーズの一括更新] ボタンを [選択したボタン] リストに移動します。
- [保存] をクリックします。
- [商談] タブをクリックします。変更するいくつかの既存の商談を表示する検索条件を選択するか、作成します。
- 各結果の横にチェックボックスが表示されます。任意の数のチェックボックスをクリックし、[フェーズの一括更新] ボタンをクリックして、選択したフェーズを目的の値に変更します。
- [保存] をクリックします。
この例では、1 つの項目を更新する方法を示していますが、プロトタイプオブジェクトの任意の数の項目を参照してユーザが選択したレコードに適用できます。プロトタイプオブジェクト内の、ユーザが設定しない項目は、選択したレコードに影響を与えません。プロトタイプオブジェクトでは、必須かどうかなど、項目のプロパティが保持されます。たとえば、Opportunity.StageName などの必須項目についてページに入力項目を含めた場合、ユーザはその項目に値を入力する必要があります。