[ELMA3] Сложный отчет с ссылками на разные типы объектов с использованием стандартной формы FastReport
Данная статья является продолжением статьи о создании ссылок в отчетах.
Вы можете ознакомится с предыдущей статьей перейдя по этой ссылке.
Рассмотрим пример отчета по просроченным проектным и процессным задачам.
Существует два варианта реализации ссылок: задать адрес ссылки в SQL и разделить задачи по типам уже после выборки данных.
Задание ссылки в SQL-запросе
Этот метод подходит в большинстве случаев. Постоянная часть адреса ссылки задается прямо в SQL-запросе следующим образом:
1 2 3 4 | 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.
Далее создаем гипрессылку на отчете, как это было описано выше, и вставляем простую формулу
1 | [Данные.link]+[Данные.Id] |
В результате получим отчет, выводящий все просроченные проектные задачи со ссылками.
Теперь добавим в SQL-запрос выборку аналогичных данных, но по процессным задачам. Код SQL-запроса будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 | 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 запроса будет выглядеть следующим образом:
1 2 3 | 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 с идентификатором задачи, но постоянные части ссылки для проектной и процессной задачи отличаются. Для того, чтобы правильно формировать адрес ссылки, потребуется в формулу написать условие следующего вида:
1 | (Условие) ? (действие если true ) : (действие если false ) |
Подробнее о условных операторах см. на официальном сайте Microsoft.
1 | ([Данные.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]
В итоге получаем отчет по просроченным проектным и процессным задачам с ссылкам: