1.先上图,这是我在标准对象Account里自定义的一个picklist数据类型字段,取名为account_level
2.在编写代码前,我们首先要弄清楚Values和API Name的区别
- Values:在salesforce页面所展示的值,就像对象(Object)的Name一样
- API Name:我们在APEX代码中会使用到的值,例如当我们将某个Picklist类型的字段赋值成为2,如下
Account al = new Account();
al.Name = 'test';
al.account_level__c = '2'; //account_level__c 是自定义字段,picklist类型
insert al;
3.然后我们就会看到如下的数据被插入了
4.这说明我们在apex中操作代码时只需要关注API Name,随后Salesforce会帮我们自动映射成对应的Values
5.有了上面的基本认知,就可以开始下面的代码操作
直接获取Picklist类型对象的值
- 对于picklist类型的对象,可以通过getDescribe()方法得到DescribeFieldResult 对象
Schema.DescribeFieldResult fieldResult = Account.Type.getDescribe();
- 再通过getPicklistValues()方法,可以得到Schema.PicklistEntry 的集合,对其进行for循环遍历
for(Schema.PicklistEntry str : fieldResult.getPicklistValues()){
System.debug(str.getValue()); //得到Values
System.debug(str.getLabel()); //得到API Name
}
完整代码
- 注意:Type必须是picklist类型的对象(标准对象或自定义对象)
Schema.DescribeFieldResult fieldResult = Account.Type.getDescribe();
for(Schema.PicklistEntry str : fieldResult.getPicklistValues()){
System.debug(str.getValue()); //得到Values
System.debug(str.getLabel()); //得到API Name
}
动态获取Picklist类型对象的值
- 为了实现动态的效果,我们可以写一个方法,该方法根据传入的对象类型和对象字段进行动态获取下拉列表的值
// 1.根据传入的对象名objectName得到DescribeSObjectResult 对象
DescribeSObjectResult objResult = Schema.describeSObjects(new List<String>{objectName});
// 2.根据DescribeSObjectResult 和字段名selectField得到DescribeFieldResult 对象
DescribeFieldResult fieldResult = objResult.fields.getMap()
.get(selectedField).getDescribe();
// 3.有了DescribeFieldResult 对象,我们就可以对其进行遍历
for(Schema.PicklistEntry str : fieldResult.getPicklistValues()){
str.isActive(); //判断该列表值是否被激活
System.debug(str.getValue()); //得到API值
System.debug(str.getLabel()); //得到标签值
}
完整代码
public static Map<String, String> picklistValues(String objectName, String fieldName) {
Map<String, String> picklistMap= new Map<String, String>{};
List<Schema.DescribeSobjectResult> results = Schema.describeSObjects(new List<String>{objectName});
for(Schema.DescribeSobjectResult res : results) {
for (Schema.PicklistEntry entry : res.fields.getMap().get(fieldName).getDescribe().getPicklistValues()) {
if (entry.isActive()) {
values.put(entry.getValue(), entry.getLabel());
}
}
}
return values;
}
至此,picklist的apex操作就演示完成了。
值得注意的是,在创建对象后还想查看picklist的列表值:
需要点击以下位置,而不是编辑按钮