Сложный отчет с ссылками на разные типы объектов с использованием стандартной формы FastReport

 
Полезная информация

Данная статья является продолжением статьи о создании ссылок в отчетах.

Вы можете ознакомится с предыдущей статьей перейдя по этой ссылке.

Рассмотрим пример отчета по просроченным проектным и процессным задачам.

Существует два варианта реализации ссылок: задать адрес ссылки в SQL и разделить задачи по типам уже после выборки данных.

Задание ссылки в SQL-запросе

Этот метод подходит в большинстве случаев. Постоянная часть адреса ссылки задается прямо в SQL-запросе следующим образом:

select p.Id, ’/Projects/ProjectTask/Execute/’ as link,  t.Subject as Name, t.CreationAuthor as AuthorID, t.EndWorkDate as Закрыто, t.EndDate as Срок
from ProjectTask as p
Left join TaskBase as t on t.Id=p.Id
Where (t.EndWorkDate > t.EndDate OR t.EndDate<GetDate())

’/Projects/ProjectTask/Execute/’ as link – записывает всегда одинаковую постоянную часть в поле link.

Далее создаем гипрессылку на отчете, как это было описано выше, и вставляем простую формулу 

[Данные.link]+[Данные.Id]

В результате получим отчет, выводящий все просроченные проектные задачи со ссылками.

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

select p.Id, ’/Projects/ProjectTask/Execute/’ as link,  t.Subject as Name, t.CreationAuthor as AuthorID, t.EndWorkDate as Закрыто, t.EndDate as Срок
from ProjectTask as p
Left join TaskBase as t on t.Id=p.Id
Where (t.EndWorkDate > t.EndDate OR t.EndDate<GetDate())

Union all

select w.Id, ’/Workflow/WorkflowTask/Execute/ ’ as link,  t.Subject as Name, t.CreationAuthor as AuthorID, t.EndWorkDate as Закрыто, t.EndDate as Срок
from WorkflowTask as w
Left join TaskBase as t on t.Id=w.Id
Where (t.EndWorkDate > t.EndDate OR t.EndDate<GetDate())

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

Задание ссылки после выборки данных

Этот метод подходит для отчетов, в которых происходит выборка разнородной информации в единый список.

Для поиска и идентификации типа задачи будем использовать Uid типа задачи. Его можно посмотреть в базе данных, небольшим сценарием или, в случае с задачами, в окне задания фильтра.

Для этого перейдите во вкладку Задачи, выберите фильтр Все, разверните Расширенный поиск  и нажмите кнопку EQL-Поиск.

 

 Напишите в поле для ввода EQL-запроса TypeUid =  и система предоставит вам выпадающий список с типами задач c указанием Uid.

 

Подробнее о EQL-поиске см. соответствующий раздел справки.

Текст SQL запроса будет выглядеть следующим образом:

Select t.CreationAuthor as AuthorID, t.EndWorkDate as Закрыто, t.EndDate as Срок, t.TypeUid as Uid,  t.Id  as Ссылка
from TaskBase as t
Where (t.EndWorkDate > t.EndDate OR t.EndDate<GetDate()) AND (t.TypeUid =  (’20404079-49d9-4068-9de5-4ecd2c750868’) OR t.TypeUid = (’555a587d-25c1-4f99-ade6-3176b4fc9a6c’))

Данный SQL-запрос выбирает все просроченные задачи по проектам (t.TypeUid =  (’20404079-49d9-4068-9de5-4ecd2c750868’)) и процессам (t.TypeUid = (’555a587d-25c1-4f99-ade6-3176b4fc9a6c’)).

 

Переходим к макету отчета в FastReport и повторяем шаги, описанные для создания ссылки в простом отчете: выносим все необходимые поля на форму, выбираем то поле, которое хотим сделать ссылкой, нажимаем правой кнопкой мыши – hyperlink.

В появившемся окне в правой части второго поля для ввода адреса ссылки нажимаем на иконку формулы.

Главное отличие от простого случая в том, что у нас есть поле Id с идентификатором задачи, но постоянные части ссылки для проектной и процессной задачи отличаются. Для того, чтобы правильно формировать адрес ссылки, потребуется в формулу написать условие следующего вида:

 (Условие)  ? (действие если true) : (действие если false)

Подробнее о условных операторах см. на официальном сайте Microsoft

([Данные.Uid] = = new Guid("20404079-49d9-4068-9de5-4ecd2c750868")) ? "/Projects/ProjectTask/Execute/"+[Данные.Id] : "/Workflow/WorkflowTask/Execute/"+[Данные.Id]

Таким образом при формировании гиперссылки будет выполнена проверка: если Uid типа объекта совпадает с Uid проектной задачи, ссылка будет сформирована как "/Projects/ProjectTask/Execute/"+[Данные.Id], иначе "/Workflow/WorkflowTask/Execute/"+[Данные.Id]

В итоге получаем отчет по просроченным проектным и процессным задачам с ссылкам:

 
Полезная информация
Продолжение темы создания ссылок в отчетах можно прочитать в следующей статье Сложный отчет с ссылками с использованием разметки на языке Razor