function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
dmasondmason 

Preventing Duplicate Records from Saving

HI

Guys i am new to apex class so my apologises if i am using the incorrect terminology

 

Aim : Preventing Duplicate Records from Saving


after hours of research i have found an apex code which i think could meet my criteria if the code is adapted.

 

Concept-

Already existing lead in database
Company Name : Test LTD
postcode : SS34EN

 

Trying to add new lead into database
Company name : Test Limited
postcode : SS34EN

apex class would look at the company name and postcode and apply some fuzzy logic, and if it sees that the new lead is already the same as the existing lead  then don’t allow the new lead to be saved onto the database.
I want this to be applied to leads being manually entered and also on a bulk insert

The apex code i have found is , from the code below, does my idea seem viable ?

 

public class leadDupePreventerTests{

        static testMethod void testLeadDupPreventer() {

              

      // First make sure there are no leads already in the system

      // that have the email addresses used for testing

      Set<String> testEmailAddress = new Set<String>();

      testEmailAddress.add('test1@duptest.com');

      testEmailAddress.add('test2@duptest.com');

      testEmailAddress.add('test3@duptest.com');

      testEmailAddress.add('test4@duptest.com');

      testEmailAddress.add('test5@duptest.com');

      System.assert([SELECT count() FROM Lead

                     WHERE Email IN :testEmailAddress] == 0);

              

      // Seed the database with some leads, and make sure they can

      // be bulk inserted successfully.

      Lead lead1 = new Lead(LastName='Test1', Company='Test1 Inc.',

                            Email='test1@duptest.com');

      Lead lead2 = new Lead(LastName='Test2', Company='Test2 Inc.',

                            Email='test4@duptest.com');

      Lead lead3 = new Lead(LastName='Test3', Company='Test3 Inc.',

                            Email='test5@duptest.com');

      Lead[] leads = new Lead[] {lead1, lead2, lead3};

      insert leads;

              

      // Now make sure that some of these leads can be changed and

      // then bulk updated successfully. Note that lead1 is not

      // being changed, but is still being passed to the update

      // call. This should be OK.

      lead2.Email = 'test2@duptest.com';

      lead3.Email = 'test3@duptest.com';

      update leads;

              

      // Make sure that single row lead duplication prevention works

      // on insert.

      Lead dup1 = new Lead(LastName='Test1Dup',

                           Company='Test1Dup Inc.',

                           Email='test1@duptest.com');

      try {

         insert dup1;

         System.assert(false);

      } catch (DmlException e) {

         System.assert(e.getNumDml() == 1);

         System.assert(e.getDmlIndex(0) == 0);

         System.assert(e.getDmlFields(0).size() == 1);

         System.assert(e.getDmlFields(0)[0] == 'Email');

         System.assert(e.getDmlMessage(0).indexOf(

            'A lead with this email address already exists.') > -1);

      }

              

      // Make sure that single row lead duplication prevention works

      // on update.

      dup1 = new Lead(Id = lead1.Id, LastName='Test1Dup',

                      Company='Test1Dup Inc.',

                      Email='test2@duptest.com');

      try {

         update dup1;

         System.assert(false);

      } catch (DmlException e) {

         System.assert(e.getNumDml() == 1);

         System.assert(e.getDmlIndex(0) == 0);

         System.assert(e.getDmlFields(0).size() == 1);

         System.assert(e.getDmlFields(0)[0] == 'Email');

         System.assert(e.getDmlMessage(0).indexOf(

            'A lead with this email address already exists.') > -1);

            }

       

      // Make sure that bulk lead duplication prevention works on

      // insert. Note that the first item being inserted is fine,

      // but the second and third items are duplicates. Note also

      // that since at least one record insert fails, the entire

      // transaction will be rolled back.

      dup1 = new Lead(LastName='Test1Dup', Company='Test1Dup Inc.',

                      Email='test4@duptest.com');

      Lead dup2 = new Lead(LastName='Test2Dup',

                           Company='Test2Dup Inc.',

                           Email='test2@duptest.com');

      Lead dup3 = new Lead(LastName='Test3Dup',

                           Company='Test3Dup Inc.',

                           Email='test3@duptest.com');

      Lead[] dups = new Lead[] {dup1, dup2, dup3};

      try {

         insert dups;

         System.assert(false);

      } catch (DmlException e) {

         System.assert(e.getNumDml() == 2);

         System.assert(e.getDmlIndex(0) == 1);

         System.assert(e.getDmlFields(0).size() == 1);

         System.assert(e.getDmlFields(0)[0] == 'Email');

         System.assert(e.getDmlMessage(0).indexOf(

            'A lead with this email address already exists.') > -1);

         System.assert(e.getDmlIndex(1) == 2);

         System.assert(e.getDmlFields(1).size() == 1);

         System.assert(e.getDmlFields(1)[0] == 'Email');

         System.assert(e.getDmlMessage(1).indexOf(

            'A lead with this email address already exists.') > -1);

      }

       

      // Make sure that bulk lead duplication prevention works on

      // update. Note that the first item being updated is fine,

      // because the email address is new, and the second item is

      // also fine, but in this case it's because the email

      // address doesn't change. The third case is flagged as an

      // error because it is a duplicate of the email address of the

      // first lead's value in the database, even though that value

      // is changing in this same update call. It would be an

      // interesting exercise to rewrite the trigger to allow this

      // case. Note also that since at least one record update

      // fails, the entire transaction will be rolled back.

      dup1 = new Lead(Id=lead1.Id, Email='test4@duptest.com');

      dup2 = new Lead(Id=lead2.Id, Email='test2@duptest.com');

      dup3 = new Lead(Id=lead3.Id, Email='test1@duptest.com');

      dups = new Lead[] {dup1, dup2, dup3};

      try {

         update dups;

         System.assert(false);

      } catch (DmlException e) {

         System.debug(e.getNumDml());

         System.debug(e.getDmlMessage(0));

         System.assert(e.getNumDml() == 1);

         System.assert(e.getDmlIndex(0) == 2);

         System.assert(e.getDmlFields(0).size() == 1);

         System.assert(e.getDmlFields(0)[0] == 'Email');

         System.assert(e.getDmlMessage(0).indexOf(

            'A lead with this email address already exists.') > -1);

            }

              

      // Make sure that duplicates in the submission are caught when

      // inserting leads. Note that this test also catches an

      // attempt to insert a lead where there is an existing

      // duplicate.

      dup1 = new Lead(LastName='Test1Dup', Company='Test1Dup Inc.',

                      Email='test4@duptest.com');

      dup2 = new Lead(LastName='Test2Dup', Company='Test2Dup Inc.',

                      Email='test4@duptest.com');

      dup3 = new Lead(LastName='Test3Dup', Company='Test3Dup Inc.',

                      Email='test3@duptest.com');

      dups = new Lead[] {dup1, dup2, dup3};

      try {

         insert dups;

         System.assert(false);

      } catch (DmlException e) {

         System.assert(e.getNumDml() == 2);

         System.assert(e.getDmlIndex(0) == 1);

         System.assert(e.getDmlFields(0).size() == 1);

         System.assert(e.getDmlFields(0)[0] == 'Email');

         System.assert(e.getDmlMessage(0).indexOf(

            'Another new lead has the same email address.') > -1);

         System.assert(e.getDmlIndex(1) == 2);

         System.assert(e.getDmlFields(1).size() == 1);

         System.assert(e.getDmlFields(1)[0] == 'Email');

         System.assert(e.getDmlMessage(1).indexOf(

            'A lead with this email address already exists.') > -1);

      }

              

      // Make sure that duplicates in the submission are caught when

      // updating leads. Note that this test also catches an attempt

      // to update a lead where there is an existing duplicate.

      dup1 = new Lead(Id=lead1.Id, Email='test4@duptest.com');

      dup2 = new Lead(Id=lead2.Id, Email='test4@duptest.com');

      dup3 = new Lead(Id=lead3.Id, Email='test2@duptest.com');

      dups = new Lead[] {dup1, dup2, dup3};

      try {

         update dups;

         System.assert(false);

      } catch (DmlException e) {

         System.assert(e.getNumDml() == 2);

         System.assert(e.getDmlIndex(0) == 1);

         System.assert(e.getDmlFields(0).size() == 1);

         System.assert(e.getDmlFields(0)[0] == 'Email');

         System.assert(e.getDmlMessage(0).indexOf(

            'Another new lead has the same email address.') > -1);

         System.assert(e.getDmlIndex(1) == 2);

         System.assert(e.getDmlFields(1).size() == 1);

         System.assert(e.getDmlFields(1)[0] == 'Email');

         System.assert(e.getDmlMessage(1).indexOf(

            'A lead with this email address already exists.') > -1);

      }

   }

}

 




 

 

