카테고리 없음

[APEX] SObjectd의 ID로 sObject type 반환하기 - Schema 익히기 1 (How to get sObject type from the Id ? )

송테이토 2023. 2. 22. 18:39

SObjectd의 ID로 sObject type 반환하기 - Schema 사용 익히기 1

 

List<ID> 타입의 파라미터를 전달받아, 동일한 크기의 배열에 각각의 ID 가 어떤 SObject Type 인지를 String 으로 담아 반환하는 메서드를 작성해주세요
입출력 예시)  ['001abcdefgefkdekdy', '003abzzzfyyfkdekdy']   =>   ['Account','Contact'] 반환

 

세일즈포스 ID 는 앞 세자리 001,,002,,003등 KeyPrefix로 구분한다!!!

    public static String [] returnSobjectTypeFromListID(List<Id>inputRecordId) {
        // Object Type 담을 변수 (최종 반환 값)
        String [] objectName = new List<String>();

        //파라미터로 받은세자리 코드 배열
        String [] myIdPrefix = new List<String>();
        for (Integer i = 0; i < inputRecordId.size(); i++) {
            myIdPrefix.add(String.valueOf(inputRecordId[i]).substring(0, 3));
        }

        //getGlobalDescribe() - Map sObject 토큰(값)에 대한 모든 sObject 이름(키)의 맵을 반환
        Map <String, Schema.SObjectType> gd = Schema.getGlobalDescribe();

        //스키마가 반환한 모든 sObject 유형을 반복
        for (Schema.SObjectType stype : gd.values()) {
            Schema.DescribeSObjectResult dsr = stype.getDescribe();
            //getKeyPrefix() - 개체 앞에 접두사코드 반환하는 함수
            String KeyPrefix = dsr.getKeyPrefix();
            //stype : TenantSecurityTransactionPolicyTrend ....TenantSecurityTenantInfo...RelatedListColumnDefinition...FlowTestView
            //dsr : Schema.DescribeSObjectResult[getAssociateEntityType=null;getAssociateParentEntity=null;getDataTranslationEnabled=null;getDefaultImplementation=null;getHasSubtypes=false;getImplementedBy=null;getImplementsInterfaces=null;getIsInterface=false;getIsSubtype=false;getKeyPrefix=2nd;getLabel=Security Center Transaction Policy Trend;getLabelPlural=Security Center Transaction Policy Trends;getName=TenantSecurityTransactionPolicyTrend;getRecordTypeInfosByDeveloperName={Master=Schema.RecordTypeInfo[getDeveloperName=Master;getName=Master;getRecordTypeId=012000000000000AAA;isActive=true;isAvailable=true;isDefaultRecordTypeMapping=true;isMaster=true;]};getSObjectDescribeOption=DEFERRED;isAccessible=false;isCreateable=false;isCustom=false;isCustomSetting=false;isDeletable=false;isDeprecatedAndHidden=false;isFeedEnabled=false;isMergeable=false;isMruEnabled=false;isQueryable=true;isSearchable=false;isUndeletable=false;isUpdateable=false;]
            // KeyPrefix : 2nd ....2Y8....4YB...

            //KeyPrefix 3자리 코드가 내가 입력한 ID의 3자리 코드와 일치하다면?
            for (Integer i = 0; i < myIdPrefix.size(); i++) {
                if (KeyPrefix != null && KeyPrefix.equals(myIdPrefix[i])) {
                    objectName.add(dsr.getName());
                    //    System.debug(inputRecordId + '의 Object 타입은? : ' + objectName);
                }
            }
        }
        System.debug(objectName);
        return objectName;
    }

테스트클래스

@istest
public static void ListID() {
    List<Id> IDList = new List<String>();
    IDList.add('0012w00001Kvjs1AAB');
    IDList.add('0032w00000yeEfKAAU');

    SchemaUtilClass.returnSobjectTypeFromListID(IDList);
}

 


 

Schema.DescribeSObjectResult - sObject 설명 결과의 유형

//describeSObjects(sObjectTypes) - sObject 설명 결과의 유형
//Schema.DescribeSObjectResult dsr = Account.sObjectType.getDescribe();
//Schema.DescribeSObjectResult dsr = Schema.SObjectType.Account;
Schema.DescribeSObjectResult dsr = stype.getDescribe();

 Schema.DescribeSObjectResult[getAssociateEntityType=null;
getAssociateParentEntity=null;getDataTranslationEnabled=null;
getDefaultImplementation=null;
getHasSubtypes=false;
getImplementedBy=null;
getImplementsInterfaces=null;
getIsInterface=false;
getIsSubtype=false;
getKeyPrefix=2nd;
getLabel=Security Center Transaction Policy Trend;
getLabelPlural=Security Center Transaction PolicyTrends;
getName=TenantSecurityTransactionPolicyTrend;
getRecordTypeInfosByDeveloperName{Master=Schema.RecordTypeInfo[getDeveloperName=Master;
getName=Master;
getRecordTypeId=012000000000000AAA;
isActive=true;
isAvailable=true;
isDefaultRecordTypeMapping=true;

등등 정보가 나온다       

 

getGlobalDescribe() - Map sObject 토큰(값)에 대한 모든 sObject 이름(키)의 맵을 반환

Map <String, Schema.SObjectType> gd = Schema.getGlobalDescribe();

 

System.debug(Account.sObjectType.getDescribe());

Schema.DescribeSObjectResult
[getAssociateEntityType=null;getAssociateParentEntity=null;getDataTranslationEnabled=null;getDefaultImplementation=null;getHasSubtypes=false;getImplementedBy=null;getImplementsInterfaces=null;getIsInterface=false;getIsSubtype=false;getKeyPrefix=001;getLabel=Account;getLabelPlural=Accounts;getName=Account;getRecordTypeInfosByDeveloperName {Master=Schema.RecordTypeInfo[getDeveloperName=Master;getName=Master;getRecordTypeId=012000000000000AAA;isActive=true;isAvailable=true;isDefaultRecordTypeMapping=true;isMaster=true;]};getSObjectDescribeOption=DEFERRED;isAccessible=true;isCreateable=true;isCustom=false;isCustomSetting=false;isDeletable=true;isDeprecatedAndHidden=false;isFeedEnabled=true;isMergeable=true;isMruEnabled=true;isQueryable=true;isSearchable=true;isUndeletable=true;isUpdateable=true;]



describeSObjects(sObjectTypes) - sObject 설명 결과의 유형

   //getGlobalDescribe() - Map sObject 토큰(값)에 대한 모든 sObject 이름(키)의 맵을 반환

Map <String, Schema.SObjectType> gd = Schema.getGlobalDescribe();

   //스키마가 반환한 모든 sObject 유형을 반복
     for (Schema.SObjectType stype : gd.values()) {
        ,,,
      }

해당 sObject가 어떤 기능을 하는지 보여준다.

예) TenantSecurityTransactionPolicyTrend

TenantSecurityTenantInfo

RelatedListColumnDefinition

FlowTestView 등... 이런 정보들을 보여줌

 

getKeyPrefix() - 개체 앞에 접두사코드 반환하는 함수

String KeyPrefix = dsr.getKeyPrefix();

System.debug(KeyPrefix);

2nd
2Y8
4YB

예 ) KeyPrefix : 2nd ....2Y8....4YB..로 찍힘