вторник, 18 мая 2010 г.

Сводная таблица в Sharepoint

Неделю или две назад столкнулся с необходимостью построить сводную таблицу на основании данных хранящихся в списке (SPList) Sharepoint. Погуглил, но ничего не нашел. В основном все сводится к теме: купите себе MOSS, поднимите Excel Service и публикуйте сводные таблицы посредством Microsoft Excel. При этом честно предупреждают, что есть свои нюансы и баги и т.п.

Пример исходного списка:



Короче говоря, опять пришел к выводу, что без хирургического вмешательства, ну никак. Закатал рукава и начал писать свою веб-часть (WebPart). Принцип работы веб-части простой: обратиться к списку указанного сайта, взять из него данные с помощью представления, обработать посредством XSLT и вывести результат в окно браузера.

Исходными данными для веб-части являются:

  • сайт
  • список
  • вид
  • имя поля, значения которого будут первой колонкой (fixed column)
  • имя поля, значения которого будут в шапке таблицы (header)
  • путь к XSL файлу
  • путь к CSS файлу
  • отображать нулевые значения (да/нет)
  • отображать абсолютные значения (да/нет)
  • отображать значения в % (да/нет)
Отдельно остановлюсь на каждом параметре.
Сайт - это сайт Sharepoint'а на котором следует искать список, например, http://server/oit.
Список - это имя списка на соответствующем сайте Sharepoint'а, например, Задачи.
Вид - это имя вида списка, чтобы можно было фильтровать и сортировать данные списка перед формированием сводной таблицы, например, Завершенные.
Имя поля для первой колонки - это имя поля списка, значения которого проецируются в первую колонку, например, Состояние.
Имя поля для первого ряда - это имя поля списка, значения которого проецируются в первый ряд, например, Кому назначено.
Путь к XSL файлу - это путь к файлу data.xsl, который находится в архиве.
Путь к CSS файлу - это путь к файлу data.css, который находится в архиве.
Файлы data.xsl и data.css должны быть размещены на сервере IIS в папке, к которой можно обратиться по URL, например, мне было удобно разместить по адресам:
http://server/_layouts/1049/styles/AlxdPivoteOne/data.xsl
http://server/_layouts/1049/styles/AlxdPivoteOne/data.css
Указанные выше адреса соответствуют путям:
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\LAYOUTS\1049\STYLES\AlxdPivoteOne\data.xsl
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\LAYOUTS\1049\STYLES\AlxdPivoteOne\data.css
Отображать нулевые значения - это флаг отвечающий за отображение нулевых значений в сводной таблице, если он не установлен, то ноль не отображается.
Отображать абсолютные значения - это флаг отвечающий за отображение количественных значений по каждой колонке или ряду.
Отображать значения в % - это флаг отвечающий за отображение относительных значений по каждой колонке или ряду.
Если установлены флаги для отображения абсолютных и относительных значений, то значения отображаются в виде 10[12%].

Пример полученной сводной таблицы:


Преимущества веб-части:
1. Формирование сводной опирается на XSLT преобразование описанное в XSL файле, а следовательно любой администратор или программист средней руки может его дописать или поправить.
2. Работает с полями в которых разрешены множественные значения, т.е. если в поле хранятся несколько значений, то веб-часть раскладывает их на отдельные записи и обрабатывают каждую в отдельности. Например, если задача назначена двум сотрудникам, то при обработке она будет восприниматься как две задачи - одна на каждого.
3. Поддержка Lookup полей и отображение ссылок на значения Lookup полей.

Недостатки веб-части:
1. Отсутствует разбивка на листы.
2. Отсутствует группировка по значениям.

Установка веб-части AlxdPivotOne осуществляется с помощью bat'ника setup.bat с ключом -i. Удаление - ключ -u.

P.S. Подменил файл с веб-частью, т.к. забыл в него вложить data.css и data.xsl.
P.S. Подменил файл с веб-частью, т.к. исправил ошибку при работе с большими списками, в частности, если представление списка возвращало ограниченное количество записей (обычно 100), то сводная таблица использовала тоже только 100 записей, а остальные отбрасывала. Теперь при формировании сводной таблицы используются все записи не зависимо от того, сколько их возвращает представление (спасибо Void за найденную ошибку).