Подготовка отчетов в условиях электронного документооборота — немаловажная часть рабочего процесса. Модуль создания диаграмм DevExpress Charts предоставляет мощные средства для формирования отчетов в системе Pilot-ICE посредством интерфейса прикладного программирования и богатой палитры настраиваемых элементов визуализации данных.
В системе электронного документооборота PilotICE есть всё необходимое для организации эффективной работы, включая сервер администрирования и клиентский модуль. Первый компонент позволяет определить структуру организации, систему циркулирующих в ней объектовдокументов и разграничение прав доступа, клиентская же часть служит для непосредственной работы с документами и реализует такие бизнеспроцессы, как выдача и контроль заданий, а также формирование отчетов. Именно подготовке отчетов в системе PilotICE посвящен данный материал. Здесь необходимо сразу же сделать следующую оговорку. Если интерфейс PilotICE в целом довольно дружелюбен (это касается даже такого «основательного» компонента, как модуль администрирования), то подготовка отчетов на определенном этапе предполагает погружение на сравнительно глубокий уровень работы с системой. Конечно же, в поставку PilotICE входит базовый набор шаблонов для создания отчетов [1], использование которых сводится главным образом к нажатию «большой зеленой кнопки» Построить отчет (рис. 1). Но когда в шаблон необходимо внести изменения (а может быть, создать собственный отчет!), то наступает пора использовать следующую команду: Редактировать отчет.
Рис. 1
Рис. 2
Окно Дизайнер отчета представляет собой «конструктор», знакомый большинству разработчиков: в центре — поле макета, а вокруг — всё необходимое (палитра элементов управления, навигатор полей базы данных и окно свойств используемых объектов) — рис. 2. Если вид этого окна вас не испугал, будем разбираться дальше. Начнем с того, что в справочной системе PilotICE имеется ряд пошаговых инструкций для подготовки как простых отчетов, так и шаблонов, содержащих запрос на ввод пользовательских параметров [2]. В этих руководствах в числе прочих рассматриваются вопросы использования различных элементов управления (текстовых полей и таблиц). Мы попытаемся расширить наши возможности по визуальному представлению данных в отчетах посредством такого функционально насыщенного элемента, как Диаграмма.
Инструментарий для добавления диаграмм в отчеты PilotICE реализован на основе компонента Chart Wizard (Мастер Диаграмм), разработанного компанией DevExpress [3].
Предположим, необходимо подготовить отчет в формате круговой диаграммы, на которой для выбранного исполнителя будет отображаться процентное соотношение просроченных и выполненных вовремя заданий.
Сперва в новом пустом отчете определим параметр для указания исполнителя. Для этого в окне Список полей секции Параметры вызовем команду Добавить параметр (рис. 3).
Рис. 3
Введем данные об имени (Performer), типе и значении параметра (рис. 4). Тип указывается, как Pilot Organisation Unit — элемент организационной структуры (сотрудник или подразделение). В качестве Значения по умолчанию можно выбрать любой объект структуры организации.
Рис. 4
Теперь параметр доступен в Списке полей окна Дизайнера отчета (рис. 5). Запрос на ввод значений параметра будет производиться при генерации отчета, а имя параметра понадобится при написании скрипта, формирующего выборку из базы документооборота. Для работы над скриптом щелкнем по соответствующей кнопке (Скрипты) в Дизайнере отчета (рис. 5).
Рис. 5
В окне скрипта набираем код, приведенный в листинге.
//Ссылки на необходимые пространства имен
using System.Linq;
using System.Collections.Generic;
using Ascon.Pilot.Core;
using Ascon.Pilot.Client.Search;
using Ascon.Pilot.Core.WorkFlow;
using Ascon.Pilot.Pilot.Reports;
using DevExpress.XtraReports.Parameters;
//Для версий Pilot_ICE, начиная с 18.37.0.30607
//using Ascon.Pilot.DataClasses;
//Создание переменной для хранения выборки
//из базы документооборота PilotICE
ReportContext context = new ReportContext();
//Процедура для подготовки выборки по заданному
//параметру (исполнителю), а также для заполнения
//и настройки диаграммы
private void PilotReport_DataSourceDemanded(object sender, System.EventArgs e)
{LongRunning.Start(this, () => {
//Чтение значения параметра (выбранного исполнителя(ей))
var unit=(ROrganisationUnit)Parameters[«Performer»].Value;
//Получение идентификаторов всех исполнителей
//в выбранном подразделении
var ids=GetPositions(unit);
//Создание построителя запросов
var tasksBuilder = QueryBuilder.CreateTaskQueryBuilder();
//Выполнение запроса по идентификатору(ам) исполнителя(ей)
tasksBuilder.Must(TaskFields.ExecutorPositionId.BeAnyOf(ids.ToArray()));
//Создание выборки с информацией о заданиях исполнителя
context.Tasks = context.GetTasks(tasksBuilder);
//Подсчет общего количества заданий исполнителя (task_count)
//и количества просроченнных (task_exp)
int task_count = 0;
int task_exp = 0;
foreach (Ascon.Pilot.Pilot.Reports.RTask cur_task in context.Tasks) {
if (cur_task.IsDeadlineExpired){
task_exp++;}
task_count++;
}
//Завершение программы при отсутствии заданий у исполнителя
if (task_count==0){
return;}
//Удаление существующего ряда в диаграмме
chart1.Series.Remove(chart1.Series.GetElementByIndex(0));
//Создание нового ряда значений для круговой диаграммы
Series series1 = new Series(«заявки», ViewType.Pie);
//Подготовка значений для отображения на диаграмме
var p_in_time=(task_counttask_exp)*100/task_count;
var p_exp=task_exp*100/task_count;
//Заполнение ряда значениями (точками данных)
series1.Points.Add(new SeriesPoint(«Выполнено вовремя», p_in_time));
series1.Points.Add(new SeriesPoint(«Просрочено», p_exp));
//Размещение ряда на диаграмме
chart1.Series.Add(series1);
//Настройка параметров границ между секторами диаграммы
PieSeriesView myView = (PieSeriesView)series1.View;
myView.Border.Visible = true;
myView.Border.Color = Color.White;
myView.Border.Thickness = 2;
//Заполнение легенды названиями точек диаграммы
series1.LegendTextPattern = «{A}»;
//Вертикальное и горизонтальное выравнивание легенды
chart1.Legend.AlignmentVertical = LegendAlignmentVertical.Center;
chart1.Legend.AlignmentHorizontal = LegendAlignmentHorizontal.Left;
});}
//Функция, возвращающая массив идентификаторов всех
//исполнителей из выбранного для отчета подразделения
private IEnumerableGetPositions(ROrganisationUnit unit)
{return unit.IsPosition ?
new[] {unit.Id}:
unit.Children.SelectMany(x => GetPositions(x));}
Более подробную информацию об используемых в скрипте специальных классах можно получить в разделе справочной системы PilotICE, касающейся API для построения отчетов [4], а также в структуре классов диаграмм DevExpress [5].
Теперь выборка данных и настройки будущей круговой диаграммы для отчета подготовлены. Повторным щелчком по кнопке Скрипты вернемся в «визуальное» окно дизайнера и добавим в секцию Detail вложенный отчет (рис. 6).
Рис. 6
Затем «перетащим» экземпляр объекта типа «диаграмма» из палитры стандартных элементов управления в добавленную область вложенного отчета. При этом автоматически запустится Мастер диаграмм, на первом шаге которого выбирается тип диаграммы. В нашем примере это Круговая диаграмма (рис. 7).
Рис. 7
Следующие шаги Мастера позволяют детально определить внешний вид диаграммы и настроить точки данных. В нашей задаче все необходимые действия для отрисовки диаграммы мы уже приготовили в скрипте, поэтому в Мастере после выбора типа можно сразу щелкнуть по кнопке Готово (рис. 8).
Рис. 8
Аннотируем отчет, добавив в него информацию об исполнителе заявокзаданий. Для этого поместим экземпляр элемента Текст перед графикомдиаграммой в Дизайнере отчета (рис. 9).
Рис. 9
Рис. 10
Изменим текст в добавленной надписи (рис. 10).
Для отображения конкретного исполнителя, выбираемого при формировании отчета, создадим еще один объектнадпись. Для ее заполнения будем использовать данные о параметре из Списка полей в окне Дизайнера отчета (рис. 11).
Перетащим параметр Performer в подготовленное текстовое поле (рис. 12).
Рис. 11
Рис. 12
Сохраним шаблон отчета и перейдем к его формированию на вкладке Предпросмотр печати (рис. 13).
При построении отчета становится доступной панель для ввода значений параметров. Завершив ввод нажатием кнопки OK, мы получим искомые результаты в виде диаграммы, иллюстрирующей процентное соотношение заявок определенному исполнителю, выполненных вовремя и просроченных (рис. 14).
Рис. 14
Рис. 15
При выборе исполнителя заявки становится доступной организационная структура, позволяющая выбрать как подразделение, так и отдельного сотрудника (рис. 15).
Итак, поставленная задача решена. Отчет в компактной и наглядной форме представляет информацию о заданиях, выполняемых указанным сотрудником или подразделением. Стоило ли ради этого углубляться в «джунгли» API PilotICE и DevExpress? Думается, что в этой области разработчикам PilotICE имеет смысл стремиться к ими же поднятой (довольно высоко) планке дружелюбия интерфейса системы к рядовым пользователям.
Шаблон рассмотренного нами отчета можно скачать [6], добавить в систему PilotICE и при необходимости изменить в нем те или иные настройки.
Полезные ссылки:
- Базовый комплект отчетов для системы PilotICE // https://pilot.ascon.ru/release/ReportSamples_ru.zip
- Onlineсправка по созданию шаблонов отчетов в системе PilotICE // http://help.pilotems.com/ru/Content/report_template.htm?tocpath=PilotICE|Отчеты|_____2
- Документация по Chart Wizard // https://documentation.devexpress.com/WindowsForms/7039/ControlsandLibraries/ChartControl/DesignTimeFeatures/ChartWizard
- Onlineсправка по API для построения отчетов в системе PilotICE // http://help.pilotems.com/ru/Content/report_api.htm?tocpath=PilotICE|Отчеты|_____3
- Структура классов для диаграмм DevExpress // https://documentation.devexpress.com/CoreLibraries/DevExpress.XtraCharts.namespace
- Файл рассматриваемого в статье примера отчета // https://yadi.sk/d/D4Hdmkiw7K2J_w