Разработка
18
Мар
0

Маппинг информации об адресе между Бизнес-партнером и Контактом

Обычно Контакт «наследует» адрес родительской записи Бизнес-партнера, т.к. он в ней работает 🙂 Но автоматически они не переносятся (т.к. могут и отличаться). Поэтому задача поддержания достоверных данные является очень важной и рутинной.

Следующий пример, поможет Вам избавится от этой скучной задачи и переложить ее на плежи CRM 🙂 Данный код представляет собой плагин, который обновляет данные адреса Контактов связанных с Бизнес-партнером, каждый раз, когда происходит обновление родительской записи (с помощью стандартного CRM’ного маппинга такое возможно только при создании записи и только через связанные представления).

  • Создайте новый плагин в Visual Studio. Повесьте на него такой код:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Web.Services.Protocols;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.Sdk.Query;
    using Microsoft.Crm.SdkTypeProxy;
    
    namespace AccountContactAddressMapping
    {
        public class AddressMapping : IPlugin
        {
            public void Execute(IPluginExecutionContext context)
            {
                try
                {
                    DynamicEntity entity = null;
    
                    if (context.InputParameters.Properties.Contains(ParameterName.Target)
                        && context.InputParameters.Properties[ParameterName.Target] is DynamicEntity
                        && context.MessageName.Equals("Update"))
                    {
                        entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target];
                        
                        if (entity.Name.Equals("account"))
                        {
                            // Получаем все поля адреса перед обновлением
                            DynamicEntity preEntityImage = null;
                            preEntityImage = (DynamicEntity)context.PreEntityImages.Properties["preEntityImageXml"];
                            
                            string pre_address1_name = (string)preEntityImage.Properties["address1_name"];
                            string pre_address1_line1 = (string)preEntityImage.Properties["address1_line1"];
                            string pre_address1_line2 = (string)preEntityImage.Properties["address1_line2"];
                            string pre_address1_line3 = (string)preEntityImage.Properties["address1_line3"];
                            string pre_address1_city = (string)preEntityImage.Properties["address1_city"];
                            string pre_address1_stateorprovince = (string)preEntityImage.Properties["address1_stateorprovince"];
                            string pre_address1_postalcode = (string)preEntityImage.Properties["address1_postalcode"];
                            string pre_address1_country = (string)preEntityImage.Properties["address1_country"];
                            
                            // Получаем все поля адреса после обновления
                            DynamicEntity postEntityImage = null;
                            postEntityImage = (DynamicEntity)context.PostEntityImages.Properties["postEntityImageXml"];
                            
                            string post_address1_name = (string)postEntityImage.Properties["address1_name"];
                            string post_address1_line1 = (string)postEntityImage.Properties["address1_line1"];
                            string post_address1_line2 = (string)postEntityImage.Properties["address1_line2"];
                            string post_address1_line3 = (string)postEntityImage.Properties["address1_line3"];
                            string post_address1_city = (string)postEntityImage.Properties["address1_city"];
                            string post_address1_stateorprovince = (string)postEntityImage.Properties["address1_stateorprovince"];
                            string post_address1_postalcode = (string)postEntityImage.Properties["address1_postalcode"];
                            string post_address1_country = (string)postEntityImage.Properties["address1_country"];
                            
                            // Получаем GUID записи Бизнес-партнера
                            Key accountKey = (Key)postEntityImage.Properties["accountid"];
                            Guid accountid = accountKey.Value;
    
                            // Создаем CrmService используя контекст плагина
                            ICrmService service = context.CreateCrmService(true);
                            
                            // Находим все записи Контакта связанные с записью Бизнес-партнера
                            QueryByAttribute accountContacts = new QueryByAttribute();
                            accountContacts.ColumnSet = new AllColumns();
                            accountContacts.EntityName = EntityName.contact.ToString();
                            accountContacts.Attributes = new string[] { "parentcustomerid" };
                            accountContacts.Values = new string[] { accountid.ToString() };
    
                            BusinessEntityCollection contacts = service.RetrieveMultiple(accountContacts);
                            
                            // Обновляем найденные записи Контактов новым адресом из записи Бизнес-партнера
                            foreach (BusinessEntity b_entity in contacts.BusinessEntities)
                            {
                                contact c_contact = (contact)b_entity;
    
                                // Если в какое-либо поле адреса было внесено изменение, то обновляем аналогичное поле в Контакте
                                if (!post_address1_name.Equals(pre_address1_name))
                                {
                                    c_contact.address1_name = post_address1_name;
                                }
                                if (!post_address1_line1.Equals(pre_address1_line1))
                                {
                                    c_contact.address1_line1 = post_address1_line1;
                                }
                                if (!post_address1_line2.Equals(pre_address1_line2))
                                {
                                    c_contact.address1_line2 = post_address1_line2;
                                }
                                if (!post_address1_line3.Equals(pre_address1_line3))
                                {
                                    c_contact.address1_line3 = post_address1_line3;
                                }
                                if (!post_address1_city.Equals(pre_address1_city))
                                {
                                    c_contact.address1_city = post_address1_city;
                                }
                                if (!post_address1_stateorprovince.Equals(pre_address1_stateorprovince))
                                {
                                    c_contact.address1_stateorprovince = post_address1_stateorprovince;
                                }
                                if (!post_address1_postalcode.Equals(pre_address1_postalcode))
                                {
                                    c_contact.address1_postalcode = post_address1_postalcode;
                                }
                                if (!post_address1_country.Equals(pre_address1_country))
                                {
                                    c_contact.address1_country = post_address1_country;
                                }
    
                                // Выполняем обновление
                                service.Update(c_contact);
                            }
                        }
                    }
                }
                catch (SoapException soapex)
                {
                    throw new InvalidPluginExecutionException("Plugin Exception", soapex);
                }
            }
        }
    }
    
  • Зарегистрируйте плагин в MS CRM с помощью. Создайте для него новый шаг с такими параметрами:
    • Message: Update
    • Primary Entity: Account
    • Stage: Post Stage
    • Execution Mode: Synchronous
    • Deployment: Server
    • Pipeline: Parent Pipeline
  • Зарегистрируйте для шага два снимка:
    Первый с типом Pre, именем preEntityImageXml и следующими полями:

    • address1_name
    • address1_line1
    • address1_line2
    • address1_line3
    • address1_city
    • address1_stateorprovince
    • address1_postalcode
    • address1_country
    • accountid

    Второй с типом Post, именем postEntityImageXmlи и следующими полями:

    • address1_name
    • address1_line1
    • address1_line2
    • address1_line3
    • address1_city
    • address1_stateorprovince
    • address1_postalcode
    • address1_country
  • Тестирование: создайте несколько записей Контакта и свяжите их через головную организацию с каким-нибудь Бизнес-партнером. Затем обновите адресную информацию в этом Бизнес-партнере и идите смотреть как она изменилась в связанных Контактах 🙂




В тему: ручная реализация функции по переносу данных адреса с одной записи на другую – Искать адрес…

Комментарии (0)

*

code