オブジェクトの項目名に変数を使用してみよう!(その2)【Salesforce】

どうも、お久しぶりとなります、はっしーです!
12月となり季節も冬となりましたが、夏日を記録する日もあったりして本当に冬なのかなと思うときもありますね・・・
寒暖差で体調を崩さないように気をつけてたいですね!

さて、今回のお題は
ズバリ、取得したレコードの対象項目を変数で指定し、値を表示する!です!
このお題を見てピンと来た皆さま・・・そうです!
ちょうど1年前に投稿したブログ内容の、次のステップとなります。(↓のリンクを参照)

 

オブジェクトの項目名に変数を使用してみよう!【Salesforce】

 

前回はAPEX上で対象項目を変数で指定して値を取得したり、値をセットしましたが、今回はvisualforce(以下VF)上で対象項目を変数で指定し、値を表示するという内容です。

取得したオブジェクトの値をVF上で表示する際、一般的な書き方は

 

{!オブジェクト名.項目名}(例、{!Sobject__c.API__c})

 

となります。
APEXの時と同様に、この記述方法ですと、項目名をしっかりと記述しなくてはなりません。
ということは、やはりAPEXと同様に変数を使用して値を表示する方法があります!

その書き方は

 

{!オブジェクト名[‘項目名’]}(例、{!Sobject__c[‘API__c’]})

 

となります。
この記述方法ですと、表示させたい項目名のAPI参照名を文字列で指定することができるのです。
・・・ということは、API参照名をAPEXの中でString型の変数として作成し、その内容をセットすることによって呼び出すこともできます。
それでは早速ですが、画面に表示させるためのソースを作成したいと思います。

今回用意したオブジェクトは前回の記事のように、類似した項目名(「ShopJoho1__c」、「ShopJoho2__c」、「ShopJoho3__c」)を使用し、復習も兼ねたいと思います。

 

例)
オブジェクト「ShopJoho__c(店舗情報)」のテキスト項目
「ShopJoho1__c(店舗名)」、「ShopJoho2__c(住所)」、「ShopJoho3__c(アドレス)」
の値をSOQLで取得(10レコード)し、画面に表示する。

APEX

public class ListAPIController {
    public List<ShopJoho__c> ShopJoho {get; set;} // カスタムオブジェクト「店舗情報」
    public List<String> ShopJAPI {get; set;}      // 店舗情報API参照名
    public ListAPIController () {

        // リスト初期化
        ShopJoho = new List<ShopJoho__c>();
        ShopJAPI = new List<String>();

        // soql用文字列
        String query = 'SELECT Name';
        //各項目をセット
        for (Integer i = 1; i <= 3; i++) {
            // 項目名を作成
            String apiName = 'ShopJoho' + String.valueof(i) + '__c';

            // 項目名をリストにセット
            ShopJAPI.add(apiName);

            // soql用の文字列追加
            query += ', ' + apiName;
        }
        query += ' FROM ShopJoho__c';

        // soqlを発行(10レコード取得)
        ShopJoho = Database.query(query);
    }
}

 

 

visualforce

<apex:page controller="ListAPIController">
    <apex:dataTable value="{!ShopJoho}" var="ShopJ" rowClasses="odd,even" border="1" cellpadding="4" id="nameSection">

        <!-- 店舗名 -->
        <apex:column >
            <!-- ラベルを表示 -->
            <apex:facet name="header">{!$ObjectType.ShopJoho__c.Fields[ShopJAPI[0]].label}</apex:facet>
            <!-- 取得値を表示 -->
            <apex:outputText value="{!ShopJ[ShopJAPI[0]]}"/>
        </apex:column>

        <!-- 住所 -->
        <apex:column >
            <apex:facet name="header">{!$ObjectType.ShopJoho__c.Fields[ShopJAPI[1]].label}</apex:facet>
            <apex:outputText value="{!ShopJ[ShopJAPI[1]]}"/>
        </apex:column>

        <!-- アドレス -->
        <apex:column >
            <apex:facet name="header">{!$ObjectType.ShopJoho__c.Fields[ShopJAPI[2]].label}</apex:facet>
            <apex:outputText value="{!ShopJ[ShopJAPI[2]]}"/>
        </apex:column>
 
  </apex:dataTable>
</apex:page>

 

すると、画面では以下のように表示されます!

 

 

 

 

 

 

 

 

ここでは深く説明しませんが、各項目のラベルも同様の方法で取得できるんですよ!

上記のサンプルソースではわかりやすいようにシンプルな方法となっていますが、応用することで効率よく処理することができると思いますので、ぜひ参考にしてください!

・・・ちなみに、VFをもう少し応用するとこのようになります。(表示される内容は一緒です)

<apex:page controller="ListAPIController">
    <apex:dataTable value="{!ShopJoho}" var="ShopJ" rowClasses="odd,even" border="1" cellpadding="4" id="nameSection">
    
        <apex:repeat value="{!ShopJAPI}" var="ShopJApi">
        
            <!-- 店舗名、住所、アドレスの順番にリピートされる -->
            <apex:column >
                <!-- ラベルを表示 -->
                <apex:facet name="header">{!$ObjectType.ShopJoho__c.Fields[ShopJApi].label}</apex:facet>
                <!-- 取得値を表示 -->
                <apex:outputText value="{!ShopJ[ShopJApi]}"/>
            </apex:column>
            
        </apex:repeat>
        
  </apex:dataTable>
</apex:page>

 

それでは!