Salesforce/Development
Apex에서 종속 선택 목록 값 가져오기 (Get Dependent Picklist Values in Apex)
어디다쏨
2022. 4. 20. 22:09
728x90
Apex에서 종속 선택 목록 값 가져오기 위한 Apex Method 입니다.
// Apex에서 종속 선택 목록 값 가져오기
public static Map<String, List<String>> getDependentPicklistValues(Schema.sObjectField dependToken) {
Schema.DescribeFieldResult depend = dependToken.getDescribe();
Schema.sObjectField controlToken = depend.getController();
if (controlToken == null) {
return new Map<String, List<String>>();
}
Schema.DescribeFieldResult control = controlToken.getDescribe();
List<Schema.PicklistEntry> controlEntries;
if(control.getType() != Schema.DisplayType.Boolean) {
controlEntries = control.getPicklistValues();
}
String base64map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
Map<String,List<String>> dependentPicklistValues = new Map<String,List<String>>();
for (Schema.PicklistEntry entry : depend.getPicklistValues()) {
if (entry.isActive() && String.isNotEmpty(String.valueOf(((Map<String,Object>) JSON.deserializeUntyped(JSON.serialize(entry))).get('validFor')))) {
List<String> base64chars =
String.valueOf(((Map<String,Object>) JSON.deserializeUntyped(JSON.serialize(entry))).get('validFor')).split('');
for (Integer index = 0; index < (controlEntries != null ? controlEntries.size() : 2); index++) {
Object controlValue =
(controlEntries == null
? (Object) (index == 1)
: (Object) (controlEntries[index].isActive() ? controlEntries[index].getLabel() : null)
);
Integer bitIndex = index / 6;
if (bitIndex > base64chars.size() - 1) {
break;
}
Integer bitShift = 5 - Math.mod(index, 6);
if (controlValue == null || (base64map.indexOf( base64chars[ bitIndex ] ) & (1 << bitShift)) == 0)
continue;
if (!dependentPicklistValues.containsKey((String) controlValue)) {
dependentPicklistValues.put((String) controlValue, new List<String>());
}
dependentPicklistValues.get((String) controlValue).add(entry.getLabel());
}
}
}
return dependentPicklistValues;
}
사용 방법은 아래와 같습니다.
Map<String, List<String>> category_LM = getDependentPicklistValues(Account.MiddleCategory__c);
System.debug(category_LM);
Debug 결과입니다.
{대분류1=(중분류11, 중분류12, 중분류13), 대분류2=(중분류21, 중분류22, 중분류23), 대분류3=(중분류31, 중분류32, 중분류33)}
테스트를 위한 필드 2개 생성
728x90