среда, 20 октября 2010 г.

Результат SQL запроса и Sharepoint

Не знаю почему, но мне всегда казалось, что в Sharepoint service, ныне Foundation, существовала веб-часть для отображения выборки из базы данных. Какого же было мое удивление, когда оной я не обнаружил! Казалось бы, что может быть проще, вложить в стандартный функционал Sharepoint веб-часть для вывода результата SQL запроса к Microsoft'овскому же SQL Server, ан нет... Microsoft очередной раз проявил то ли нерасторопность, то ли пофигизм, то ли эгоизм. Не знаю, как у кого, а лично у меня это вызвало недоумение.
Но, раз уж я последнее время активно осваиваю C# и написание на нем веб-частей, создание веб-части для отображения результата запроса показалось простой задачей. И началось...
Во-первых, отображать просто результат запроса - это малофункционально. Как правило, необходимо запросу передать ряд параметров, самых разных. Как это сделать?
Во-вторых, если на входе будут параметры, то как описать какие, где хранить эту информацию и т.п.
В итоге, к веб-части сформулировались следующие требования:

  • возможность выбора или ввода параметров переменного количества;
  • возможность для параметров типа выпадающий список указывать запрос для заполнения значений;
  • отображать результат основного запроса в виде таблицы;
  • шапка таблицы должна содержать наименования полей.
Первое решение, казалось бы, очевидное, хранить все параметры настройки веб-части в параметрах самой веб-части оказалось тупиковым. Сделать так можно, но, как говорится, "овчинка выделки не стоит". Трудов будет положено много, а гибкости мало. Совершенно неожиданно (хотя, скорее это закономерно), в диалоге с коллегой у меня родилась мысль вынести все параметры веб-части за ее пределы, а именно в XML файл. В самой веб-части указывать путь только к файлу параметров и CSS файлу.

В результате, весь код веб-части свелся к созданию трех функций: разобрать параметры, заполнить списки значений параметров, заполнить таблицу результата.
Особое внимание пришлось уделить обновлению значений параметров и таблицы результата в процессе изменения значений самих параметров. Ведь изменяя, скажем, значение первого параметра, велика вероятность того, что второй параметр должен иметь уже другой список доступных значений. Передача значения первого параметра второму осуществляется с помощью оператора {n}, где n - номер параметра по порядку.
В итоге, веб-часть уже сейчас применена в двух случаях:
1. Отображение сводной таблицы объектов проектирования, которая востребована при подготовке тендерной документации.



2. Отбражение сводной таблицы посещаемости сотрудника за выбранный период.

А чтобы совсем было удобно работать, прикрутил возможность экспорта результата выборки в Excel.
Преимущества веб-части:
1. Бесплатно.
2. Полная custom'изация.
Недостатки веб-части:
1. Пока нет возможности связать веб-часть с другими веб-частями, т.е. она не может являться как источником, так и приемником для других веб-частей.
Установка веб-части AlxdSQLWebPart осуществляется с помощью bat'ника setup.bat с ключом -i. Удаление - ключ -u.
В архиве есть примеры XML и CSS файлов. Разумеется, выборки, которые в XML файле указаны не будут возвращать корректного результата, т.к. ориентированы на базы данных ЗАО "Тюменьнефтегазпроект". Однако приложенные XML файлы являются отличным примером настройки веб-части.
Если при использовании веб-части возникнут проблемы, пишите...
18.01.2011 Обновил zip файл. Исправил досадные ошибки и добавил возможность создания DateBox. Он как TextBox, только не поддерживает [me]. Позже приделаю DatePicker.

понедельник, 13 сентября 2010 г.

Применение XML web part

