Zoeken…


Opmerkingen

Invoering

In tegenstelling tot aangepaste objecten waarop records zijn gebaseerd, kunt u met aangepaste instellingen aangepaste gegevenssets in uw organisatie gebruiken of specifieke gebruikers of profielen onderscheiden op basis van aangepaste criteria. Dit betekent bijvoorbeeld dat beheerders aangepaste hiërarchie-instellingen kunnen bewerken om workflow- / validatieregels voor afzonderlijke gebruikers of profielen te deactiveren, zonder ze voor de hele organisatie uit te schakelen (zie het voorbeeld Hiërarchie Aangepaste instellingen gebruiken om workflow- / validatieregels uit te schakelen hierboven ).

Validatieregels moeten meestal tijdelijk worden uitgeschakeld wanneer:

  • Code is het bijwerken van oude records, die het laatst zijn bewerkt voordat een validatieregel is geactiveerd en die daarom niet voldoen aan de criteria van de nieuwere regel.
  • Code is het invoegen van nieuwe records zonder de waarden vereist door de criteria van een validatieregel.

Werkstroomregels moeten meestal tijdelijk worden uitgeschakeld wanneer:

  • Ze activeren een e-mailwaarschuwing of een veldupdate die de wijzigingen die u in de record aanbrengt overschrijft of verstoort.

Het gebruik van een aangepaste instelling verleent beheerders enige declaratieve controle over code, dus een van de vele use cases is dat ze, wanneer ze worden gebruikt, het onnodig kunnen maken om code te implementeren om triggers uit te schakelen (zie het voorbeeld Hiërarchie Aangepaste instellingen gebruiken om Apex-code uit te schakelen hierboven ).

Een belangrijk voordeel voor ontwikkelaars is dat de gegevens van aangepaste instellingen zichtbaar zijn in de cache van de applicatie, waardoor efficiënte toegang mogelijk is zonder de kosten van herhaalde vragen aan de database. Deze gegevens kunnen vervolgens worden gebruikt door formulevelden, validatieregels, flows, Apex en de SOAP API - zie de Salesforce-documentatie .

De limieten en overwegingen voor aangepaste instellingen worden hier gedocumenteerd.

Lijst aangepaste instellingen

Het is ook mogelijk om aangepaste lijstinstellingen te maken. Veelvoorkomende gebruikssituaties zijn onder meer het opslaan van tweevoudige statusafkortingen, internationale voorkiesnummers en catalogusnummers voor producten. Salesforce promoot nu echter het gebruik van aangepaste metagegevenstypen in plaats van aangepaste lijstinstellingen.

Wanneer u een nieuwe aangepaste instelling gaat maken, wordt het volgende bericht weergegeven

Tip: gebruik aangepaste metadatatypen voor app-configuratie
Als u overweegt om aangepaste lijstinstellingen te gebruiken, kunt u overwegen aangepaste metadatatypes te gebruiken. In tegenstelling tot aangepaste lijstinstellingen, kunt u de records van aangepaste metadatatypes migreren met behulp van pakketten of Metadata API-tools.

Aangepaste metadatatypen hebben extra voordelen ten opzichte van aangepaste lijstinstellingen zoals beschreven in dit antwoord . En volgens de hoofdontwikkelaar van CMD's "Er is veel meer gepland voor aangepaste metadatatypen dan aangepaste instellingen voor steroïden."

Aangepaste instellingen maken en beheren

schepping

Ga naar: om een aangepaste instelling te maken:

Klassiek
Configuratie> Ontwikkelen> Aangepaste instellingen> Nieuw

Bliksem
Configuratie> Aangepaste code> Aangepaste instellingen> Nieuw

Maak uw instelling (zie de opmerkingen later in dit document voor de verschillen tussen aangepaste instellingen voor hiërarchie en lijst). U kunt de keuzelijst Zichtbaarheid negeren, tenzij u van plan bent uw instelling in een beheerd pakket te implementeren.

