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

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


MVP 2010, 2011
Оценить эту запись

"С днем рождения" и другие напоминалки. Еще один вариант реализации

Запись от Артем Enot Грунин размещена 17.04.2013 в 09:00
Теги report, shedule, sql

Различные напоминания о приближении значимых дат являются классическим примером мигрени интегратора. Основная проблема заключается в том, что все мы стараемся оставаться в стеке знакомых нам технологий, которые уже используются на проекте. В результате, часто приходится изобретать какой-то костыль, чтобы сделать решение чуть более переносимым, или поддерживаемым.

Технически, любая реализация напоминалки должна реализовывать 3 основных компонента:
  • Планировщик. Осуществляет бесконечный цикл запуска запланированных заданий
  • Слой работы с данными. В идеальном случае параметризуемое подключения для реализации сколь-нибудь сложных выборок
  • Средство доставки, редактор шаблонов. Набор средств, позволяющих формировать текстовку сообщений и осуществлять доставку напоминаний
Технически, мне очень нравится идея и реализация заложенная в SSIS Integration Toolkit for Microsoft Dynamics CRM. SSIS пакет можно выполнять Агентом по расписанию любой гибкости, а сам тулкит реализует удобные средства подключения к CRM, запуска Fetch запросов и запуска стандартного Workflow на полученных данных. По гибкости, это пожалуй самое мощное решение которое только можно себе представить. Есть и минусы: оно очень платное, так что его вряд ли удастся применить на всех проектах. Ниже я предлагаю другую реализацию с использованием технологий MS SQL Server, которая окажется бесплатной для обладателей Enterprise редакции этого продукта.

И сразу к сути: Data-Driven Subscriptions. "Подписки управляемые данными" - это опция SSRS (начиная с 2005 версии), которая позволяет выполнять запуск и доставку отчета с параметрами полученными из отдельной выборки данных. Иными словами, работает это так:
  • Пишется отчет, который принимает один входной параметр - идентификатор именинника. Отчет производит нужную выборку данных и реализует формирование текста уведомления.
  • Пишется запрос, который возвращает идентификаторы именинников и почтовый адрес ответственного за них пользователя.
  • В диспетчере отчетов настраивается подписка, которая выбирает текущих именинников, запускает отчет с параметром и отправляет почту на адрес возвращенный запросом.
Просто и элегантно. Кстати, это средство можно использовать и для внешних рассылок. Теперь рассмотрим пошаговый процесс реализации такого уведомления.

1. Создайте проект отчетов
Для этого запустите Business Intelligence Studio в составе дистрибутива SQL Server.

Нажмите на изображение для увеличения
Название: 1. New Project.png
Просмотров: 813
Размер:	34.9 Кб
ID:	298

2. Создайте отчет
Я не рекомендую пользоваться мастером отчетов, поэтому выберите пункт Add New Item, в открывшемся окне выберите пункт Report:

Нажмите на изображение для увеличения
Название: 2. New report.png
Просмотров: 822
Размер:	13.0 Кб
ID:	299

3. Установите подключение к данным
В настройках укажите подключение к базе данных CRM

Название: 3. Add source.png
Просмотров: 431

Размер: 11.2 Кб

4. Создайте набор данных
Используйте следующий запрос:

Нажмите на изображение для увеличения
Название: 4. Add set.png
Просмотров: 877
Размер:	45.5 Кб
ID:	301

5. Создайте параметры отчета.
Создайте скрытые обязательные параметры отчета с именами CRM_URL и ContactId (если не был создан автоматически).

Нажмите на изображение для увеличения
Название: 5. Add parameters.png
Просмотров: 717
Размер:	34.0 Кб
ID:	302

Так как CRM_URL не будет автоматически передаваться системой, требуется указать значение по умолчанию для этого параметра. Значение должно быть в следующем формате:
X++:
[URL]http://crmserver/OrgName/CRMReports/viewer/drillopen.aspx[/URL]
6. Сформируйте текст сообщения
Создайте текстовое поле с наполнителем в формате HTML:

Название: 6. Add textbox.png
Просмотров: 439

Размер: 5.7 Кб

Используйте следующий код в качестве выражения:
X++:
= String.Format("Contact <A href='{0}'>{1}</A> celebrates birthbay on {2}",
    Parameters!CRM_URL.Value & "?ID={" & Parameters!ContactId.Value.ToString() & "}&LogicalName=contact",
    First(Fields!fullname.Value, "BDays"),
    CDate(First(Fields!birthdate.Value, "BDays")).ToShortDateString())
Так как в выражение используется приведение даты к строке, могут возникнуть проблемы с форматом отображаемых данных. Чтобы этого избежать, укажите русский язык в настойках отчета:

Название: 10. Lang.png
Просмотров: 412

Размер: 7.2 Кб

7. Оформите отчет как вам нравится
Я использовал картинки в составе ресурсов SDK:

Нажмите на изображение для увеличения
Название: 20. Design.png
Просмотров: 868
Размер:	14.9 Кб
ID:	305

8. Разместите отчет в CRM или на сервере отчетов
Так как отчет не будет запускаться из CRM нет принципиальной разницы, включен он в решение CRM или нет. Если вы сохранили отчет в CRM, опубликуйте его для внешнего использования:

Нажмите на изображение для увеличения
Название: 21. Publish.png
Просмотров: 836
Размер:	22.6 Кб
ID:	307

В случае с SQL 2012, при публикации может произойти ошибка "не задан параметр filterxml". В этом случае придется публиковать его на сервере отчетов вручную.