В составе Sharepoint по-моему с самого его рождения присутствует встроенная веб-часть по-русски называемая Средство просмотра XML (XML Web Part). Цель ее существования довольно простая: взять указанный XML и XSL, натравить последний на первого и результат вывести на сайт. Просто и красиво.
Однако, лично у меня никак у меня не складывалась для нее задачка. В первом случае функционала веб-части оказалось недостаточно. Во-втором случае... вот про второй случай и пишу, собственно.
Как я писал ранее в блоге, у нас имеется отличный файл PassThrough.xml на сервере Sharepoint в котором хранится информация о всех входах и выходах сотрудников в/из здания института. Файл обновляется каждые 5 минут, чего достаточно для того, чтобы информацию назвать актуальной. И родилась мысль, что из базы проходов сотрудников через турникет можно вывести некоторую статистическую информацию, например:

  • количество сотрудников пришедших за день
  • количество сотрудников пришедших вовремя
  • количество сотрудников пришедших с опозданием 10 минут
  • количество сотрудников совсем опоздавших
  • количество сотрудников в здании на текущий момент с учетом вошедших и вышедших

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


Учитывая, что все равно заинтересуются более-менее детальной информацией об опоздавших и т.п., сразу добавил возможность раскрыть список соответствующих сотрудников с указанием времени прохода через турникет.

Странной особенностью настройки веб-части оказалось указание путей поиска XML и XSL файлов. В соответствии с требованием веб-части изначально указал относительные URL пути:

_layouts/1049/styles/AlxdContactNavigator/PassThrough.xml

_layouts/1049/styles/AlxdContactNavigator/PassThrough.xsl

Проверка указанных путей прошла отлично, но веб-часть упорно отрицала существование файла. Чего только я не перепробовал, пока не догадался подсунуть локальный полный путь к файлу, а именно:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\1049\STYLES\AlxdContactNavigator\PassThrought.xsl

И вот тут веб-часть успешно приняла исходные параметры и показала мне результат.

XML и XSL файл, плюсом к ним CSS файл лежат в архиве PassThrough.zip, если кому будет интересно.

вторник, 7 сентября 2010 г.

Контакты в Sharepoint 2010

Разработчики Microsoft очевидно очень любят все менять в своих продуктах, особенно интерфейс, поэтому под каждую новую версию продукта приходится перекомпилировать все доп. модули. Не обошла стороной судьба и веб-часть AlxdContactNavigator. К счастью, перекомпиляция прошла гладко, модификации кода практически не было, пришлось только поправить bat-ник, ответственный за инсталляцию веб-части (bat-ник от старой веб-части).

В итоге, получился ожидаемый результат:



Отдельно хочу остановиться на доп. возможности, которую реализовал при отображении дерева контактов и информации о контакте, а именно, информации о присутствии. Как я писал раньше, у нас есть проходная, которая работает на Paradox-овской базе данных, регулярно сбоит и падает. Данные оттуда брать крайне неудобно, поэтому мой коллега написал сервис, который запускается на машине и через определенный промежуток времени перегоняет данные из базы проходной на сервер баз данных MS SQL 2005 и заодно делает файл PassThrough.xml, в котором содержится информация о прохождении сотрудников за текущий день.

Дописав код в AlxdContact.xsl и AlxdTreeView.xsl завязанный на PassThrough.xml получил отображение присутствия или отсутствия сотрудника (см. рисунок). Код в xsl ответственный за отображение присутствия легко удалить, т.к. он отмечен комментариями.

Преимущества веб-части:
1. Бесплатно.
2. Полная custom'изация.

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

Установка веб-части AlxdContactNavigator осуществляется с помощью bat'ника setup.bat с ключом -i. Удаление - ключ -u.
В архиве есть папка AlxdContactNavigator в которой расположены xml, xsl и css файлы, а также картинки. Рекомендую ее разместить так, чтобы к файлам можно было получить доступ по URL, например, я разместил в папке:
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\1049\STYLES\AlxdContactNavigator\
что соответствует URL пути:
http://server/_layouts/1049/styles/AlxdContactNavigator
Если при установке возникнут проблемы, пишите...

вторник, 1 июня 2010 г.

Контакты в Sharepoint

