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

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


MVP 2010, 2011
Рейтинг: 5.00. Голосов: 2.

Веб часть "С днем рождения" для SharePoint

Запись от Артем Enot Грунин размещена 08.10.2009 в 12:37
Обновил(-а) Артем 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. Что в итоге оказалось лучше - уже и сам сомневаюсь, но запрос вышел чудовищный и вот он:
Код:
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))
Запрос следует применять против базы Поставщика общих служб, по умолчанию: SharedServices1_DB. Сие чудовище вычитывает всех пользователей, чей день рождения укладывается в диапазон значений с начальной даты @startdate плюс произвольный интервал дней @interval.
Данный подход отрабатывает в десятки раз быстрее чем в случае с использованием UserProfileManager, однако порождает ряд сложностей. Во-первых поле MySiteUri хранит что угодно, только не путь к профилю, во-вторых я пока не нашел универсального способа выпытать у сервера строку соединения с базой данных поставщика общих служб или хотя бы ее название. Не мало времени ушло на то, чтобы понять как избавится от проблемы високосного года (в первых версиях запроса использовались не сами даты, а порядковые номера дней в году) и проблемы 1 января (когда диапазон дат разрывается на два периода). Решить их мне существенно помог данный пример:
http://forum.dklab.ru/viewtopic.php?p=175226. Огромное спасибо a33ik за то что открыл для меня ф-цию PIVOT.
А так же пламенное пожелание гореть в аду всем разработчикам WSS и SharePoint за <3.14>-ц какие удобные методы работы с данными и очаровательную структуру таблиц. Еще раз убедился, что разработчики MS произошли не от углеродной формы жизни.
Размещено в SharePoint
Просмотров 41376 Комментарии 0
Всего комментариев 0

Комментарии

 


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