9. Настройте источник данных с учетными данными хранимыми на сервере
Зайдите в меню управления отчетом в веб приложении Reporting Services и перейдите в раздел Источник данных:

Нажмите на изображение для увеличения
Название: 22. Manage.png
Просмотров: 779
Размер:	11.3 Кб
ID:	308

Необходимо указать источник с учетными данными хранимыми на сервере. В противном случае, к отчету невозможно будет создать подписку.

Убедитесь что учетная запись имеет достаточные привилегии на доступ к базе контактов.

10. Создайте подписку управляемую данными
Перейдите на вкладку "Подписки" и нажмите кнопку "Создать подписку управляемую данными":

Нажмите на изображение для увеличения
Название: 23. Step 1.png
Просмотров: 854
Размер:	41.4 Кб
ID:	309

11. Настройте параметры выборки данных подписки
Так как в предыдущем шаге мы использовали источник данных встроенный в отчет, необходимо будет повторить эту операцию для настройки подключения, которое будет использовать сама подписка. Строку подключения можно скопировать из настроек самого отчета.

Нажмите на изображение для увеличения
Название: 24. Step 2.png
Просмотров: 698
Размер:	37.1 Кб
ID:	310

12. Настройте запрос выборки данных для подписки
Введите следующий запрос:
X++:
DECLARE @startdate AS datetime = GETUTCDATE()
DECLARE @Interval AS INT = 30


SELECT
 c.contactid    AS [ContactId]
,u.internalemailaddress AS [MailTo]

FROM FilteredContact as c

INNER JOIN FilteredSystemUser as u
ON .ownerid = u.systemuserid
AND u.internalemailaddress is not null

WHERE DATEDIFF(day, @startdate, DATEADD(year, YEAR(@startdate) - YEAR(c.birthdate), c.birthdate)) = @Interval
Параметр @Interval определяет за сколько дней до дня рождения необходимо уведомить пользователя. Технически ничего не мешает получать его значение из кастомного поля контакта.

Убедитесь что он выполняется. В противном случае проверьте настройки подключения на предыдущем шаге.

Нажмите на изображение для увеличения
Название: 25. Step 3.png
Просмотров: 742
Размер:	115.8 Кб
ID:	311

13. Укажите параметры подписки
Укажите поле выборки подписки, которое содержит адрес отправки

Нажмите на изображение для увеличения
Название: 26. Step 4.png
Просмотров: 714
Размер:	8.3 Кб
ID:	312

Настройте прочие поля, например, тему сообщения

14. Настройте параметры отчета запускаемого подпиской
Укажите корректный адрес сервера CRM в параметре CRM_URL, или используте значение по умолчанию.

Укажите поле выборки ContactId для параметра отчета ContactId. В этом и заключается суть самого подхода: подписка выбирает кого уведомить и о чем, остальное делает сам отчет.

Технически, можно передавать в отчет все необходимые данные. В этом случае он может вообще обойтись без источника данных и не делать лишние запросы к базе. Хотя такой подход оправдан с точки зрения производительности, такой отчет сложнее настраивать и поддерживать, так как для внесения изменений недостаточно будет обновить сам файл отчета, а придется проходить по всем шагам мастера создания подписки и вносить правки в запрос и мапинг параметров.

15. Настройте расписание
Так как наш запрос не учитывает выходные и праздники, необходимо настроить отчет на ежедневный запуск:

Нажмите на изображение для увеличения
Название: 28. Step 7.png
Просмотров: 862
Размер:	58.8 Кб
ID:	313

Для отладки можно указать разовый запуск на ближайшее время.

16. Готово
Сохраните подписку и она начнет свою работу по расписанию. Вы будете видеть результаты ее работы в разделе подписок отчета:

Нажмите на изображение для увеличения
Название: 29. Monitoring.png
Просмотров: 730
Размер:	3.0 Кб
ID:	314

Как видите, ничего сложного, хотя и достаточно муторно.
Размещено в CRM
Просмотров 33487 Комментарии 3
Всего комментариев 3

Комментарии

  1. Старый комментарий
    Аватар для senin24
    А в CRM Online возможно запускать бизнес-процесс по расписанию (например раз в сутки), который бы находил контакты у которых ДР будет в ближайшие 7 дней и отправлял бы письмо менеджеру?
    Запись от senin24 размещена 11.05.2013 в 14:59 senin24 is offline
  2. Старый комментарий
    Аватар для Артем Enot Грунин
    Вы знаете, есть несколько десятков реализаций этой задачи, в том числе и те, которые будут работать в Online версии. Есть, например, такое решение: http://gonzaloruizcrm.blogspot.ru/20...s-process.html
    Однако я назвал бы их неэффективными. Дело в том, что такая задача-демон ожидания должна быть 1, а не по 1 процессу на каждую запись контакта в базе. Этого можно добиться, например, в таком решении: http://community.dynamics.com/crm/b/...x#.UY4nk5yfx2k однако, это тоже не всегда универсально, так как не все данные можно получить в статическом Fetch запросе.
    Запись от Артем Enot Грунин размещена 11.05.2013 в 15:14 Артем Enot Грунин is offline
  3. Старый комментарий
    Аватар для Артем Enot Грунин
    Обнаружился баг: технология некорректно работает с параметрами типа DateTime. Выборка данных для рассылки происходит корректно, однако при передаче такого параметра мы получаем ошибку:
    X++:
    This report requires a default or user-defined value for the report parameter 'ZYZ'. To run or subscribe to this report, you must provide a parameter value.
    Запись от Артем Enot Грунин размещена 20.05.2013 в 18:21 Артем Enot Грунин is offline
 


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