Многим известен такой неплохой продукт, как Microsoft Sharepoint Service (он же WSS). Внешне вполне привлекательный и удобный инструмент становится крайне несговорчивым, когда знакомишься с ним поближе и пытаешь выдавить из него хоть чуточку полезного функционала. Вот и я столкнулся с тем, что надо бы как-то удобно организовать доступ к информации о пользователях ЗАО "Тюменьнефтегазпроект" посредством WSS, но как?

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

Пример отображения веб-части с результатом поиска по фамилии:

Требования к веб-части у меня были достаточно простые или скорее, очевидные, а именно:
  • получение списка пользователей из Active Directory;
  • отображение списка в виде дерева;
  • отображение списка в виде списка (простите за такой оборот);
  • поиск по фамилии, имени, отчеству;
  • отображение максимально полной информации о пользователе.
Дополнительными требованиями выдвинул:
  • возможность отображать информацию о пользователе выборочно, например, в зависимости от прав доступа;
  • возможность интегрироваться в внешними приложениями посредством xml/xsl.

Как это работает
Прежде всего, веб-часть проверят все входные параметры, пути к XSL файлам, параметры LDAP запроса к серверу и т.п. При удачной проверке обращается к домену и запрашивает у него информацию о пользователях. Сохраняет все в XML файле, а потом натравливает на него XSL файлы для преобразования в удобоваримый вид.

Что для этого нужно
Веб-часть просит большое количество входных параметров, большая часть которых прописана изначально и половина из них нарочно неверно. Начнем по-порядку, исходными параметрами для веб-части являются:
  • Атрибуты
  • Фильтр
  • Ключи
  • Домен
  • Имя пользователя
  • Пароль пользователя
  • Период обновления
  • Ориентация
  • Высота дерева
  • Ссылка на XML файл
  • Ссылка на XSL файл для дерева
  • Ссылка на XSL файл для контакта
  • Ссылка на XSL файл для списка
  • Ссылка на CSS файл
Отдельно остановлюсь на каждом параметре.
Атрибуты - это атрибуты объекта User, которые будут запрошены LDAP запросом.
Фильтр - это фильтр LDAP запроса, чтобы не выбрать лишние объекты.
Ключи - это ключевые атрибуты, по которым будет построено дерево пользователей (они передаются в XSL файл).
Домен - это адрес домена, можно указать и порт по которому надо обращаться к домену.
Имя пользователя - имя пользователя от имени которого будет выполнен запрос к домену (чтобы не давать лишние права системным пользователям).
Пароль пользователя - пароль пользователя от имени которого будет выполнен запрос к домену.
Период обновления - это период обновления XML файла в часах, т.е. если с момента последнего обновления XML файла не прошло указанное количество часов, то он не будет обновляться, а просто возьмет те данные, которые в нем уже есть.
Ориентация - это возможность спланировать размещение элементов веб-части, обычно Left2Right.
Высота дерева - это высота дерева в пикселях, по сути, от нее зависит и высота веб-части.
Ссылка на XML файл - это относительный путь к XML файлу в котором будет храниться результат LDAP запроса. К файлу надо дать соответствующие права доступа всем пользователям, которые заходят на сайт (в архиве файл AlxdDirectory.xml).
Ссылка на XSL файл для дерева - это относительный путь к XSL файлу, который преобразует XML файл в подходящий для формирования дерева формат (в архиве файл AlxdTreeView.xsl).
Ссылка на XSL файл для контакта - это относительный путь к XSL файлу, который преобразует XML файл в карточку контакта (визитку). В нем можно фантазировать без ограничений, например я разместил в нем даже ссылку на фотографию сотрудника (в архиве файл AlxdContact.xsl).
Ссылка на XSL файл для списка - это относительный путь к XSL файлу, который преобразует XML файл в выпадающий список (в архиве файл AlxdSelect.xsl).
Ссылка на CSS файл - это относительный путь к CSS файлу, который позволяет оформить веб-часть по своему усмотрению (в архиве файл AlxdContactNavigator.css).
Все XML, XSL и CSS, а также JPG файлы (все есть в архиве) лучше разместить на сервере IIS в одной папке, например, мне было удобно разместить по адресу:
Указанные выше адреса соответствуют путям:
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\AlxdContactNavigator\AlxdDirectory.xml
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\AlxdContactNavigator\AlxdTreeView.xsl
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\AlxdContactNavigator\AlxdContact.xsl
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\AlxdContactNavigator\AlxdSelect.xsl
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\AlxdContactNavigator\AlxdContactNavigator.css
В эту же папку разумно разместить дополнительные файлы, которые могут быть востребованы XSL преобразованиями, например, картинки.

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

