график
отчет
Отчёты
Разработка

Отчет-график на основе пользовательского запроса к БД

Всем добрый день. Мне нужно построить график, отображающий состояние задач по ответственному за определенный период. Он должен отображаться в основной закладке Графики раздела Задачи.Посмотрел обучающее видео http://www.training.terrasoft.ua/resources/video/741. По оси X должно быть количество, по оси Y - состояние задачи. Количество я реализовал. Типы тоже, но не совсем. Мне нужно, чтобы на гистограмме был отдельный столбец, который бы отображал просроченные задачи. Как это реализовать не знаю. Поскольку по оси X у меня состояния задач, а состояния задачи "Просрочена" я не создавал. Вопрос: можно ли создать такой доп.столбец, указать ему название "Просроченные", не добавляя новое состояние в таблицу tbl_TaskStatus (так как это необходимо только для графика, для самих задач это состояние не нужно выставлять) С графиками работаю впервые. Подскажите,пож-ста, какими средствами TS лучше реализовать. И еще вопрос: можно ли построив график(гистограмму) на основании FR отображать его в основной закладке "Графики" в разделе? Заранее спасибо!

Нравится

20 комментариев

Здравствуйте, Антон!

  1. Подобная задача решалась в теме Просроченные задачи
    Просьба ознакомится с темой, а так же с замечанием в последнем сообщении.
  2. График, созданный в FastReport, вы не сможете отображать на закладке Графики в разделе Задачи. Дополнительно о графиках в FastReport Вы можете ознакомиться, пройдя по ссылке

Спасибо! тему форума пункта 1 я уже читал. Тот график который Вы там описываете делается в Fast Report же?

Да, в FastReport, так как в пользовательском запросе в клиенте Terrasoft, нет возможности установить связи признака просроченной задачи

Дата Завершения < Текущая дата
И
(Статус задачи != Выполнена или Статус задачи != Отменена)

А возможно ли в FR построить график, который у меня в описании темы стоит? то есть чтобы для одного ответственного было по оси Y - количество задач, а по оси X - состояния задач = в работе, не начата, выполнена, отменена и + просроченные? (то есть 5 столбцов гистограммы чтобы было)

Антон, в SelectQuery мы можем добавить еще один запрос, через конструкцию Union. Во втором запросе мы будем считать количество просроченных задач.
[sql]
SELECT
[TaskStatus],
[CountTask],
[ContactName],
[ContactID]
FROM
(SELECT
[tbl_TaskStatus].[Status] AS [TaskStatus],
COUNT(CAST([tbl_Task].[ID] AS VARCHAR(38))) AS [CountTask],
[tbl_Contact].[Name] AS [ContactName],
[tbl_Contact].[ID] AS [ContactID]
FROM
[dbo].[tbl_Task] AS [tbl_Task]
LEFT OUTER JOIN
[dbo].[tbl_TaskStatus] AS [tbl_TaskStatus] ON [tbl_TaskStatus].[ID] = [tbl_Task].[StatusID]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [tbl_Contact] ON [tbl_Contact].[ID] = [tbl_Task].[OwnerID]
GROUP BY
[tbl_TaskStatus].[Status],
[tbl_Contact].[Name],
[tbl_Contact].[ID]
UNION ALL
SELECT
N'Просроченные задачи' AS [TaskStatus],
COUNT(CAST([tbl_Task].[ID] AS VARCHAR(38))) AS [CountTask],
[tbl_Contact].[Name] AS [ContactName],
[tbl_Contact].[ID] AS [ContactID]
FROM
[dbo].[tbl_Task] AS [tbl_Task]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [tbl_Contact] ON [tbl_Contact].[ID] = [tbl_Task].[OwnerID]
WHERE((NOT ([tbl_Task].[StatusID] = :StatusClosedID OR
[tbl_Task].[StatusID] = :StatusCancelledID)) AND
[tbl_Task].[DueDate] < getutcdate())
GROUP BY
[tbl_Contact].[Name],
[tbl_Contact].[ID]) AS [U]
[/sql]
В результате наш запрос будет выдавать следующий набор данных
[sql]
В работе 5 Евгений Мирный {59B9825D-A16D-48AF-9C20-4DF1100E4BD5}
Выполнена 26 Евгений Мирный {59B9825D-A16D-48AF-9C20-4DF1100E4BD5}
Не начата 17 Евгений Мирный {59B9825D-A16D-48AF-9C20-4DF1100E4BD5}
Отменена 4 Евгений Мирный {59B9825D-A16D-48AF-9C20-4DF1100E4BD5}
Просроченные задачи 10 Евгений Мирный {59B9825D-A16D-48AF-9C20-4DF1100E4BD5}
[/sql]
Далее на основании SQ необходимо создать Dataset
2
3
4
5
После чего отчет FR (реализацию Вы можете посмотреть в прикрепленных файлах)
1
Настроить график можно следующим образом
6
Также необходимо настроить фильтр отчета, по отвественному
7
Все сервисы, используемые для ответа, в прикрепленных файлах.

