Tuesday, November 20, 2018

Future Method and Mixed DML Errors in Salesforce.com

Future Method and Mixed DML Errors in Salesforce.com

When we perform DML on setup and non-setup sObject simultaneously then mixed dml errors occurs. 

To avoid mixed DML errors
1) Create a method that performs a DML operation on one type of sObject.
2) Create a second method that uses the future annotation to manipulate a second sObject type.

Apex Class

public class MixedDMLFuture {
    public static void useFutureMethod() {
        // First DML operation
        Account a = new Account(Name='Acme');
        insert a;
       
        // This next operation (insert a user with a role)
        // can't be mixed with the previous insert unless
        // it is within a future method.
        // Call future method to insert a user with a role.
        
UtilClass.insertUserWithProfileAndRole('username@abc.com', 'myAlias',
            'emailAddress@abc.com', 'Bill','Business Head', 'CEO');       
    }
}


Apex Future Method

public class UtilClass {
    @future
    public static void insertUserWithProfileAndRole(
        String userNameIs, String aliasIs, String emailAdd, String lastNameIs, String profileName, String roleName) {
        
//Get the profile Id 
        Profile profile = [SELECT Id FROM Profile WHERE Name=:profile];
//Get the role Id
        UserRole role = [SELECT Id FROM UserRole WHERE Name=:role];
        
// Create new user with a non-null user role ID
        User usr = new User(alias = aliasIs, 
            email=emailAdd,
            emailencodingkey='UTF-8', 
            lastname=lastNameIs,
            languagelocalekey='en_US',
            localesidkey='en_US', 
            profileid = profile.Id, 
            userroleid = role.Id,
            timezonesidkey='America/Los_Angeles',
            username=userNameIs);
        insert usr;
    }
}


Apex Test Class
============

Mixed DML Operations in Test Methods :-
The System.runAs() block runs in the current user’s context. It creates a test user with a role and a test account, which is a mixed DML operation.
Using Test.startTest and Test.stopTest to bypass the mixed DML error in a Test Method.

@isTest
private class insertUserWithProfileAndRoleTest{

    static testMethod void createTestUser(){

        Profile pro = [Select Id From Profile Where Name = 'System Administrator'];

        //Create setup sObject records (User)
        User usr = new User();
        usr.FirstName = 'First';
        usr.LastName = 'Last';
        usr.Email = 'first@test.com';
        usr.Username = 'astest@test.com';
        usr.Alias = 'first';
        usr.ProfileId = pro.Id;
        usr.TimeZoneSidKey = 'America/Denver';
        usr.LocaleSidKey = 'en_US';
        usr.EmailEncodingKey = 'UTF-8';
        usr.LanguageLocaleKey = 'en_US';
        insert usr;

        system.debug('usr is ' + usr);

        System.runas(usr){

            //Create non-setup records & run tests here
        }
    }
}












No comments:

Post a Comment

Validation in flow input text field in sfdc: Maximum 255 characters limit

The input text field validate in sfdc flow behaves opposite of the generic sfdc validation rule.  Here the validation formula is evaluating ...