Источник:
http://axforum.info/forums/blog.php?b=308
==============
Загрузка участников маркетингового списка, или позиций прайслиста из Excel файла, является камнем преткновения уже не одной версии CRM. Менялся механизм импорта, писались утиллиты, а воз, кажется, и ныне там. Сегодня я попытаюсь решить эту проблему для всего разумного человечества или хотя бы его части!
Итак, стандартный механизм удобен тем что он:
- Стандартный!
- Умеет быстро делать сопоставления
- Умеет массово грузить и связывать несколько объектов в одном задании
- Имеет гибкие настройки поиска и сопоставления идентификаторов
Плохо только одно - он не может загружать связи N:N.
Когда я понял, что не хочу еще раз реализовывать все это, идея пришла достаточно быстро:
- Создаем свой кастомный объект ListMember
- Настраиваем в нем связи с List, Contact, Account, Lead.
- Стандартными средствами создаем шаблон для импорта этого объекта.
- Пишем плагин который асинхронно срабатывает на событие 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