gzw
2022-02-15 168114b11da83c5005cd608c1b23a66311717a0f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**********************************************************
*  SetupCheck_PicklistValuesGetController
*  オブジェクトの選択リスト値を取得する
*  version: 1.0
*  作成: TDC Hokazono
***********************************************************/
public class SetupCheck_PicklistValuesGetController {
    //選択リスト値格納
    public String[] val_PicklistValues { get; set; }
    
    //コンストラクター
    public SetupCheck_PicklistValuesGetController() {
        System.debug('@@@@@@ SetupCheck_PicklistValuesGetController @@@@@@');
        
        //URLからテーブル名と項目名を取得
        String sobject_name = ApexPages.currentPage().getParameters().get('sobject_name');
        String field_name = ApexPages.currentPage().getParameters().get('field_name');
        
        System.debug(' @@@ sobject_name : ' + sobject_name);
        System.debug(' @@@ field_name : ' + field_name);
        
        //選択リスト値を取得
        val_PicklistValues = fieldPicklistValuesGet(sobject_name, field_name);
    }
    
    //項目選択リスト値を取得
    private String[] fieldPicklistValuesGet(String sname, String fname) {
        System.debug('@@@@@@ fieldPicklistValuesGet @@@@@@');
        System.debug(' @@@ sname : ' + sname);
        System.debug(' @@@ fname : ' + fname);
        
        //戻り値格納
        List<String> retlist = new List<String>();
        //オブジェクト項目の設定内容を格納
        Map<String, Schema.SObjectField> sof;
        
        //SObjectを取得(可変での取得方法が不明なのでまずはDynamicSOQL利用)
        //new SObject('オブジェクト名');ができるのが理想でした
        List<SObject> so = Database.query('Select Id from ' + sname +  ' limit 1');
        
        //項目の設定情報取得
        if (so.size() > 0) {
            System.debug(' @@@ so.size() > 0 ');
            //取得した検索結果レコードから設定情報を取得
            sof = so[0].getSObjectType().getDescribe().fields.getMap();
        } else {
            System.debug(' @@@ so.size() == 0 ');
            //レコードが1つも無い場合は最終手段でGlobalDescribeを利用
            //Describe自体が重そうな処理なので最終手段
            sof = Schema.getGlobalDescribe().get(sname).newSObject().getSObjectType().getDescribe().fields.getMap();
        }
        
        //項目の存在確認
        if (!sof.containsKey(fname)) return null;
        
        //項目の設定内容を取得
        Schema.DescribeFieldResult dfr = sof.get(fname).getDescribe();
        
        //データタイプ取得
        String ftype = dfr.getType().name();
        
        System.debug(' @@@ Data Type : ' + ftype);
        
        //選択リスト以外NULLを返し終了
        if (ftype != 'PICKLIST' && ftype != 'MULTIPICKLIST') return null;
        
        //リスト値を取得
        for (Schema.PicklistEntry pe : dfr.getPicklistValues()) {
            String val = '';
            //ラベル値を取得
            val = pe.getLabel();
            
            //デフォルト値チェック
            if (pe.isDefaultValue()) val += '(デフォルト)';
            
            //無効チェック
            if (!pe.isActive()) val += '(無効)';
            
            System.debug(' @@@ Value : ' + val);
            
            //リターン値に追加
            retlist.add(val);
        }
        
        //処理終了
        return retlist;
    }
    
    //テストメソッド
    static testmethod void picklistValuesGetControllerTEST() {
        test.starttest();
        //選択リスト項目(商談:フェーズ)
        PageReference pageRef = new PageReference('/apex/SetupCheck_PicklistValuesGet?sobject_name=Opportunity&field_name=StageName');
        test.setCurrentPage(pageRef);
        SetupCheck_PicklistValuesGetController pc = new SetupCheck_PicklistValuesGetController();
        //選択リスト以外の項目(商談:商談名)
        pageRef = new PageReference('/apex/SetupCheck_PicklistValuesGet?sobject_name=Opportunity&field_name=Name');
        test.setCurrentPage(pageRef);
        pc = new SetupCheck_PicklistValuesGetController();
        test.stopTest();
    }
}