Отчет-график на основе пользовательского запроса к БД
Всем добрый день. Мне нужно построить график, отображающий состояние задач по ответственному за определенный период. Он должен отображаться в основной закладке Графики раздела Задачи.Посмотрел обучающее видео http://www.training.terrasoft.ua/resources/video/741. По оси X должно быть количество, по оси Y - состояние задачи. Количество я реализовал. Типы тоже, но не совсем. Мне нужно, чтобы на гистограмме был отдельный столбец, который бы отображал просроченные задачи. Как это реализовать не знаю. Поскольку по оси X у меня состояния задач, а состояния задачи "Просрочена" я не создавал. Вопрос: можно ли создать такой доп.столбец, указать ему название "Просроченные", не добавляя новое состояние в таблицу tbl_TaskStatus (так как это необходимо только для графика, для самих задач это состояние не нужно выставлять) С графиками работаю впервые. Подскажите,пож-ста, какими средствами TS лучше реализовать. И еще вопрос: можно ли построив график(гистограмму) на основании FR отображать его в основной закладке "Графики" в разделе? Заранее спасибо!
Нравится
Здравствуйте, Антон!
- Подобная задача решалась в теме Просроченные задачи
Просьба ознакомится с темой, а так же с замечанием в последнем сообщении. - График, созданный в 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
После чего отчет FR (реализацию Вы можете посмотреть в прикрепленных файлах)
Настроить график можно следующим образом
Также необходимо настроить фильтр отчета, по отвественному
Все сервисы, используемые для ответа, в прикрепленных файлах.
Спасибо огромное за информацию и решение! Буду пробовать!
А фильтр за определенный период времени,чтоб задачи были на графике, как лучше реализовать? Добавить в фильтр отчета поля "Дата начала", "Дата завершения"?
Антон, проблема с окном фильтрацией встроенным в 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')
После чего создавать отдельное окно фильтрации для отчета, как это делается описано в блоге Передача параметра в отчет 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 не знаете где устанавливается?
Антон, я имел в виду свойство .
"Яворский Алексей" написал:Я не уверен что TeeChart поддерживает свойство кастомизации делений в Chart'ах. В общем случае можно пытаться в обработчике события Chart1OnBeforePrint отлавливать значения, и обнулять их если они не целые.
Спасибо!Алексей,а можете на JScript'е написать код обработчика события Chart1OnBeforePrint?Не понимаю как обращаться к значениям оси Y
Антон, в документации Fastreport’a также на официальном форуме никаких примеров доступа к значениям в осях Chart’a.
Предлагаю обходное решение:
В свойствах Chart'a отключить автоматическое масштабирование
После чего вручную задать Минимум и Максимум для Chat'a
В итоге график будет выглядеть так