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

Всем добрый день. Мне нужно построить график, отображающий состояние задач по ответственному за определенный период. Он должен отображаться в основной закладке Графики раздела Задачи.Посмотрел обучающее видео 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. Во втором запросе мы будем считать количество просроченных задач.

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]

В результате наш запрос будет выдавать следующий набор данных

В работе	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}	

Далее на основании SQ необходимо создать Dataset
2
3
4
5
После чего отчет FR (реализацию Вы можете посмотреть в прикрепленных файлах)
1
Настроить график можно следующим образом
6
Также необходимо настроить фильтр отчета, по отвественному
7
Все сервисы, используемые для ответа, в прикрепленных файлах.

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

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

Антон, проблема с окном фильтрацией встроенным в FastReport, в том что можно использовать только поля датасета, в данном случае, если вы вынесете поля [tbl_Task].[StartDate] и [tbl_Task].[DueDate] в Select по ним автоматически будет проходить группировка (они попадут в GROUP BY). Для решения задачи, необходимо добавить CompareFiltr'ы по [StartDate], [DueDate] по логике аналогичной клиентской, и параметры в SQ

([tbl_Task].[StartDate] < @P1 AND ([tbl_Task].[DueDate] >= @P2)

где @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

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

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