Спасибо огромное за информацию и решение! Буду пробовать!

А фильтр за определенный период времени,чтоб задачи были на графике, как лучше реализовать? Добавить в фильтр отчета поля "Дата начала", "Дата завершения"?

Антон, проблема с окном фильтрацией встроенным в FastReport, в том что можно использовать только поля датасета, в данном случае, если вы вынесете поля [tbl_Task].[StartDate] и [tbl_Task].[DueDate] в Select по ним автоматически будет проходить группировка (они попадут в GROUP BY). Для решения задачи, необходимо добавить CompareFiltr'ы по [StartDate], [DueDate] по логике аналогичной клиентской, и параметры в SQ
[sql]
([tbl_Task].[StartDate] < @P1 AND ([tbl_Task].[DueDate] >= @P2)
[/sql]
где @P1 datetime2(7),@P2 datetime2(7) конкретные даты ('2012-04-30 21:00:00','2012-03-31 21:00:00')
1
2
После чего создавать отдельное окно фильтрации для отчета, как это делается описано в блоге Передача параметра в отчет FastReport и фильтрация (прикрепленные файлы)
SQ с добавленными фильтрами StartDate,DueDate во вложении

Спасибо, попробую!

А как сделать чтобы по оси Y разбиение не было таким мелким? чтобы отображались только целые числа

Алексей, а какого типа контрол нужно создавать в своем окне фильтрации для выбора Ответственного по задаче?(в стандартном окне при установке ответственного по задаче появляется MultiSelectWindow) В стандартном окне оно есть, а мне нужно его и в свое. Значит нужно создавать еще параметр для Ответственного, чтобы включать его для датасета отчета. Я правильно понимаю? Будут ли тут свои нюансы?

Антон, параметр и фильтр Ответственного уже создан, фильтр называется OwnerID, параметр ответственного ContactID
Если Вы хотите использовать фильтрацию по дате, следует использовать LookupControl, в этом случае будет использоваться wnd_SelectData, так как по факту Вам необходима одна запись. Нюансы описаны в моем блоге

По поводу первого вопроса, возможно свойство Chrat’a AxisValueFormat поможет решить задачу. В FastReport используется компонент TeeChart. Я не уверен что TeeChart поддерживает свойство кастомизации делений в Chart'ах. В общем случае можно пытаться в обработчике события Chart1OnBeforePrint отлавливать значения, и обнулять их если они не целые.

Мне нужен фильтр по дате и по ответственному, в своем окошке фильтрации. В sozdat_svoe_okno_filtracii_dlya_otcheta_2.doc для даты использ-ся DateTimeControl, зачем использовать
LookupControl?

По контролу Ответственный в моем окне фильтрации не совсем понял, по фильтрам понял, что они есть уже. А как в моем окне сделать так , чтобы wnd_SelectData можно было выбрать ответственного?

Где нах-ся свойство Chrat’a AxisValueFormat? не смог найти.

Алексей, спасибо за ответы!
[quote="Яворский Алексей"]

Если Вы хотите использовать фильтрацию по дате, следует использовать LookupControl, в этом случае будет использоваться wnd_SelectData, так как по факту Вам необходима одна запись.

Извините, ошибся, я имел в виду LookupControl для выбора отвественного, DateControl для передачи дат, StartDate и DueDate

Бывает) А свойство Chrat’a AxisValueFormat не знаете где устанавливается?

Антон, я имел в виду свойство 1.

"Яворский Алексей" написал:Я не уверен что TeeChart поддерживает свойство кастомизации делений в Chart'ах. В общем случае можно пытаться в обработчике события Chart1OnBeforePrint отлавливать значения, и обнулять их если они не целые.

Спасибо!Алексей,а можете на JScript'е написать код обработчика события Chart1OnBeforePrint?Не понимаю как обращаться к значениям оси Y

Антон, в документации Fastreport’a также на официальном форуме никаких примеров доступа к значениям в осях Chart’a.
Предлагаю обходное решение:
В свойствах Chart'a отключить автоматическое масштабирование
1
После чего вручную задать Минимум и Максимум для Chat'a
2
В итоге график будет выглядеть так
3

Спасибо Алексей!

Показать все комментарии