Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
MVP 2010, 2011
- Консалтинг
- Проектирование
- Разработка
- Обучение
MVP 2010, 2011
Веб часть "С днем рождения" для SharePoint
Запись от Артем Enot Грунин размещена 08.10.2009 в 12:37
Обновил(-а) Артем Enot Грунин 16.12.2009 в 09:07
Обновил(-а) Артем Enot Грунин 16.12.2009 в 09:07
Теги webpart
16.12.2009. Пришлось немного обновить данный пост. Подробно: Веб часть "С днем рождения" для SharePoint, Часть 2
Недавно возникла задача написать для MOSS 2007 веб-часть для укрепления командно-корпоративного духа - виджет с физиономиями именинников. Сперва она не показалась мне сложной, тем более в песочнице нашелся готовый пример: http://sharepointology.codeplex.com/...eleaseId=26656. Основа, как оказалось, была выбрана не вполне удачно, ибо существенная часть кода чудовищна и беспощадна к здравому смыслу. Веб часть была переписана фактически с нуля и после недолгой отладки на портале заказчика появились довольные рожи именинников. Счастье, тем не менее, было недолгим. Перебор в цикле всех пользователей MOSS средствами загадочного UserProfileManager оказался слишком ресурсоемкой задачей, в результате чего главная страница стала тормозить. Потребовалось искать другой подход. Второй и последний, на сколько мне известно, поддерживаемый способ докопаться до профилей - это вычитывать их из списка пользователей. Все разом. В XML. А потом руками или через LINQ, который мне лень осваивать. Словом, уже на десятой минуте я решил забить на это безобразие и обратился к SQL. Что в итоге оказалось лучше - уже и сам сомневаюсь, но запрос вышел чудовищный и вот он:
Запрос следует применять против базы Поставщика общих служб, по умолчанию: SharedServices1_DB. Сие чудовище вычитывает всех пользователей, чей день рождения укладывается в диапазон значений с начальной даты @startdate плюс произвольный интервал дней @interval.
Данный подход отрабатывает в десятки раз быстрее чем в случае с использованием UserProfileManager, однако порождает ряд сложностей. Во-первых поле MySiteUri хранит что угодно, только не путь к профилю, во-вторых я пока не нашел универсального способа выпытать у сервера строку соединения с базой данных поставщика общих служб или хотя бы ее название. Не мало времени ушло на то, чтобы понять как избавится от проблемы високосного года (в первых версиях запроса использовались не сами даты, а порядковые номера дней в году) и проблемы 1 января (когда диапазон дат разрывается на два периода). Решить их мне существенно помог данный пример:
http://forum.dklab.ru/viewtopic.php?p=175226. Огромное спасибо a33ik за то что открыл для меня ф-цию PIVOT.
А так же пламенное пожелание гореть в аду всем разработчикам WSS и SharePoint за <3.14>-ц какие удобные методы работы с данными и очаровательную структуру таблиц. Еще раз убедился, что разработчики MS произошли не от углеродной формы жизни.
Недавно возникла задача написать для MOSS 2007 веб-часть для укрепления командно-корпоративного духа - виджет с физиономиями именинников. Сперва она не показалась мне сложной, тем более в песочнице нашелся готовый пример: http://sharepointology.codeplex.com/...eleaseId=26656. Основа, как оказалось, была выбрана не вполне удачно, ибо существенная часть кода чудовищна и беспощадна к здравому смыслу. Веб часть была переписана фактически с нуля и после недолгой отладки на портале заказчика появились довольные рожи именинников. Счастье, тем не менее, было недолгим. Перебор в цикле всех пользователей MOSS средствами загадочного UserProfileManager оказался слишком ресурсоемкой задачей, в результате чего главная страница стала тормозить. Потребовалось искать другой подход. Второй и последний, на сколько мне известно, поддерживаемый способ докопаться до профилей - это вычитывать их из списка пользователей. Все разом. В XML. А потом руками или через LINQ, который мне лень осваивать. Словом, уже на десятой минуте я решил забить на это безобразие и обратился к SQL. Что в итоге оказалось лучше - уже и сам сомневаюсь, но запрос вышел чудовищный и вот он:
Код:
DECLARE @Interval int SET @Interval = 1 DECLARE @startdate datetime SET @startdate = GETDATE() SELECT [17] as name, [4] as fname, [5] as sname, [9] as email, [23] as ImageUri, [22] as MySiteUri, [5010] as bday FROM ( select RecordID, PropertyID, PropertyVal from UserProfileValue uv where uv.RecordID in ( select u.RecordID from UserProfileValue u inner join UserProfile_Full p on u.RecordID = p.RecordID where p.bDeleted = 0 and p.RecordID = p.MasterRecordID and u.PropertyID = 5010 and ( -- случай с переходом в новый год DATEDIFF(day, @startdate, DATEADD(year, YEAR(@startdate) - YEAR(cast(u.PropertyVal as datetime)) + 1, cast(u.PropertyVal as datetime))) < @Interval -- стандартный случай OR ( DATEDIFF(day, @startdate, DATEADD(year, YEAR(@startdate) - YEAR(cast(u.PropertyVal as datetime)), cast(u.PropertyVal as datetime))) >= 0 AND DATEDIFF(day, @startdate, DATEADD(year, YEAR(@startdate) - YEAR(cast(u.PropertyVal as datetime)), cast(u.PropertyVal as datetime))) < @Interval ) ) ) ) as bdayusers PIVOT ( MIN(PropertyVal) FOR [PropertyID] IN ([17],[4],[5],[9],[23],[22],[5010]) ) as p order by DATEPART(dy, cast([5010] as datetime))
Данный подход отрабатывает в десятки раз быстрее чем в случае с использованием UserProfileManager, однако порождает ряд сложностей. Во-первых поле MySiteUri хранит что угодно, только не путь к профилю, во-вторых я пока не нашел универсального способа выпытать у сервера строку соединения с базой данных поставщика общих служб или хотя бы ее название. Не мало времени ушло на то, чтобы понять как избавится от проблемы високосного года (в первых версиях запроса использовались не сами даты, а порядковые номера дней в году) и проблемы 1 января (когда диапазон дат разрывается на два периода). Решить их мне существенно помог данный пример:
http://forum.dklab.ru/viewtopic.php?p=175226. Огромное спасибо a33ik за то что открыл для меня ф-цию PIVOT.
А так же пламенное пожелание гореть в аду всем разработчикам WSS и SharePoint за <3.14>-ц какие удобные методы работы с данными и очаровательную структуру таблиц. Еще раз убедился, что разработчики MS произошли не от углеродной формы жизни.
Всего комментариев 0