Suresh RaghuramSuresh Raghuram

Ok mason from the post what I understand is you already have an apex class which is doing dupe checker and you are writing a test class for that .

 

In simple words.

 

create a record 

like

sObjectName obj = sObjectName();

obj.field1=xyz;

obj.field2=pqr;

insert obj;

 

Similarly insert one more record on the same object then do the 

query for both records.

then check them in the system.assert(address1, address2, "dupe record found");

 

after doing such process your code will get covered. which will be ready for the deployment.

 

If this answers your question make this as a solution.

 

dmasondmason

Hi suree

I don’t have an apex class yet, i thought the code i provided was an apex class, and i was going to adapt that to my current situation

I guess i need to create a apex class which is doing the dupe checker first.
Do you have any sample coding which could point me in the correct direction ?

Yoganand GadekarYoganand Gadekar

hi,

If you are looking for prevent dup lead and your consideration for duplicate is Company name and postcode.

You need not make it look complex as this is much simpler.

 

A simple trigger will do your work.

Following trigger will prevent if comapny name or postcode is found already existing in any of the existing records.

 

trigger prevent_DupLeads (before insert, before update ){

Map<id,string>companyNameMap = New map<id,string>();

Set<String> compNameSet = New Set<String>();

Set<Id> idSet = New Set<Id>();

        for(Lead LeaObj: trigger.new){

              companyNamemap.put(LeaObj.id,LeaObj.ComapnyName__c)    

              compNameSet.add(LeaObj.)

        }

       for(Lead Lea: [Select id , companyname__c from Lead where companyname__c IN:compNameSet]){

           idSet.add(Lea.id);

       }

    for( Lead Lea:trigger.new){

        if(IdSet.conatins(Lea.id))

          Lea.AddError('Duplicate Leasd found');

    }    

 

}

