수색…


비고

소개

맞춤 설정을 기반으로하는 레코드가있는 맞춤 개체와 달리 맞춤 설정을 사용하면 조직 전체에서 맞춤 데이터 집합을 활용하거나 맞춤 기준에 따라 특정 사용자 또는 프로필을 구별 할 수 있습니다. 예를 들어, 관리자가 전체 조직에 대해 워크 플로 / 유효성 검사 규칙을 비활성화하기 위해 계층 사용자 지정 설정을 편집하여 단일 사용자 또는 프로필을 비활성화 할 수 있습니다 (위의 워크 플로 / 유효성 검사 규칙을 사용하지 않도록 계층 사용자 지정 설정 사용 참조). ).

유효성 검사 규칙은 일반적으로 다음과 같은 경우 일시적으로 사용 중지해야합니다.

  • 코드는 유효성 검사 규칙이 활성화되기 전에 마지막으로 편집 된 이전 레코드를 업데이트하므로 최신 규칙의 기준을 충족하지 못합니다.
  • 코드는 유효성 검사 규칙의 기준에 필요한 값없이 새 레코드를 삽입합니다.

워크 플로 규칙은 일반적으로 다음과 같은 경우 일시적으로 사용하지 않도록 설정해야합니다.

  • 전자 메일 경고 또는 필드 업데이트를 실행하면 변경 내용을 덮어 쓰거나 방해 할 수 있습니다.

사용자 정의 설정을 사용하면 관리자에게 코드에 대한 선언적 제어가 허용되므로 많은 사용 사례 중 하나를 사용하면 트리거를 사용하지 않도록 코드를 배포 할 필요가 없습니다 (위의 Apex 코드를 사용하지 않도록 계층 사용자 정의 설정 사용 참조). ).

개발자의 주요 이점은 응용 프로그램 캐시에 사용자 지정 설정의 데이터가 노출되어 데이터베이스에 대한 반복 쿼리 비용없이 효율적으로 액세스 할 수 있다는 점입니다. 이 데이터는 수식 필드, 유효성 검사 규칙, 흐름, Apex 및 SOAP API에서 사용할 수 있습니다 ( Salesforce 설명서 참조).

사용자 지정 설정에 대한 제한 및 고려 사항은 여기 에 설명되어 있습니다 .

사용자 지정 설정 나열

List Custom Settings도 만들 수 있습니다. 일반적인 사용 사례에는 2 문자 상태 약어, 국제 다이얼링 접두어 및 제품 카탈로그 번호 저장이 포함됩니다. 그러나 Salesforce는 이제 사용자 지정 목록 표시 대신 사용자 지정 메타 데이터 형식 사용을 홍보하고 있습니다.

새 사용자 정의 설정을 만들 때 다음 메시지가 표시됩니다

팁 : 앱 구성에 맞춤 메타 데이터 유형 사용
목록 사용자 정의 설정을 사용하려는 경우 사용자 정의 메타 데이터 유형을 대신 사용해보십시오. 목록 사용자 정의 설정과 달리 패키지 또는 Metadata API 도구를 사용하여 사용자 정의 메타 데이터 유형의 레코드를 마이그레이션 할 수 있습니다.

사용자 지정 메타 데이터 형식에는이 답변 에서 설명한대로 추가 사용자 지정 설정과 다른 이점이 있습니다. 그리고 CMD의 수석 개발자에 따르면 "스테로이드의 맞춤 설정보다 맞춤형 메타 데이터 유형에 대한 계획이 훨씬 많습니다."

사용자 설정 생성 및 관리

창조

사용자 지정 설정을 만들려면 다음으로 이동하십시오.

권위 있는
설정> 개발> 사용자 설정> 신규

번개
설정> 사용자 정의 코드> 사용자 정의 설정> 새로 만들기

설정을 만듭니다 (계층 구조 및 목록 사용자 지정 설정의 차이점은이 문서의 뒷부분에 나오는 비고 참조). 관리 패키지에 설정을 배포하려는 경우가 아니면 가시성 선택 목록을 무시할 수 있습니다.

설정 필드를 만들려면 새로 만들기 버튼을 클릭하고 사용자 정의 필드를 만드는 일반적인 프로세스 를 따르십시오.

조치

필드를 만들었 으면 관리 버튼을 클릭하여 설정을 구성 할 수 있습니다.

새보기를 만들고 설정의 포괄적 개요를 한눈에 알기 위해 만든 필드를 포함하는 경우 설정을 관리하는 것이 더 쉽습니다. 설정 소유자는 설정이 적용되는 사용자 또는 프로필입니다.