Om uw instellingsvelden te maken, klikt u op de knop Nieuw en volgt u het gebruikelijke proces voor het maken van een aangepast veld.

Beheer

Nadat u uw veld (en) heeft aangemaakt, kunt u beginnen met het configureren van de instelling door op de knop Beheren te klikken.

Het is eenvoudiger om de instelling te beheren als u een nieuwe weergave maakt en alle velden die u hebt gemaakt, opneemt om uzelf in één oogopslag een uitgebreid overzicht van de instelling te geven. De eigenaar van de installatie is de gebruiker of het profiel waarop de instelling van toepassing is.

Om de instelling op organisatieniveau te beheren, klikt u op de knop Nieuw boven de kop Standaard waarde van organisatieniveau (in het rode vak hieronder).

Om de instelling op gebruikers- of profielniveau te beheren, klikt u op de knop Nieuw in het blauwe vak hieronder.

Bewerk aangepaste instelling

Hiërarchie Aangepaste instellingen gebruiken om workflow / validatieregels uit te schakelen

Aangepaste instelling

Aangepaste instelling

Aangepast instellingenveld

Aangepast instellingenveld

Veldwaarde aangepaste instelling

Wanneer het veld is aangevinkt, wordt de validatieregel uitgeschakeld, voor de actieve gebruiker of in dit voorbeeld zijn profiel -

Aangepast instellingenveld Bewerken - Profiel

De regel kan ook worden uitgeschakeld voor een hele Salesforce-organisatie -

Aangepast instellingenveld Bewerken - Org

Validatie regel

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()
)

In de bovenstaande regel moeten beide criteria worden geëvalueerd als TRUE om de regel te activeren.

Aangezien het selectievakje All_Opportunity_Disabled__c wordt geëvalueerd naar TRUE wanneer het profiel van de actieve gebruiker Systeembeheerder is, wordt de regel geëvalueerd als FALSE .

Werkstroomregels

Dezelfde aanpak kan worden toegepast om workflow-regels te deactiveren.

Hiërarchie Aangepaste instellingen gebruiken om Apex-code uit te schakelen

Uitleg

In dit voorbeeld is een eenvoudige trigger gemaakt om de sluitingsdatum van een opportunity, die wordt ingevoegd of bijgewerkt, te wijzigen in een datum 10 dagen in de toekomst.

Met het selectievakje van de aangepaste instelling van de Apex Controller kan de code worden uitgeschakeld op het niveau van gebruiker / profiel / organisatie.

Topklasse

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);
        }
    }
    
}

Hoofdstuk toets

@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');
        }
    }
        
}

Hiërarchie aangepaste instellingen bijwerken in Apex Code

Misschien wilt u uw aangepaste instellingen bijwerken tijdens de uitvoering van uw code, om validatie of workflowregels uit te schakelen.

In de onderstaande code heb ik een Scheduleble Apex Class gemaakt die de sluitingsdatum van alle kansen bijhoudt waarvan de sluitingsdatum minder dan of gelijk is aan 6 dagen vanaf de huidige datum, waarbij de datum wordt gewijzigd in 20 dagen in de toekomst.

Ik zal mijn aangepaste instelling Val_Rule_Cntrlr__c gebruiken om validatieregels te deactiveren die me verhinderen de kansen bij te werken die aan mijn criteria voldoen.

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;
        }
        
    }
    
}

Om ervoor te zorgen dat mijn validatieregels worden gedeactiveerd door de wijzigingen in mijn aangepaste instelling in mijn klasse, heb ik een selectievakje Trigger_Validation_Rule__c (dat niet zichtbaar zou zijn voor gebruikers of toegevoegd aan paginalay-outs) en een validatieregel met deze criteria:

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())
)

Ik stelde vervolgens het selectievakje in op true bij het maken van mijn kansen, zodat aan de regels zou worden voldaan als het veld met aangepaste instellingen niet door mijn code wordt bewerkt.

@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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow