CSV/JSON을 사용하여 Salesforce 사용자 정의 메타데이터 레코드를 가져오는 방법

Salesforce 사용자 정의 메타데이터 레코드 가져오기는 정말 까다로울 수 있습니다. 가져오기 마법사 또는 데이터 로더를 사용하는 것을 잊으십시오. 이러한 도구는 놀랍지만 단순히 사용자 지정 메타데이터 레코드에 대한 작업을 지원하지 않습니다.

이 테마에 대해 Google에서 빠른 검색을 수행하면 특정 검색 지점에서 사용자 정의 메타데이터 로더 로더를 사용하도록 안내하는 가이드를 보게 될 것입니다. 이 도구는 가져올 레코드가 거의 없고 레코드에 특수 문자가 없는 경우에 유용할 수 있습니다. 그렇지 않으면 많은 버그와 오류가 발생한 후 확실히 실패할 것입니다.

해당 요구 사항을 달성하기 위한 가이드라인으로 공식 Salesforce 문서를 사용하여 클래스를 개발했으며 아래 단계에 따라 Salesforce 사용자 정의 메타데이터 레코드를 가져올 수 있도록 도와드리겠습니다.

1: 데이터 준비



csv를 json으로 변환하는 모든 온라인 서비스를 사용할 수 있습니다. 아래 서비스를 추천합니다.
https://csvjson.com/csv2json


업로드할 레코드가 포함된 CSV 파일을 업로드하고 변환을 클릭한 다음 생성된 JSON을 복사하기만 하면 됩니다.

1.1: JSON을 인라인으로 만들기



다음에 해야 할 일은 해당 JSON을 한 줄로 구문 분석하는 것입니다. 다음 링크에 액세스하여 쉽게 수행할 수 있습니다.
https://jsonformatter.curiousconcept.com/

JSON을 붙여넣고 JSON 템플릿 옵션에서 COMPACT를 선택한 다음 PROCESS를 클릭하기만 하면 됩니다. 생성된 소형 JSON을 복사하고 이후 단계를 위해 안전하게 보관하십시오.

2: 아래 코드를 사용하여 mdtImport Apex 클래스를 생성합니다.




//author: Roger Rosset
//description: Upload custom metadata records using CSV/JSON

public class mdtImport  {    
    public static void insertMetadata(String metaDataTypeName, String jsonString){
        try{
            Integer count = 1;
            Metadata.DeployContainer mdContainer = new Metadata.DeployContainer();
            JSONCsvTemplate csv = (JSONCsvTemplate)JSON.deserialize(jsonStringMdt(jsonString), JSONCsvTemplate.class);
            for(JSONCsvTemplate.mdtRecords item : csv.data.mdtRecordsList){
            //Sets the custom metadata type you'll insert your records on

            //If you're using namespaces on your org set it here
            String nameSpacePrefix ='';                                     
            Metadata.CustomMetadata rec =  new Metadata.CustomMetadata();
            String label = 'Record '+count;                      
            rec.fullName = nameSpacePrefix+metaDataTypeName+'.'+label;
            rec.label = label; 

            //Sets the custom metadata custom fields to be inserted
            /*
            * Use the template below to setup any fields you want to:
            *    
            Metadata.CustomMetadataValue fieldX = new Metadata.CustomMetadataValue();     //New instance
            fieldX.field = 'Custom_Field_Name__c';              //Custom Metadata Field you want to fill
            field1.value = item.JSON_Matching_Key_Value;        //The matching key value on the wrapper
            rec.values.add(fieldX);                             //adds the value and the matching field
            *
            */

            Metadata.CustomMetadataValue field1 = new Metadata.CustomMetadataValue();
            field1.field = 'SubGroup__c';
            field1.value = item.SubGroup;
            rec.values.add(field1);            
            Metadata.CustomMetadataValue field2 = new Metadata.CustomMetadataValue();
            field2.field = 'Description__c';
            field2.value = item.Description;
            rec.values.add(field2);                       
            Metadata.CustomMetadataValue field3 = new Metadata.CustomMetadataValue();
            field3.field = 'keyId__c';
            field3.value = item.keyId;
            rec.values.add(field3);                        
            mdContainer.addMetadata(rec);  
            count++;
    } 
            Id jobId = Metadata.Operations.enqueueDeployment(mdContainer, null);
            system.debug('Container>>'+mdContainer);
            system.debug('Id>>'+jobId);
            return;
        }

            catch(Exception ex){             
            system.debug('Error on insert');
            system.debug('Error:'+ex.getMessage());
        }

    }
    private static String jsonStringMdt(String jsonString){
        String resultJson = '{"data":{"mdtRecordsList":'+jsonString+'}}';
        return resultJson;
    }