조직 수준에서 설정을 관리하려면 기본 조직 수준 값 헤더 (아래의 빨간색 상자) 위의 새로 만들기 버튼을 클릭합니다.

사용자 또는 프로필 수준에서 설정을 관리하려면 아래 파란색 상자에서 새로 만들기 버튼을 클릭하십시오.

사용자 설정 편집

계층 구조 사용자 지정 설정을 사용하여 워크 플로 / 유효성 검사 규칙을 사용하지 않도록 설정

사용자 설정

사용자 설정

사용자 정의 설정 필드

사용자 정의 설정 필드

사용자 정의 설정 필드 값

필드가 선택되면 실행중인 사용자 또는이 예에서 프로필에 대한 유효성 검사 규칙이 비활성화됩니다.

사용자 정의 설정 필드 편집 - 프로파일

전체 Salesforce 조직에 대해 규칙을 사용 중지 할 수도 있습니다.

사용자 정의 설정 필드 편집 - 조직

유효성 검사 규칙

AND(
  /* the below is the reference to the Val_Rule_Cntrlr__c custom setting's checkbox field All_Opportunity_Disabled__c
  */
  $Setup.Val_Rule_Cntrlr__c.All_Opportunity_Disabled__c = FALSE,

  /* the below is the remainder of the validation rule's formula
  */
  CloseDate < TODAY()
)

위의 규칙에서 두 규칙은 TRUE 로 평가되어야 규칙이 트리거됩니다.

실행중인 사용자의 프로파일이 시스템 관리자 인 경우 All_Opportunity_Disabled__c 확인란이 TRUE 평가되므로 규칙은 FALSE 평가됩니다.

워크 플로 규칙

워크 플로 규칙을 비활성화하기 위해 동일한 접근 방식을 적용 할 수 있습니다.

계층 사용자 정의 설정을 사용하여 Apex 코드 비활성화

설명

이 예에서는 간단한 Trigger 가 생성되어 향후 10 일 이후의 날짜로 기회가 삽입되거나 업데이트 될 예정입니다.

Apex 컨트롤러 사용자 정의 설정의 확인란 필드는 사용자 / 프로필 / 조직 수준에서 코드를 비활성화 할 수있게합니다.

에이펙스 클래스

trigger CloseDateUpdate on Opportunity (before insert, before update) {
    
    Id userId;
    Apx_Cntrlr__c userApexController;
    Boolean userSetting;
    
    userId = userinfo.getUserId();
    userApexController = Apx_Cntrlr__c.getInstance(userId);
    userSetting = userApexController.Close_Date_Update_Disabled__c;

    if (userSetting == false) {
        for(Opportunity opp : Trigger.new) {
            opp.CloseDate = date.today().addDays(10);
        }
    }
    
}

단위 테스트

@isTest
public class CloseDateUpdateTest {
    
    @testSetup
    static void dataSetup() {
        
        Profile p = [SELECT Id FROM Profile WHERE Name = 'System Administrator' LIMIT 1];
        
        User u = new User(LastName = 'Test',Alias = 't1',Email = '[email protected]',Username = '[email protected]',ProfileId = p.Id,TimeZoneSidKey = 'America/Denver',LocaleSidKey = 'en_US',EmailEncodingKey = 'UTF-8',LanguageLocaleKey = 'en_US');
        insert u;
    }
    
    static testMethod void testCloseDateUpdateEnabled() {
        
        User u = [SELECT Id FROM User WHERE Username = '[email protected]'];
        // set the custom setting field to FALSE so that the trigger is not deactivated
        Apx_Cntrlr__c apexController = new Apx_Cntrlr__c(SetupOwnerId = u.Id,Close_Date_Update_Disabled__c = false);
        upsert apexController;
        
        Opportunity[] opportunities1 = new Opportunity[]{};
        
        test.startTest();
        system.runAs(u){
                
                for(integer i = 0; i < 200; i++) {
                    opportunities1.add(new Opportunity(
                        Name          = 'Test Opp ' + i,
                        OwnerId       = u.Id,
                        StageName     = 'Prospecting',
                        CloseDate     = date.today().addDays(1),
                        Amount        = 100));
                }
            insert opportunities1;
        }
        test.stopTest();
        
        List<Opportunity> opportunities2 = [SELECT CloseDate FROM Opportunity];
        
        for(Opportunity o : opportunities2){
            system.assertEquals(date.today().addDays(10), o.closeDate, 'CloseDateUpdate trigger should have changed the Opportunity close date as it was not disabled by the apexController custom setting');
        }
    }
    
