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