Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
MVP 2010, 2011
- Консалтинг
- Проектирование
- Разработка
- Обучение
MVP 2010, 2011
"С днем рождения" и другие напоминалки. Еще один вариант реализации
Запись от Артем Enot Грунин размещена 17.04.2013 в 09:00
Различные напоминания о приближении значимых дат являются классическим примером мигрени интегратора. Основная проблема заключается в том, что все мы стараемся оставаться в стеке знакомых нам технологий, которые уже используются на проекте. В результате, часто приходится изобретать какой-то костыль, чтобы сделать решение чуть более переносимым, или поддерживаемым.
Технически, любая реализация напоминалки должна реализовывать 3 основных компонента:
И сразу к сути: Data-Driven Subscriptions. "Подписки управляемые данными" - это опция SSRS (начиная с 2005 версии), которая позволяет выполнять запуск и доставку отчета с параметрами полученными из отдельной выборки данных. Иными словами, работает это так:
1. Создайте проект отчетов
Для этого запустите Business Intelligence Studio в составе дистрибутива SQL Server.
2. Создайте отчет
Я не рекомендую пользоваться мастером отчетов, поэтому выберите пункт Add New Item, в открывшемся окне выберите пункт Report:
3. Установите подключение к данным
В настройках укажите подключение к базе данных CRM
4. Создайте набор данных
Используйте следующий запрос:
5. Создайте параметры отчета.
Создайте скрытые обязательные параметры отчета с именами CRM_URL и ContactId (если не был создан автоматически).
Так как CRM_URL не будет автоматически передаваться системой, требуется указать значение по умолчанию для этого параметра. Значение должно быть в следующем формате:
6. Сформируйте текст сообщения
Создайте текстовое поле с наполнителем в формате HTML:
Используйте следующий код в качестве выражения:
Так как в выражение используется приведение даты к строке, могут возникнуть проблемы с форматом отображаемых данных. Чтобы этого избежать, укажите русский язык в настойках отчета:
7. Оформите отчет как вам нравится
Я использовал картинки в составе ресурсов SDK:
8. Разместите отчет в CRM или на сервере отчетов
Так как отчет не будет запускаться из CRM нет принципиальной разницы, включен он в решение CRM или нет. Если вы сохранили отчет в CRM, опубликуйте его для внешнего использования:
В случае с SQL 2012, при публикации может произойти ошибка "не задан параметр filterxml". В этом случае придется публиковать его на сервере отчетов вручную.
9. Настройте источник данных с учетными данными хранимыми на сервере
Зайдите в меню управления отчетом в веб приложении Reporting Services и перейдите в раздел Источник данных:
Необходимо указать источник с учетными данными хранимыми на сервере. В противном случае, к отчету невозможно будет создать подписку.
Убедитесь что учетная запись имеет достаточные привилегии на доступ к базе контактов.
10. Создайте подписку управляемую данными
Перейдите на вкладку "Подписки" и нажмите кнопку "Создать подписку управляемую данными":
11. Настройте параметры выборки данных подписки
Так как в предыдущем шаге мы использовали источник данных встроенный в отчет, необходимо будет повторить эту операцию для настройки подключения, которое будет использовать сама подписка. Строку подключения можно скопировать из настроек самого отчета.
12. Настройте запрос выборки данных для подписки
Введите следующий запрос:
Параметр @Interval определяет за сколько дней до дня рождения необходимо уведомить пользователя. Технически ничего не мешает получать его значение из кастомного поля контакта.
Убедитесь что он выполняется. В противном случае проверьте настройки подключения на предыдущем шаге.
13. Укажите параметры подписки
Укажите поле выборки подписки, которое содержит адрес отправки
Настройте прочие поля, например, тему сообщения
14. Настройте параметры отчета запускаемого подпиской
Укажите корректный адрес сервера CRM в параметре CRM_URL, или используте значение по умолчанию.
Укажите поле выборки ContactId для параметра отчета ContactId. В этом и заключается суть самого подхода: подписка выбирает кого уведомить и о чем, остальное делает сам отчет.
Технически, можно передавать в отчет все необходимые данные. В этом случае он может вообще обойтись без источника данных и не делать лишние запросы к базе. Хотя такой подход оправдан с точки зрения производительности, такой отчет сложнее настраивать и поддерживать, так как для внесения изменений недостаточно будет обновить сам файл отчета, а придется проходить по всем шагам мастера создания подписки и вносить правки в запрос и мапинг параметров.
15. Настройте расписание
Так как наш запрос не учитывает выходные и праздники, необходимо настроить отчет на ежедневный запуск:
Для отладки можно указать разовый запуск на ближайшее время.
16. Готово
Сохраните подписку и она начнет свою работу по расписанию. Вы будете видеть результаты ее работы в разделе подписок отчета:
Как видите, ничего сложного, хотя и достаточно муторно.
Технически, любая реализация напоминалки должна реализовывать 3 основных компонента:
- Планировщик. Осуществляет бесконечный цикл запуска запланированных заданий
- Слой работы с данными. В идеальном случае параметризуемое подключения для реализации сколь-нибудь сложных выборок
- Средство доставки, редактор шаблонов. Набор средств, позволяющих формировать текстовку сообщений и осуществлять доставку напоминаний
И сразу к сути: Data-Driven Subscriptions. "Подписки управляемые данными" - это опция SSRS (начиная с 2005 версии), которая позволяет выполнять запуск и доставку отчета с параметрами полученными из отдельной выборки данных. Иными словами, работает это так:
- Пишется отчет, который принимает один входной параметр - идентификатор именинника. Отчет производит нужную выборку данных и реализует формирование текста уведомления.
- Пишется запрос, который возвращает идентификаторы именинников и почтовый адрес ответственного за них пользователя.
- В диспетчере отчетов настраивается подписка, которая выбирает текущих именинников, запускает отчет с параметром и отправляет почту на адрес возвращенный запросом.
1. Создайте проект отчетов
Для этого запустите Business Intelligence Studio в составе дистрибутива SQL Server.
2. Создайте отчет
Я не рекомендую пользоваться мастером отчетов, поэтому выберите пункт Add New Item, в открывшемся окне выберите пункт Report:
3. Установите подключение к данным
В настройках укажите подключение к базе данных CRM
4. Создайте набор данных
Используйте следующий запрос:
5. Создайте параметры отчета.
Создайте скрытые обязательные параметры отчета с именами CRM_URL и ContactId (если не был создан автоматически).
Так как CRM_URL не будет автоматически передаваться системой, требуется указать значение по умолчанию для этого параметра. Значение должно быть в следующем формате:
X++:
[URL]http://crmserver/OrgName/CRMReports/viewer/drillopen.aspx[/URL]
Создайте текстовое поле с наполнителем в формате HTML:
Используйте следующий код в качестве выражения:
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())
7. Оформите отчет как вам нравится
Я использовал картинки в составе ресурсов SDK:
8. Разместите отчет в CRM или на сервере отчетов
Так как отчет не будет запускаться из CRM нет принципиальной разницы, включен он в решение CRM или нет. Если вы сохранили отчет в CRM, опубликуйте его для внешнего использования:
В случае с SQL 2012, при публикации может произойти ошибка "не задан параметр filterxml". В этом случае придется публиковать его на сервере отчетов вручную.
9. Настройте источник данных с учетными данными хранимыми на сервере
Зайдите в меню управления отчетом в веб приложении Reporting Services и перейдите в раздел Источник данных:
Необходимо указать источник с учетными данными хранимыми на сервере. В противном случае, к отчету невозможно будет создать подписку.
Убедитесь что учетная запись имеет достаточные привилегии на доступ к базе контактов.
10. Создайте подписку управляемую данными
Перейдите на вкладку "Подписки" и нажмите кнопку "Создать подписку управляемую данными":
11. Настройте параметры выборки данных подписки
Так как в предыдущем шаге мы использовали источник данных встроенный в отчет, необходимо будет повторить эту операцию для настройки подключения, которое будет использовать сама подписка. Строку подключения можно скопировать из настроек самого отчета.
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
Убедитесь что он выполняется. В противном случае проверьте настройки подключения на предыдущем шаге.
13. Укажите параметры подписки
Укажите поле выборки подписки, которое содержит адрес отправки
Настройте прочие поля, например, тему сообщения
14. Настройте параметры отчета запускаемого подпиской
Укажите корректный адрес сервера CRM в параметре CRM_URL, или используте значение по умолчанию.
Укажите поле выборки ContactId для параметра отчета ContactId. В этом и заключается суть самого подхода: подписка выбирает кого уведомить и о чем, остальное делает сам отчет.
Технически, можно передавать в отчет все необходимые данные. В этом случае он может вообще обойтись без источника данных и не делать лишние запросы к базе. Хотя такой подход оправдан с точки зрения производительности, такой отчет сложнее настраивать и поддерживать, так как для внесения изменений недостаточно будет обновить сам файл отчета, а придется проходить по всем шагам мастера создания подписки и вносить правки в запрос и мапинг параметров.
15. Настройте расписание
Так как наш запрос не учитывает выходные и праздники, необходимо настроить отчет на ежедневный запуск:
Для отладки можно указать разовый запуск на ближайшее время.
16. Готово
Сохраните подписку и она начнет свою работу по расписанию. Вы будете видеть результаты ее работы в разделе подписок отчета:
Как видите, ничего сложного, хотя и достаточно муторно.
Всего комментариев 3
Комментарии
-
Запись от senin24 размещена 11.05.2013 в 14:59 -
Вы знаете, есть несколько десятков реализаций этой задачи, в том числе и те, которые будут работать в 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 -
Обнаружился баг: технология некорректно работает с параметрами типа 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