개발일지
Apex에서 종속 선택 목록 값 가져오기 본문
// 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;
}
종속 선택 목록(Dependent Picklist) 가져오기
Schema.DescribeFieldResult depend = dependToken.getDescribe() : 종속된 값 가져오기
Schema.sObjectField controlToken = depend.getController() : 선택된 값가져오기
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('');
validFor로 가공
validFor는 Base64 문자열로 되어 있으며, 이를 분리하여 리스트로 변환합니다.
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());
}
- controlEntries가 활성화된 값인 경우, 비트 마스크를 사용하여 **validFor**에 맞는 값을 선택합니다.
- Base64 인코딩 값을 비트 연산으로 추출하여, 해당 컨트롤 값에 맞는 종속 선택 목록 값을 구분합니다.
- **controlValue**와 매칭되는 **종속 선택 목록 값(entry.getLabel())**을 dependentPicklistValues 맵에 추가합니다.
----종속 선택 목록 값들을 Map<String, List<String>> 형태로 반환합니다.
결론적으로 종속된 픽리스트값과 그와 연결된 컨트롤값을 가져온 뒤 validFor로 이루어진 Base64 문자열과 비교해 컨트롤값-종속값을 필터링 해서 리턴
'Apex' 카테고리의 다른 글
Salesforce APEX Excetion Limit 모음 (0) | 2025.01.22 |
---|---|
List 형식의 query문을 담고 리턴으로 List반환(데이터테이블에 목록출력) (0) | 2021.07.09 |
Apex Collection List, Set, Map (0) | 2021.07.09 |