Showing posts with label System.runAs() Keyword. Show all posts
Showing posts with label System.runAs() Keyword. Show all posts

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












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 ...