Microsoft Dynamics 365 Blog

Today we welcome our guest blogger and CRM MVP Ayaz Ahmad. Ayaz blogs at Ayaz Ahmad [MVP MIcrosoft CRM, MBSS].


Microsoft Dynamics CRM 4.0 provides a Duplicate Detection feature to protect the quality of your data. Duplicate Detection rules can be defined for different record types, including custom entities, and can be defined across record types as well.


In background a matchcode service is running and creating/updating matchcode for new/existing records. This matchcode will be matched to detect duplicates. The Matchcode service runs asynchronously after 5 minutes and create/updates matchcode. So any record that is inserted within 5 minutes of time will not be detected. This happens only when you insert record within less than 5 minutes of time or before generation of matchcode. This results in no warning message for duplicate records even though duplicate record exists according to duplicate rules.


There is no way to persist matchcodes synchronously when records are created/updated through the UI, without writing extra code. So here are few recommendations to do so.


1. A workaround is to Import data (Tools->Import), and choose the option to prevent creation of duplicate records. This will create the matchcodes for all imported records synchronously.


2. You can force the creation of a matchcode at the time of record create/update by including the PersistInSyncOptionalParameter in the Create/Update request and setting its value to ‘True’. A code snippet that includes the optional parameter in a CreateRequest is as follows:


CreateRequest request = new CreateRequest();
request.OptionalParameters = new OptionalParameter[] { new PersistInSyncOptionalParameter (true) };


3. You can write a plugin for this at Create and Update message.



if (context.Depth <= 1)
                {
                    if ((message.ToLower() == “create”))
                    {
                        DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target];


                        TargetCreateDynamic createdynamic = new TargetCreateDynamic();
                        createdynamic.Entity = entity;                      


                        CreateRequest request = new CreateRequest();
                        request.Target = createdynamic;
                        request.OptionalParameters = new OptionalParameter[] { new PersistInSyncOptionalParameter(true) };


                        CreateResponse response = (CreateResponse)service.Execute(request);
                    }
                }
                context.InputParameters.Properties[ParameterName.Target] = null;


Cheers,


Ayaz Ahmad

We're always looking for feedback and would like to hear from you. Please head to the Dynamics 365 Community to start a discussion, ask questions, and tell us what you think!