RSS Подписка на статьи RSS Подписка на комментарии Панель инструментов

Блог профессионалов стал частью сайта технической поддержки DocsVision http://support.docsvision.com. Новые материалы будут появляться уже на этом сайте.

Поиск

Ярлыки

авто генерация кода (1) Администрирование DocsVision (60) Атрибутивный поиск (3) База данных (24) Базы знаний (1) Безопасность (1) Бизнес-процессы (20) Блог (2) Вы увидите это первыми (1) Групповые политики (1) Диаграммы (2) Задания (2) Интеграция (2) Карточки DocsVision (14) Конструктор Решений (11) Маркетинг и продажи (4) Навигатор (3) Новое (3) Новости (32) Опрос (4) Опросы DocsVision (4) Оптимизация (3) Отчеты (2) Ошибки (1) Поддержка (14) Полезные ссылки (1) Представления (4) Производительность (5) Разбор полетов (18) Разработка для Workflow (7) разработка карточек (2) Разработка на платформе DocsVision (41) Разработка решений (43) Расширение платформы (1) Расширенные отчеты (9) Решения на платформе DocsVision (6) Сервисы DocsVision (3) Сканеры (3) Справочник сотрудников (1) Справочник типов (1) Установка (1) Утилиты (13) Шлюз в SharePoint (8) Штрихкод (2) Cкрипты карточек (7) DocsVision внутри (1) DocsVision Live (1) FileStream (1) FireFox (2) Opera (1) Powershell (5) Safari (1) SharePoint2007 (1) SharePoint2010 (2) Silverlight (1) UltraViews (1) Vista (1)
Показаны сообщения с ярлыком Расширенные отчеты. Показать все сообщения
Показаны сообщения с ярлыком Расширенные отчеты. Показать все сообщения

Права для учетной записи под которой работает сервис расширенных отчетов

Учетная запись, под которой работает наш сервис расширенных отчетов должна обладать правами на работу с MS SQL Server и используемыми базами данных, - это указано в справке.

Но какими правами должна обладать эта учетка на MS SQL сервере?

Как минимум должны быть права на запуск процедур:
  • dvrep_get_parameters
  • dvrep_get_parameters_xml
  • dvrep_set_parameter
  • dvrep_get_xml_parameters
  • dvrep_set_xml_parameter
  • dvrep_get_process_parameters_xml
  • dvrep_set_process_parameters_xml
  • dvrep_delete_process_parameters
  • dvrep_delete_card_parameters
  • dvrep_clear_parameter_values
  • dvrep_get_parameter_values
  • dvrep_set_collection_value
  • dvrep_get_parameter_enum_values
  • dvrep_cancel_request
  • dvrep_get_request_status
  • dvrep_set_request_status
  • dvrep_get_report_data
  • dvrep_set_report_data
  • dvrep_get_report_error
  • dvrep_set_report_error
  • dvrep_get_pending_requests
  • dvrep_add_request
  • dvrep_get_report_props
  • dvrep_get_report_data_type
  • dvrep_get_report_transforms
  • dvrep_get_reportid_by_alias
  • dvrep_get_user_info
  • dvrep_set_user_sid
  • dvsys_sec_read_sd
  • dvrep_set_report_page
  • dvrep_get_report_page
  • dvrep_close_report_data_cursor

А также все процедуры, которые указаны в настройках справочника расширенных отчетов, в видах отчетов на первой вкладке. Читать дальше

Оставить комментарий (всего: 0)

T-SQL Скрипт для рассчета количества рабочего времени между двумя датами с учетом бизнес-календаря (с изменениями от 15.10)

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

Попробовал использовать уже имеющиеся решения этой задачи, но столкнулся с небольшими проблемами, поэтому написал свой вариант решения.

На мой взгляд, получилось совсем не плохо :-)

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


И так, решение теперь состоит из 4 функций:

1. Функция расчета рабочего времени в первый день заданного периода
2. Функция расчета общего рабочего времени в первый день заданного периода
3. Функция расчета рабочего времени в последний день заданного периода
4. Функция расчета рабочего времени за период

Есть несколько допущений:

1. Если дата старта не задана, то она приравнивается к началу текущего дня
2. Если дата окончания не задача, то она приравнивается к текущему моменту времени
3. Если не указан идентификатор бизнес-календаря, то выполняется поиск первого в системе.
4. Если календарей нет в системе, то календарем по умолчанию считается рабочий день с 09 до 18 с перерывом на обед с 13 до 14 пять дней в неделю

