На этапе сертификации DEV 1 столкнулся с набором вопросов которые касались работы с метаданными в Apex. Решил собрать информацию, которая пригодятся не только на этапе сертификации, но и в повседневной работе.
1. Вступление
2. SObject Fields
3. sObject RecordTypes
4. sObject Picklist values
5. sObject Type
Вступление
Рассмотрим в примерах способы получения метаданных с помощью Apex, которые будут содержать информацию о: Object Fields, sObject Type, RecordTypes of Object, Picklist values.
SObject Fields
Для получения полей объекта используется 3 способа. Для примера возьмём объект Account.
- В первом случае для получения полей объекта необходимость в классе Schema отсутствует.
Map<String, Schema.SObjectField> fieldMap = Schema.SObjectType.Account.fields.getMap();
- Тот же результат, но искомый объект указывается строкой.
Map<String,Schema.SObjectField> fieldMap = Schema.getGlobalDescribe().get('Account').getDescribe().fields.getMap();
- На случай если необходимо получить данные сразу по нескольким объектам.
Schema.DescribeSObjectResult[] descResult = Schema.describeSObjects(new String[]{'Account'});
Map<String,Schema.SObjectField> fieldMap = descResult[0].fields.getMap();
sObject RecordTypes
Для получения текущих RecordType на объекте используется.
Map<String, Schema.RecordTypeInfo> recordTypes = Account.SObjectType.getDescribe().getRecordTypeInfosByName();
Account.SobjectType.getDescribe().getRecordTypeInfos() - тоже даст ожидаемый результат.
sObject Picklist values
Получение значения для picklist поля Rating на объекте Account.
List<Schema.PicklistEntry> picklistValues = Account.Rating.getDescribe().getPicklistValues();
sObject Type
В ситуациях когда нужно определить тип объекта:
Возьмём для примера объект Account который возвратит SOQL запрос.
Account act=[SELECT Name
FROM Account
WHERE Name='AlexAccount'
LIMIT 1];
Добавим его в List
List<sObject> lst=new List<sObject>();
lst.add(act);
Теперь обращаясь листу, будет определён и получен необходимый объект.
if(lst[0].getSObjectType() == Schema.Account.getSObjectType()) {
System.debug(lst[0].getSObjectType());
}
//Определение типа объекта по имени
if(lst[0].getSObjectType().getDescribe().getName() == 'Account') {
System.debug(lst[0].getSObjectType().getDescribe().getName());
}