Разработка
19
Сен
1

Обновление старых ФИО

В CRM (2011) есть три стандартных объекта: Контакт, Интерес и Пользователь. Которые имеют три стандартных поля: Фамилия, Имя и Отчество. При создании записи или обновлении одного из этих полей, автоматически генерируется другое поле: FullName, присутствующее в этих трех объектах.

Формат того, как генерируется поле FullName задается в Параметры – Администрирование – Системные параметры – вкладка Общие сведения.

Но есть у этой настройки один недостаток – она никак не затрагивает существующие записи Контакта, Интереса и Пользователя. Она только влияет на новые и обновляемые записи.
Одним из решений может быть использование SQL запроса для обновления поля FullName. Но это не поддерживаем способ (хотя и довольно быстрый и эффективный). Поэтому рассмотрим поддерживаемый способ… с помощью поддерживаемого C#-кода и консольного приложения:

  • Откройте VS 2010 и создайте новое консольное приложение;
  • Добавьте в проект ссылки на:
    • Microsoft.Xrm.Sdk
    • System.Runtime.Serialization
    • System.ServiceModel
  • Подпишите проект сложным ключем;
  • Замените код консольного приложения следующим:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Query;
    using Microsoft.Xrm.Sdk.Client;
    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;
    
                // Запускаем обновление
                UpdateFullName("contact", service);
                UpdateFullName("systemuser", service, true);
                UpdateFullName("lead", service);
            }
    
            private static void UpdateFullName(string entityName, IOrganizationService service, bool checkSystemUsers = false)
            {
                // Формируем строку запроса
                QueryExpression query = new QueryExpression(entityName);
                query.PageInfo.PageNumber = 1;
                query.ColumnSet = new ColumnSet("lastname", "middlename", "firstname");
    
                /*
                    Если просматриваем Пользователе, то добавляем условие,
                    чтобы пропустить встроенных пользоватлей SYSTEM и INTEGRATION,
                    которых нельзя модифицировать
                */ 
                if (checkSystemUsers)
                {
                    query.Criteria.AddCondition(new ConditionExpression("calendarid", ConditionOperator.NotNull));
                }
    
                EntityCollection coll;
                do
                {
                    // Запрашиваем из CRM все записи объекта
                    coll = service.RetrieveMultiple(query); 
    
                    // Просматриваем все полученные записи 
                    foreach (Entity e in coll.Entities)
                    {
                        service.Update(e); // Выполняем обновление каждой записи
                    }
                    query.PageInfo.PageNumber++;
                }
                while (coll.MoreRecords); // Выполняем до тех пор пока не останется записей
            }
        }
    }
    

    Разбор полетов:

    • Ну, сначала как всегда подключаемся к CRM. В этом куске Вам нужно подставить учетные данные своего пользователя (имя пользователя, пароль и название домена);
    • Затем поочередно вызываем функцию UpdateFullName для каждого из трех объектов;
    • В функции UpdateFullName мы формируем запрос на возврат из CRM трех полей (фамилии, имени и отчества). А для объекта Пользователь добавляем еще и проверку, чтобы исключить из обновления встроенные записи Пользователей SYSTEM и INTEGRATION;
    • На последнем этапе в функции UpdateFullName происходит запрос из CRM всех записей одного из объектов, последовательный их перебор и обновление.
      Заметьте, что при этом мы не меняем значения полей – мы просто производим обновление записи теми же значения, которые были в ней на момент запуска программы. Другими словами мы просто вызываем повторную генерацию поля FullName.
  • Осталось только выполнить код – для этого просто нажмите на зеленой стрелке на панели инструментов.

После выполнения программы поле FullName во всех записях Контакта, Интереса и Пользователя будут переформатированы в соответствии с текущими настройками системы.





Комментарии (1)
  • Vladislav Osmanov 19.09.2011

    Ну зачем же так усложнять? Запятую можно сразу скриптом вырезать. Так сказать, «лёгкий ансаппорт» : )

    UPDATE
    ContactBase
    SET
    FullName = REPLACE(FullName, N’,’, N»)
    WHERE
    fullname LIKE ‘%,%’

    Или сразу на триггер повесить.

*

code