ドンピシャの記事がこちらにあったので、メモ。 参考になります。
たいていのことは、「気合い」と「根性」で乗り越えられるものだ!!:【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()
してもエラーにはならず
空のリストが返されるだけです。