Необходимо решить задачу печати отчета со структурой проекта.
Если с уровнями Проект и Стадия всё просто и понятно, то уровень Работа может иметь неограниченную вложенность (если я правильно понял).

В таких случаях для вытаскивания "дерева" обычно используют хранимую процедуру, которая рекурсивно идет по всем веткам до самого конца, возвращая данные.

Вопрос - как эти данные поместить в Dataset, чтобы его потом использовать в FastReport-отчете?
Или есть другие варианты решения задачи?

Нравится

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

Есть вариант экспорта дерева в эксель.

"Глова Сергей" написал:Есть вариант экспорта дерева в эксель.

Очень интересно. Но всё равно вопрос с 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.

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