    static testMethod void testCloseDateUpdateDisabled() {
        
        User u = [SELECT Id FROM User WHERE Username = '[email protected]'];
        // set the custom setting field to TRUE to deactivate the trigger
        Apx_Cntrlr__c apexController = new Apx_Cntrlr__c(SetupOwnerId = u.Id,Close_Date_Update_Disabled__c = true);
        upsert apexController;
        
        Opportunity[] opportunities1 = new Opportunity[]{};
            
        test.startTest();
        system.runAs(u){
            
            for(integer i = 0; i < 200; i++) {
                opportunities1.add(new Opportunity(
                    Name          = 'Test Opp ' + i,
                    OwnerId       = u.Id,
                    StageName     = 'Prospecting',
                    CloseDate     = date.today().addDays(1),
                    Amount        = 100));
            }
            insert opportunities1;
        }
        test.stopTest();
        
        List<Opportunity> opportunities2 = [SELECT CloseDate FROM Opportunity];
        
        for(Opportunity o : opportunities2){
            system.assertEquals(date.today().addDays(1), o.closeDate, 'CloseDateUpdate trigger should not have changed the Opportunity close date as it was disabled by the apexController custom setting');
        }
    }
        
}

Apex 코드에서 계층 사용자 정의 설정 업데이트하기

유효성 검사 또는 워크 플로 규칙을 해제하기 위해 코드를 실행하는 동안 사용자 지정 설정을 업데이트 할 수 있습니다.

아래 코드에서 일정 마감 Apex 클래스 를 만들었습니다.이 클래스 는 마감 날짜가 현재 날짜보다 6 일 작거나 같은 기회의 마감 날짜를 업데이트하고 이후 20 일로 날짜를 변경합니다.

내 맞춤 설정 Val_Rule_Cntrlr__c를 사용하여 내 기준을 충족하는 기회를 업데이트하지 못하게하는 유효성 검사 규칙을 비활성화합니다.

global class Scheduled_OppCloseDateUpdate implements Schedulable {

    global void execute(SchedulableContext SC) {
        updOpportunityCloseDates();
    }

    global void updOpportunityCloseDates() {
        
        Id userId;
        Val_Rule_Cntrlr__c setting;
        Boolean validationRulesAlreadyDisabled;
        List<Opportunity> processedOpps = new List<Opportunity>();
        Date d;
        
        // get running user's Id
        userId = userinfo.getUserId();
        // retrieve Custom Setting status, for running user
        setting = Val_Rule_Cntrlr__c.getInstance(userId);
        
        // if the setting field is false, update it to disable validation rules
        if (setting.All_Opportunity_Disabled__c == false) {
            setting.All_Opportunity_Disabled__c = true;
            upsert setting;
        }
        // if the setting field was already true, there's no need to disable it
        // but it shouldn't be switched to false by this class once the process has been completed
        else {
            validationRulesAlreadyDisabled = true;
        }
        
        // execute code to manage business process
   
        d = system.today().addDays(6);
        
        for(Opportunity o : [SELECT Id, CloseDate
                               FROM Opportunity
                              WHERE CloseDate <= :d
                                // class only updates open Opportunities
                                AND Probability > 0 AND Probability < 100])
        {
            o.CloseDate = System.today().addDays(20);
            processedOpps.add(o);
        }
        
        if (processedOpps.size() > 0) {
            update processedOpps;
        }
        
        // reactivate validation rules
        if (validationRulesAlreadyDisabled == false) {
            setting.All_Opportunity_Disabled__c = false;
            upsert setting;
        }
        
    }
    
}

수업 시간에 내 맞춤 설정 변경으로 인해 유효성 검사 규칙이 비활성화되었는지 확인하려면 Trigger_Validation_Rule__c (사용자가 볼 수 없거나 페이지 레이아웃에 추가되지 않음) 확인란과이 기준의 유효성 검사 규칙을 만들었습니다.

AND(
  $Setup.Val_Rule_Cntrlr__c.All_Opportunity_Disabled__c = FALSE,
  Trigger_Validation_Rule__c = TRUE,

  /* allow the above criteria to be met while inserting the Opportunities, without triggering the rule, in the @testSetup portion of the test */
  NOT(ISNEW())
)

그런 다음 사용자 지정 설정 필드가 내 코드에 의해 편집되지 않으면 규칙 기준을 충족 할 수 있도록 기회를 만들 때 확인란 필드를 true 설정합니다.

@isTest
private class WE_ScheduledCloseDateUpdateTest {