    private class JSONCsvTemplate{
        private class Data{
            private List<mdtRecords> mdtRecordsList;
    }
        private class mdtRecords{
            private String keyId;
            private String SubGroup;
            private String Description;
        }
        private Data data;
    }
}



보시다시피 metaDataTypeName 및 jsonString을 속성으로 전달하는 insertMetaData 메서드를 실행할 수 있습니다. 여기서 metaDataTypeName은 사용자 정의 메타데이터 유형(__mdt로 끝남)의 API 이름이고 jsonString은 1.1단계에서 복사한 인라인 JSON입니다. 그러나 먼저 csv 데이터베이스에 맞게 JSONCsvTemplate>mdtRecords의 속성을 조정해야 합니다.

3: 래퍼 클래스를 요구 사항에 맞게 조정




    private class JSONCsvTemplate{
        private class Data{
            private List<mdtRecords> mdtRecordsList;
    }
        private class mdtRecords{
            private String keyId;
            private String SubGroup;
            private String Description;
        }
        private Data data;
    }
}


위에서 볼 수 있듯이 3개의 열이 있는 레코드를 업로드하고 있습니다.
-keyId
-하급 집단
-설명

이 값은 내 csv 데이터베이스 헤더와 정확히 일치하며 기준에 맞게 템플릿을 추가, 삭제 또는 수정할 수 있습니다. csv 데이터베이스는 필드 이름뿐만 아니라 기본 데이터 유형(정수, 문자열 등)에 대해서도 래퍼 클래스에 맞아야 합니다.

사용된 csv 데이터베이스:


4: 메서드 실행



이전 단계를 모두 수행하고 Salesforce 조직에 클래스를 만들고 저장했는지 확인한 후 다음에 해야 할 일은 insertMetadata를 실행하는 것입니다.
사용자 정의 메타데이터 유형 API 이름(__mdt로 끝남)과 1.1단계에서 생성된 JSON 문자열을 가져오고 개발자 콘솔 내부의 Apex 익명 창에서 메서드를 실행합니다(CTRL+E).


JSON 문자열이 실제로 클 수 있으며 문제를 방지하려면 아래와 같이 메서드 실행 내부의 매개 변수에 "슈퍼 문자열"을 붙여넣기 전에 메서드 템플릿과 따옴표를 배치하는 것이 좋습니다.

메서드를 준비한 후 큰 JSON 문자열을 따옴표 안에 붙여넣고 실행을 클릭합니다.


로그 열기 옵션을 선택한 경우 이 실행 로그로 이동해야 합니다. 여기에서 대기열에 포함된 배포의 ID를 찾고 Salesforce의 배포 상태에서 상태를 확인할 수 있습니다.
설정 > 배포 > 배포 상태

주목



저는 이미 실행당 600개의 레코드 배포를 테스트했습니다. 오류를 피하기 위해 해당 제한을 준수하려고 합니다.

가능하면 크레딧을 유지하면서 필요에 따라 코드를 자유롭게 수정하십시오.

유용하길 바랍니다.

문안 인사,
로저 로셋

기반 문서:
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_class_Metadata_Operations.htm

좋은 웹페이지 즐겨찾기