dmasondmason

HI All

 

Please find below apex trigger which i have created, Only problem with this apex is that it looks at an exact match on the company name, is there anyway i can add wildcards to this apex ?

Trigger DuplicateLeadPreventer on Lead
                               (before insert, before update) {

//Get map of record types we care about from Custom Setting
 Map<String, Manage_Lead_Dupes_C__c> leadrtmap = Manage_Lead_Dupes_C__c.getAll();

 

 
 //Since only certain leads will match, put them in a separate list
 List<Lead> LeadstoProcess = new List<Lead> ();
 
 //Company to Lead Map
 Map<String, Lead> leadMap = new Map<String, Lead>();
 
    for (Lead lead : Trigger.new) {
    
     //Only process for Leads in our RecordTypeMap
         if (leadrtmap.keyset().contains(lead.RecordTypeId) ) {
                              
        // Make sure we don't treat an Company name that
       // isn't changing during an update as a duplicate.
  
              if (
                 (lead.company != null) &&
                 (Trigger.isInsert ||
                 (lead.company != Trigger.oldMap.get(lead.Id).company))
                 )
                 {
                                      
                    // Make sure another new lead isn't also a duplicate
          
                        if (leadMap.containsKey(lead.company)) {
                            lead.company.addError('Another new lead has the '
                                            + 'same company name.');
                        } else {
                            leadMap.put(lead.company , lead);
                            LeadstoProcess.add(lead);
                        }
                }
    } //end RT If Check
    } //End Loop
              
    /*
     Using a single database query, find all the leads in
     the database that have the same company address as any
     of the leads being inserted or updated.
  
   */
  
    Set<String> ExistingCompanies = new Set<String> ();

            for (Lead l: [Select Id, Company from Lead WHERE Company IN :leadMap.keyset()
                             AND RecordTypeId IN :leadrtmap.keyset()]) {
                          ExistingCompanies.add(l.Company);
                }

    //Now loop through leads to process, since we should only loop if matches
    for (Lead l : LeadstoProcess) {
        if (ExistingCompanies.contains(l.company) ) {
             l.company.addError('A lead with this company '
                               + 'name already exists.');
        }
    }
}