При запуске процедуры расчета рабочего времени есть параметры:

@OnlyFullDay:
1 - учитываются только полные рабочие дни, т.е. без первого рабочего дня и последнего;
0 - в дополнение к полным дням учитываются первый и последний день, если в них было рабочее время

@Mode:
1 - результат возвращается в минутах (параметр @OnlyFullDay тогда игнорируется)
0 - результат в днях

Функция возвращает количество рабочих дней или количество рабочего времени в минутах.

Рабочее время вычисляется за любой промежуток времени, в том числе, при переходе между годами.

У себя тестил на различных вариантах настроек календаря и без него - работает.

Скачать скрипт

Для тех, у кого не работает первая ссылка

Читать дальше

Оставить комментарий (всего: 5)

T-SQL Скрипт для рассчета количества рабочих часов между двумя датами с учетом бизнес-календаря

Новая версия функции рассчета рабочих часов между двумя датами с учетом бизнес-календаря. Предыдущие версии содержали ошибку.

Итак напомню.


Бизнес календарь имеет 3 секции (лучше посмотреть в CardManager)

1. Основная информация (только одно поле Name, понятно для чего оно нужно)
2. Года (Years). Имеет отдно поле Year в котором указывается год
2.1 Подсекция Days. Имеет поля Day - номер дня от начала года и Type тип
2.1.1 Подсекция WorkTime. Поля StartTime и EndTime - временной диапазон
3. DefaultTimeSettings. Поля StartTime и EndTime - временной диапазон


В календаре можно делать несколько настроек.

1. Настрока рабочего времени по умолчанию.
Данная настройка будет храниться в секции DefaultTimeSettings. Строки секции будут содержать временные интервалы.

2. Настройка конкретного дня.
В этом случае будет создана строка в секции Years, в подсекции Days, в подсекции WorkTime с указанием интервала.
Например, 02.01.2009 должен быть рабочим днем, с рабочим времением с 12:00 до 15:00.
При сохранении данные будут хранится следующим образом (названия секций в квадратных скобках):
[Years]: Year = 2009
[Days]: Day = 2
[WorkTime]: StartTime=12:00, EndTime=15:00

3. Настройка календаря по умолчанию
Данные настройки будут храниться в той же секции Years (аналогично п.2), но в году 1796.

Если для конкретного дня нет сохраненных настроек, берется следующее рабочее время:
Рабочие дни: с понедельника по пятницу
Рабочий график: с 9:00 до 13:00, и с 14:00 до 18:00

Скрипт состоит из 3х функций
1. Проверка, является ли данный день рабочим FIsWorkTime
2. Ф-ция рассчета длительности рабочего времени для одного дня FGetDayDuration
3. Основная ф-ция рассчета длительности между двумя датами FBusinessHours2

Алгоритм следующий.
Ф-ция FBusinessHours2 вычисляет при помощи FGetDayDuration длительность рабочего времени в первом дне интервала (до конца первого рабочего дня). Длительность рабочего времени в последнем дне интервала (от начала рабочего дня до конечного времени), и длительность во всех днях между начальным и конечным.

Поскольку данные хранятся для конкретных дней, а не для всех, то единственным способом подсчета является перебор всех дней в цикле. Это крайне не оптимальный способ. Альтернативным вариантом было бы периодическое создание "карты" рабочего расписания для абсолютно всех дней в интервале, с хранением времени в UTC в отдельной таблице. Тогда расчет длительности можно будет выполнить несколькими SELECT'ами за доли секунды.

Ф-ция FBusinessHours2 может возвращать данные в минутах или часах в зависимости от 3-го параметра @Mode.

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

Читать дальше

Оставить комментарий (всего: 3)

Генерация расширенного отчета

При генерации отчета в браузере (по преобразованию) в результирующий файл после преобразования записывается в начало и конец следующий код:



Т.е. при создании xslt шаблона это надо учитывать, и писать сразу тело (то, что будет потом между <body> < /body>)

В связи с этим опрос. Убирать ли эту добавку при генерации отчета в будущих версиях модуля? Это, например, позволит менять название страницы в <title> < /title>.

Ответы на опрос в комментах. Например: "Убирать не надо, потому, что мы все отчеты делали изначально с учетом этого. Придется переделывать". Читать дальше

Оставить комментарий (всего: 0)

Вызов расширенного отчета из адресной строки

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