Недостатки веб-части:
1. Пока что не умеет соединяться с другими веб-частями.
2. Нет механизма оповещения о приходе/уходе сотрудника.
3. Может медленно работать, если поставить маленький период обновления (только зачем?) или база пользователей весьма большая.

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

Настройка веб-части сводится к указанию правильных входных параметров. Например, есть домен dmn.local из которого надо извлечь информацию о пользователях.
Во-первых: в параметрах веб-части атрибуты, фильтр, ключи можно изначально не трогать, сразу вписать домен: LDAP://dmn.local.
Во-вторых: обязательно указать имя пользователя от имени которого будет стучаться в домен, иначе ничего не получим, например, userlist и пароль пользователя - 123.
В-третьих: по умолчанию все пути к XML, XSL и CSS ложные, скажем, c:\AlxdDirectory.xml, поэтому их сразу надо поменять, например, на /AlxdContactNavigator/AlxdDirectory.xml и т.д.

Пример заполнения параметров веб-части:

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


У нас, помимо простого отражения дерева контактов, возникла еще одна потребность, отразить присутствие или отсутствие сотрудника на работе. Данные об этом хранятся в базе автоматического турникета. Мой коллега написал сервис, который из базы турникета перегоняет данные в базу MS SQL. А потом уже из этой базы формирует XML файл PassThrough.xml на текущий день. Мне осталось только дописать в XSL код, который извлекает данные из доп. XML файла и консолидирует их. В итоге, все пользователи изначально отображаются синими иконками, если пришел на работу - зелеными, если ушел - красными. Наглядно. Удобно. Просто.
Пример XSL консолидирующего данные из двух XML файлов также вложен в архив.

Upd: Исходник AlxdContactNavigator.source.zip 

вторник, 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 за найденную ошибку).

понедельник, 19 апреля 2010 г.

Русификация DWG True View 2010-2011

Намедни столкнулся с тем, что надо бы использовать небезызвестный продукт Autodesk DWG True View в ЗАО "Тюменьнефтегазпроект" для экономии сетевых лицензий других, коммерческих продуктов Autodesk, в частности AutoCAD, но вот незадача, русифицированного его не найти. Порылся в разных форумах, поисковиках, ну никто не озадачивался подобным вопросом, в том числе и разработчик. При этом как-то некрасиво, когда в компании все продукты русифицированы, а простой просмотрщик - нет.

Пришлось "засучить рукава" и взяться за дело лично. Прежде всего, надо было составить таблицу перевода, т.е. англ. команда = русской команде. Художественный перевод мне не сделать, т.к. английский я знаю неважно, поэтому 95% названий команд я слямзил с русифицированной версии AutoCAD и наверняка сделал верно, чтобы не пугать пользователя новыми русскими командами.

Затем открыл AutoCAD 2011, подгрузил командой menuload менюшку dwgviewr.cuix и начал методично ее править. Поправил, сохранил, выгрузил.
Открыл DWG True View и убедившись, что все команды на великом и могучем родном языке, пустил менюшку в производство.

Весь процесс перевода занял часа 2 нудной, неинтересной и скучной работы.
Русифицированное меню DWG True View 2010-2011.

Путь расположения файла для подмены на моем компьютере, например: C:\Documents and Settings\Shetinin\Application Data\Autodesk\DWG TrueView 2010\R7\enu\Support