Необходимо решить задачу печати отчета со структурой проекта.
Если с уровнями Проект и Стадия всё просто и понятно, то уровень Работа может иметь неограниченную вложенность (если я правильно понял).
В таких случаях для вытаскивания "дерева" обычно используют хранимую процедуру, которая рекурсивно идет по всем веткам до самого конца, возвращая данные.
Вопрос - как эти данные поместить в Dataset, чтобы его потом использовать в FastReport-отчете?
Или есть другие варианты решения задачи?
Нравится
"Глова Сергей" написал:Есть вариант экспорта дерева в эксель.
Очень интересно. Но всё равно вопрос с FastReport остается актуальным.
Что печально в экспорте проекта в эксель: стадии и работы экспортируются в порядке их создания, а не так как это отражается в реестре. В результате некая стадия, которая по логике должна быть 1ой, но создана в последнюю очередь, при эспорте отражается последней :cry:
Так что отчет действительно просто необходим!
"Тихенко Виктория" написал:Что печально в экспорте проекта в эксель
Если знать заранее, насколько глубоким будет дерево работ, то экспорт в Excel создается довольно хорошо (это, конечно, не готовый отчет, который можно каждое утро приносить начальству, но все-таки).
Но так как такого ограничения дерева в TS нету (и это хорошо), то универсальный экспорт не настроить.
"Владимир Соколов" написал:В таких случаях для вытаскивания "дерева" обычно используют хранимую процедуру, которая рекурсивно идет по всем веткам до самого конца, возвращая данные.В случае с разделом "Проекты" в этом нет необходимости, т.к. есть поле Path, которое позволяет получить все элементы одним запросом.
Вряд ли получится отобразить в FastReport дерево произвольного уровня вложенности. Можно в скрипте реализовать выгрузку в csv, а потом уже этот файл сохранять в формате Excel и приводить в нужный вид (вручную, например).
"Виталий Гдуля" написал:Можно в скрипте реализовать выгрузку в csv, а потом уже этот файл сохранять в формате Excel и приводить в нужный вид (вручную, например).
А не слишком сложно получится?
Тогда можно ничего нового и не делать: ведь и сейчас можно экспортировать, а потом приводить в необходимый вид вручную...
Построить в FastReport можно, управляя отступами в скрипте отчета. Но при этом необходимо получить все элементы проекта в правильной последовательности.
Пока смотрю на таблицу проекта и не вижу, как это сделать одним запросом
Может попробовать сортировать по полю Path или SortPath?
--------------------------------------------
Лабитек
Центр разработки приложений
"Тихенко Виктория" написал:А не слишком сложно получится?
Можно и без скриптов. Через пользовательские запросы. Я в приложении накидал наброски, как можно сделать.
Правда, есть одна сложность - если в пользовательских запросах много деталей, то очень сложно с ним работать :)
И вторая сложность - с обратными связями в проектах надо всё делать последовательно и аккуратно, а то можно запутаться с одинаковыми названиями элементов.
Но сделать можно.
"Валерий Андрусик" написал:Может попробовать сортировать по полю Path или SortPath?
По Path и SortPath сортировать сложно, так как это GUID.
Есть поле SortOrder, но как я понял, оно показывает сортировку элементов одного уровня. То есть, все равно надо все уровни вытаскивать последовательно.
"Владимир Соколов" написал:По Path и SortPath сортировать сложно, так как это GUID.
Посмотрел, согласен...
Если версия 3.3.2, то можно попытаться создать сервис CustomQuery, в котором :
- если СУБД MSSQL, написать код на TransactSQL, формирующий временную таблицу и возвращающий из нее данные;
- если СУБД Oracle - то воспользоваться возможностями Oracle для возвращения запросом результатов в виде иерархии
--------------------------------------------
Лабитек
Центр разработки приложений
"Валерий Андрусик" написал:Если версия 3.3.2
Пока версия 3.3.1. А отчет просят уже сейчас.
Но, наверное, формировать временную таблицу, чтобы потом из нее получить простым SelectQuery можно и в 3.3.1?
Или эта временная таблица другому сервису будет недоступна?
Проблема не в факте доступности временной таблицы, а в том, что в MSSQL ее название начинается с символа #, а сделать сервис Table с подобным названием система не дает. Соответственно и SelectQuery строить не на чем :(.
В нашей практике мы работали с временными таблицами через ADODataset, текст которого выглядел примерно так:
create table #dataset( clientIid int, code nvarchar(10) ) insert #dataset exec %1trsftClientActions :clientId select * from #dataset drop table #dataset
--------------------------------------------
Лабитек
Центр разработки приложений
Ещё вариант - использовать SelectQuery с CustomSQL-колонками. Средствами СУБД создать хранимую процедуру, которая формирует временную таблицу, а в конце выводит все её колонки. В запросе создаём столько CustomSQL-колонок, сколько возвращает процедура, в таком же порядке и с такими же названиями, а в тексте первой колонки вызываем нашу процедуру. Более подробно описано здесь, несколько последних комментариев с примером. В результате получаем запрос, для которого создаём датасет и используем его в отчёте.
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
Извиняюсь, не несколько последних, а где-то начиная с середины :).
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.