Параметры передаются как в любом запросе к aspx, первый через ? последующие через &
Имя параметра то же, какое задано в настройках отчета, и оно чувствительно к регистру.

Пример.
http://dvserver/docsvision/ReportingServer/Fetch.aspx?basename=DVBase&reportid=%7bEA242123-1C33-45BF-AEB9-E6784AAD62BD%7d&cardid=%7b99841090-2FF8-4DFB-B44A-A14A36E59FC0%7d&PartnerID=SDADFE1C-9A03-45CD-94C1-EE8577C12346

здесь
Идентификатор отчета
Идентификатор карточки расширенного отчета
Параметр


Если отчет содержит несколько параметров, то не обязательно передавать все. Те, которые не указаны в адресной строке будут взяты из настроек отчета – параметры по умолчанию.
На данный момент не реализована передача параметров типа "дата-время". Если есть необходимость в этом, то можно сделать в процедуре параметр типа "строка" и передавать значения в строке, приводя к дате уже в процедуре.

Теперь о безопасности. Нужно в любых отчетах уделять внимание безопасности. При возврате результирующего набора сервер расширенных отчетов ожидает колонку SecurityDesc, в которой должен быть дескриптор безопасности (каждая карточка ). И если у пользователя, который вызывает отчет нет прав на строку (нет записи в дескрипторе), то эта строка ему в отчет не будет возвращена. Если этой колонки нет, то будут возвращены все строки.

Как получить дескриптор - просто. Например, делается выборка по карточкам в этом случае нужно соединить Таблица.InstanceID = dvsys_instances.InstanceID, далее соединить dvsys_instances.SDID = dvsys_security.ID и получить из dvsys_security.SecurityDesc.


