[ELMA3] Сложный отчет с ссылками на разные типы объектов с использованием стандартной формы 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]
В итоге получаем отчет по просроченным проектным и процессным задачам с ссылкам: