Разработка
15
Июл
2

Предотвращение создания дубликатов через SDK

Если в CRM включить обнаружение дубликатов и попытаться создать дублирующую запись, то Вы получите всплывающее окно, информирующее Вас о наличии дублей. Однако если создавать запись через SDK, то дубликат будет создан без какого-либо предупреждения.

Чтобы избежать создания дубликатов через SDK, Вы должны передать дополнительный параметр в запросе, чтобы сервер проверил запись на наличие дубликатов прежде, чем создать ее. Для этого при использовании CreateRequest или UpdateRequest, Вы должны задать параметр SuppressDuplicateDetection = false. Пример как это использовать показан ниже (обратите внимание, что указанное в примере правило обнаружения дубликатов должно быть опубликовано):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Client;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключаемся к CRM
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2011");
            Uri uri = new Uri("http://crm2011:5555/superfirma/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
            proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            IOrganizationService service = (IOrganizationService)proxy;

            // Формируем объект
            Entity accCreate = new Entity("account");
            accCreate["name"] = "Test"; 
            
            // Формируем запрос
            CreateRequest req = new CreateRequest();
            req.Parameters.Add("SuppressDuplicateDetection", false); // Включаем проверку на дубликаты
            req.Target = accCreate;

            try
            {
                service.Execute(req); // Выполняем запрос
            }
            catch (FaultException<OrganizationServiceFault> ex)
            {
                if (ex.Detail.ErrorCode == -2147220685) // Если дубликаты были найдены, то...
                {
                    System.Console.WriteLine("Account name 'Test' exist");
                    Console.WriteLine("Press <Enter> to exit.");
                    Console.ReadLine();
                }
                else
                {
                    throw;
                }
            }
        }
    }
}



А если Вам потребуется провести предварительную проверку на наличие дублей, прежде чем создавать какую-либо запись, то можете воспользоваться сообщением RetrieveDuplicatesRequest:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Query;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключаемся к CRM
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2011");
            Uri uri = new Uri("http://crm2011:5555/superfirma/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
            proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            IOrganizationService service = (IOrganizationService)proxy;

            // Формируем объект
            Entity acc = new Entity("account");
            acc["name"] = "Test";

            RetrieveDuplicatesRequest Request = new RetrieveDuplicatesRequest();
            Request.BusinessEntity = acc;
            Request.MatchingEntityName = "account";
            Request.PagingInfo = new PagingInfo();

            try
            {
                // Выполняем запрос
                RetrieveDuplicatesResponse Response = (RetrieveDuplicatesResponse)service.Execute(Request);
                Console.WriteLine("Duplicates:"); 
                foreach (Entity account in Response.DuplicateCollection.Entities)
                {
                    Console.WriteLine(account.Id.ToString() + " - " + account["name"]);
                }
                Console.WriteLine("Press <Enter> to exit.");
                Console.ReadLine();
            }
            catch (FaultException<OrganizationServiceFault> ex)
            {
                System.Console.WriteLine(ex.Detail.Message);
                Console.WriteLine("Press <Enter> to exit.");
                Console.ReadLine();
            }
        }
    }
}


Комментарии (2)
  • Naukovych 15.07.2012

    Я правильно понимаю, что такая проверка будет отрабатывать по всем тем правилам, которые заданы в СРМ для данной сущности?

  • slivka_83 15.07.2012

    ну да 🙂 никаких конкретных правил вроде не задается…

*

code