AXForum  
Вернуться   AXForum > Блоги > CRM, SharePoint и Черная Магия
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
  • Консалтинг
  • Проектирование
  • Разработка
  • Обучение


MVP 2010, 2011
Рейтинг: 5.00. Голосов: 2.

Импорт участников маркетингового списка из Excel

Запись от Артем Enot Грунин размещена 11.01.2012 в 18:05
Обновил(-а) Артем Enot Грунин 11.01.2012 в 22:21

Загрузка участников маркетингового списка, или позиций прайслиста из Excel файла, является камнем преткновения уже не одной версии CRM. Менялся механизм импорта, писались утиллиты, а воз, кажется, и ныне там. Сегодня я попытаюсь решить эту проблему для всего разумного человечества или хотя бы его части!
Итак, стандартный механизм удобен тем что он:
  • Стандартный!
  • Умеет быстро делать сопоставления
  • Умеет массово грузить и связывать несколько объектов в одном задании
  • Имеет гибкие настройки поиска и сопоставления идентификаторов
Плохо только одно - он не может загружать связи N:N.
Когда я понял, что не хочу еще раз реализовывать все это, идея пришла достаточно быстро:
  1. Создаем свой кастомный объект ListMember
  2. Настраиваем в нем связи с List, Contact, Account, Lead.
  3. Стандартными средствами создаем шаблон для импорта этого объекта.
  4. Пишем плагин который асинхронно срабатывает на событие post-create объекта ListMember, вынимает из него ListId и при помощи AddMemberListRequest добавляет в него ContactId, AccountId или LeadId - в зависимости от того, что было указано в файле импорта!
На мой взгляд, это крайне элегантное решение, так как не требует больших трудозатрат и максимально полно использует стандартный функционал. В случае возникновения ошибок (например, неправильный тип списка) они будут отражаться в ошибках импорта как и все прочие!

X++:
IPluginExecutionContext context = localContext.PluginExecutionContext; // Используется CRM Developer Toolkit

            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                Entity entity = (Entity)context.InputParameters["Target"];
                fixrm_ListMember listMember = entity.ToEntity<fixrm_ListMember>();

                EntityReference listId = listMember.fixrm_ListId;
                if (listId != null)
                {
                    AddMemberListRequest request = new AddMemberListRequest();
                    request.ListId = listId.Id;

                    EntityReference accountId = listMember.fixrm_AccountId;
                    if (accountId != null)
                    {
                        request.EntityId = accountId.Id;
                    }
                    else
                    {
                        EntityReference contactId = listMember.fixrm_ContactId;
                        if (contactId != null)
                        {
                            request.EntityId = contactId.Id;
                        }
                        else
                        {
                            EntityReference leadId = listMember.fixrm_LeadId;
                            if (leadId != null)
                            {
                                request.EntityId = leadId.Id;
                            }
                        }
                    }

                    IOrganizationService service = localContext.OrganizationService;
                    service.Execute(request);
                }
            }
Неуправляемое решение и проект выложу чуть позже, как только нормально портирую его на "чистую" версию системы.

Данный подход работает и для других задач, например, для вышеупомянутой загрузки позиций прайсов или любых других связей N:N. Создав соответствующие объекты и параметризовав плагин, например, передавая ему имена полей идентификаторов и имя связи, можно загружать данные при помощи метода
X++:
IOrganizationService.Associate
Так же, в некоторых задачах может показаться разумной идея разрывать связь при событии удаления нашего вспомогательного объекта. Например, это поможет откатить изменения при откате задания импорта.
Размещено в CRM
Просмотров 29893 Комментарии 0
Всего комментариев 0

Комментарии

 


Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:31.