Добавлено.
Как это можно использовать? Например, делаете отчет, в котором есть статистика по всем контрагентам, а при нажатии на контрагента открывается новый отчет по нему (по сути в первом отчете есть ссылка на другой отчет, в который передаются параметры, как в xlst динамически делать ссылки описано в http://dvprofessionals.blogspot.com/2009/03/blog-post_4221.html).

Наример, в службе ТП, есть отчет по количеству обращений от компаний. При нажатии на название компании выводится статистика по всем обращениям от сотрудников данной, конкретной компании. Читать дальше

Оставить комментарий (всего: 1)

T-SQL функция рассчета количества рабочих часов между двумя датами с учетом бизнес-календаря

Итак, готова функция расчета количества рабочих часов между двумя датами. Данную функцию мы сами используем в отчетах по поддержке.

Прежде расскажу как хранятся данные в бизнес-календаре.
Бизнес календарь имеет 3 секции (лучше посмотреть в CardManager)

1. Основная информация (только одно поле Name, понятно для чего оно нужно)
2. Года (Years). Имеет отдно поле Year в котором указывается год
2.1 Подсекция Days. Имеет поля Day - номер дня от начала года и Type тип
2.1.1 Подсекция WorkTime. Поля StartTime и EndTime - временной диапазон
3. DefaultTimeSettings. Поля StartTime и EndTime - временной диапазон


В календаре можно делать несколько настроек.

1. Настрока рабочего времени по умолчанию.
Данная настройка будет храниться в секции DefaultTimeSettings. Строки секции будут содержать временные интервалы.

2. Настройка конкретного дня.
В этом случае будет создана строка в секции Years, в подсекции Days, в подсекции WorkTime с указанием интервала.
Например, 02.01.2009 должен быть рабочим днем, с рабочим времением с 12:00 до 15:00.
При сохранении данные будут хранится следующим образом (названия секций в квадратных скобках):
[Years]: Year = 2009
[Days]: Day = 2
[WorkTime]: StartTime=12:00, EndTime=15:00

3. Настройка календаря по умолчанию
Данные настройки будут храниться в той же секции Years (аналогично п.2), но в году 1796.

Если для конкретного дня нет сохраненных настроек, берется следующее рабочее время:
Рабочие дни: с понедельника по пятницу
Рабочий график: с 9:00 до 13:00, и с 14:00 до 18:00


Скрипт состоит из 3х функций
1. Проверка, является ли данный день рабочим FIsWorkTime
2. Ф-ция рассчета длительности рабочего времени для одного дня FGetDayDuration
3. Основная ф-ция рассчета длительности между двумя датами FBusinessHours2

Алгоритм следующий.
Ф-ция FBusinessHours2 вычисляет при помощи FGetDayDuration длительность рабочего времени в первом дне интервала (до конца первого рабочего дня). Длительность рабочего времени в последнем дне интервала (от начала рабочего дня до конечного времени), и длительность во всех днях между начальным и конечным.

Поскольку данные хранятся для конкретных дней, а не для всех, то единственным способом подсчета является перебор всех дней в цикле. Это крайне не оптимальный способ. Альтернативным вариантом было бы периодическое создание "карты" рабочего расписания для абсолютно всех дней в интервале, с хранением времени в UTC в отдельной таблице. Тогда расчет длительности можно будет выполнить несколькими SELECT'ами за доли секунды.

Ф-ция FBusinessHours2 может возвращать данные в минутах или часах в зависимости от 3-го параметра @Mode.

Скачать скрипт

Новая версия скрипта Читать дальше

Оставить комментарий (всего: 2)

T-SQL Скрипт для рассчета количества рабочих часов между двумя датами

В продолжение предыдущей статьи
Функция рассчета количества рабочих часов между двумя временными диапазонами.

Внимание, скрипт работает только если первым рабочим днем недели является понедельник. Т.е. @@DATEFIRST = 1

Скачать скрипт

Итак, опрос.
1. Нужно ли публиковать такие скрипты и примеры, которые, по сути, не относятся к DocsVision, а скорее просто к разработке?
2. Нужен ли T-SQL скрипт, который выполняет рассчет количества рабочих часов с учетом конкретного бизнес-календаря?
Ответы жду в комментариях.


Добавлено:
В скрипте ошибка - неверно ведется рассчет времени, если обе даты в одной неделе. Читать дальше

Оставить комментарий (всего: 4)

T-SQL Скрипт для рассчета количества рабочих дней между двумя датами

Для формирования внутреннего отчета нам потребовалось учитывать количество рабочих дней между двумя датами.

Была написана функция (по мотивам данного примера), которая возвращает количество рабочих дней (пока без учета нестандартных выходных).

Думаю, будет полезно тем, кто делает расширенные отчеты для контроля исполнительской дисциплины.

Скачать скрипт

Внимание, скрипт работает только если первым рабочим днем недели является понедельник. Т.е. @@DATEFIRST = 1

Если значение переменной отличается, то нужно изменить его, либо подправить скрипт. Читать дальше

Оставить комментарий (всего: 0)

Вывод в расширеном отчете ссылки на карточку

В задачах создания отчетов зачастую требуется отобразить информацию по документам. Было бы неплохо в расширенном отчете вывести ссылку на карточку, по которой пользователь собственно мог бы эту карточку открыть. Сделать это можно с помощью переменных в xsl.

Итак, будем рассматривать отчеты, которые строятся хранимыми процедурами (не MS Reporting)

Для создания расширенного отчета, который будет отображен в браузере, разработчик должен сделать
а) Хранимую процедуру в базе данных.
б) Xslt преобразование, которое будет применяться к результатам работы процедуры.

Сервер расширенных отчетов возвращает результаты работы процедуры (т.е. все SELECT'ы) в виде одного xml:

<newdataset>
<table>
<column1></column1>
<column2></column2>
</table>
<table1>
<column1></column1>
<column2></column2>
</table1>
</newdataset>

Пусть в одной из колонок в результирующем SELECT'е возвращается идентификатор карточки: колонка InstanceID.
Ссылка на карточку имеет вид http://dvserver/docsvision/?CardID={AE16A7C0-25A0-40D8-B149-5EA2EFFAE337}&ShowPanels=2048&

Фактически для вывода требуется соединить 3 строки:
1) "http://dvserver/docsvision/?CardID={"
2) InstanceID
3) "}&ShowPanels=2048&"

Сделать это можно используя переменные в xslt

<xsl:variable name="clink1">http://dvserver/docsvision/?CardID={</xsl:variable>
<xsl:variable name="clink2" select="InstanceID">
<xsl:variable name="clink3">}&аmp;ShowPanels=2048</xsl:variable>

<a href="{$clink1}{$clink2}{$clink3}">
Открыть карточку
</a>

Внимание, в тексте примера в "&аmp;" стоит кириллическая "а", - сделано, чтобы опубликовать статью. При копировании наберите тег правильно.

Готово. Теперь в отчете будет выведена ссылка, нажав на которую пользователь откроет карточку. Читать дальше

Оставить комментарий (всего: 0)