    @testSetup
    static void dataSetup() {

        Profile p = [SELECT Id FROM Profile WHERE Name = 'System Administrator' LIMIT 1];
        
        User u = new User(LastName = 'Test',Alias = 't1',Email = '[email protected]',Username = '[email protected]',ProfileId = p.Id,TimeZoneSidKey = 'America/Denver',LocaleSidKey = 'en_US',EmailEncodingKey = 'UTF-8',LanguageLocaleKey = 'en_US');
        insert u;

        Val_Rule_Cntrlr__c valRuleCntrlr = new Val_Rule_Cntrlr__c(SetupOwnerId = u.Id,All_Opportunity_Disabled__c = false);
        upsert valRuleCntrlr;
            
        List<Opportunity> testOpps = new List<Opportunity>();
            
        // create the Opportunities that will be updated by the class
        for(integer i = 0; i < 200; i++) {
            testOpps.add(new Opportunity(
                Name          = 'Test Opp Update' + i,
                OwnerId       = u.Id,
                StageName     = 'Prospecting',
                CloseDate     = date.today().addDays(1),
                Amount        = 100,
                // set checkbox field to true, to trigger validation rules if they've not been deactivated by class
                Trigger_Validation_Rule__c = true));
        }
        // create the Opportunities that won't be updated by the class
        for(integer i = 0; i < 200; i++) {
            testOpps.add(new Opportunity(
                Name          = 'Test Opp Skip' + i,
                OwnerId       = u.Id,
                StageName     = 'Prospecting',
                CloseDate     = date.today().addDays(15),
                Amount        = 100,
                Trigger_Validation_Rule__c = true));
        }           
        insert testOpps;

    }
    
    // code required to test a scheduled class, see https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_scheduler.htm for more details
    public static String CRON_EXP = '0 0 0 15 3 ? 2022';

    static testmethod void testCloseDateUpdates() {

        // execute scheduled class
        
        Test.startTest();
        
        String jobId = System.schedule('ScheduleApexClassTest',
                                       CRON_EXP,
                                       new Scheduled_OppCloseDateUpdate());
        
        CronTrigger ct = [SELECT Id, CronExpression, TimesTriggered, NextFireTime
                            FROM CronTrigger
                           WHERE id = :jobId];
        
        System.assertEquals(CRON_EXP, ct.CronExpression);
        System.assertEquals(0, ct.TimesTriggered);
        System.assertEquals('2022-03-15 00:00:00', String.valueOf(ct.NextFireTime));
        
        Test.stopTest();

        // test results
        
        Integer updateCount = 0;
        Integer skipCount   = 0;

        List <Opportunity> opportunitys = [SELECT Id, Name, CloseDate FROM Opportunity];

        for(Opportunity o : opportunitys) {
            if (o.Name.contains('Update') &&
                updateCount == 0)
            {
                System.assertEquals(date.today().addDays(20), o.CloseDate, 'Opportunity\'s Close Date should have been updated as it was less than 7 days away');
                updateCount = 1;
            }
            if (o.Name.contains('Skip') &&
                skipCount == 0)
            {
                System.assertEquals(date.today().addDays(15), o.CloseDate, 'Opportunity should not have been updated as it\'s Close Date is more than 7 days away');
                skipCount = 1;
            }
        }
        // check that both lists of Opportunities have been tested
        System.assertEquals(2, updateCount + skipCount, 'Count should be 2 once all assertions have been executed');
    
    }
    
    // check that the class does not change the custom setting's field to false, if it was true before class was executed
    static testmethod void testSettingUpdates() {
        
        User u = [SELECT Id FROM User WHERE UserName = '[email protected]'];
        
        // switch the custom setting field to true before the scheduled job executes
        Val_Rule_Cntrlr__c setting;
        setting = Val_Rule_Cntrlr__c.getInstance(u.Id);
        setting.All_Opportunity_Disabled__c = true;
        upsert setting;
        
        System.runAs(u) {
            
            Test.startTest();
            
            String jobId = System.schedule('ScheduleApexClassTest',
                                           CRON_EXP,
                                           new Scheduled_OppCloseDateUpdate());
            
            CronTrigger ct = [SELECT Id, CronExpression, TimesTriggered, NextFireTime
                                FROM CronTrigger
                               WHERE id = :jobId];
            
            System.assertEquals(CRON_EXP, ct.CronExpression);
            System.assertEquals(0, ct.TimesTriggered);
            System.assertEquals('2022-03-15 00:00:00', String.valueOf(ct.NextFireTime));
            
            Test.stopTest();
        }
        setting = Val_Rule_Cntrlr__c.getInstance(u.Id);
        
        // check that the class did not change the All_Opportunity_Disabled__c field to false
        System.assertEquals(true, setting.All_Opportunity_Disabled__c);
    }

}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow