dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

[Salesforce]選択リストの全ての値をApexで取得する

ドンピシャの記事がこちらにあったので、メモ。 参考になります。

たいていのことは、「気合い」と「根性」で乗り越えられるものだ!!:【salesforce】Apexcodeで選択リスト型の値を取るゼイ。

コードはこちら。
(元の記事から、変数名などを若干変更しております)

//選択リスト型の選択できる値を取得
public List<Schema.PicklistEntry> getPicklist(String sObjName, String fieldName){
    List<Schema.PicklistEntry> pickList;
    Schema.SObjectType sObjType = (Schema.SObjectType) Schema.getGlobalDescribe().get(sObjName);
    if(sObjType != null){
        Map<String, Schema.SObjectField> fieldmap = sObjType.getDescribe().fields.getMap();
        Schema.SObjectField f = (Schema.SObjectField) fieldmap.get(fieldName);
        if(f != null){
            Schema.DescribeFieldResult r = f.getDescribe();
            pickList = r.getPicklistValues();
            System.debug('値' + pickList);
        }
    }
    return pickList;
}

List<Schema.PicklistEntry> picklist = getPicklist('OpportunityContactRole', 'Role');

for(Schema.PicklistEntry pick : picklist){
    System.debug('-----------------');
    System.debug('Label :' + pick.getLabel());
    System.debug('Value :' + pick.getValue());
    System.debug('Active:' + pick.isActive());
}

で、参考記事でも言及してますが System.getGlobalDescribe()は全オブジェクトの情報を取得しているため
なんとなく無駄だなあと感じます。

SObject名を文字列で指定したらそれのSchema.SObjectTypeを返してくれるような
うまい方法はないものか。

と、調べてみるとこちらの記事を見つけました。

http://d.hatena.ne.jp/beercan/20110513/1305272738

どうやら、Schema.SObjectTypeを取得するには以下の3つの方法があるとのこと。

// 1. 静的に取得
Schema.SObjectType accountType = Account.sObjectType;

// 2. インスタンスから取得
Schema.SObjectType accountType = new Account().getSObjectType();

// 3. GlobalDescribeから取得
Schema.SObjectType t = Schema.getGlobalDescribe().get('Account');

うーん、やっぱり文字列からだと3. の方法しかないのかなあ。

ちなみに、項目タイプがPicklistであることを確認するにはこう。

public List<Schema.PicklistEntry> getPicklist(String sObjName, String fieldName){
    List<Schema.PicklistEntry> pickList;
    Schema.SObjectType sObjType = (Schema.SObjectType) Schema.getGlobalDescribe().get(sObjName);
    if(sObjType != null){
        Map<String, Schema.SObjectField> fieldmap = sObjType.getDescribe().fields.getMap();
        Schema.SObjectField f = (Schema.SObjectField) fieldmap.get(fieldName);
        if(f != null) {
            Schema.DescribeFieldResult r = f.getDescribe();
            // *****以下を追記*****/
            if (r.getType() == Schema.DisplayType.Picklist) {
                pickList = r.getPicklistValues();
                System.debug('値' + pickList);
            }
        }
    }
    return pickList;
}

Schema.SObjectFieldResult.getType()メソッドを使うと
Schema.DisplayTypeというenumが返ってきます。

ただ、選択リストでない項目にgetPicklistValues()してもエラーにはならず
空のリストが返されるだけです。

Salesforce Developers

Salesforce: Dynamically determining the field type of a dynamically determined sObject | The Silver Lining