Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
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
Archives
Today
Total
관리 메뉴

개발일지

Apex에서 종속 선택 목록 값 가져오기 본문

Apex

Apex에서 종속 선택 목록 값 가져오기

청일쓰 2025. 1. 20. 15:37
// 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 문자열과 비교해 컨트롤값-종속값을 필터링 해서 리턴