Показать сообщение отдельно
Старый 11.01.2012, 18:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,475 / 846 (79) +++++++
Регистрация: 28.10.2006
axforum blogs: Импорт участников маркетингового списка из Excel
Источник: http://axforum.info/forums/blog.php?b=308
==============

Загрузка участников маркетингового списка, или позиций прайслиста из 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(); 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); } }
Неуправляемое решение и проект выложу чуть позже, как только нормально портирую его на "чистую" версию системы.


Источник: http://axforum.info/forums/blog.php?b=308
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.