[ELMA3] Пример написания сложного отчета
Пример написания сложного отчета с "нуля"
В данной статье рассмотрен процесс создания сложного отчета "от и до": формирование запроса в базу данных (далее по тексту - БД), настройку параметров отчета, моделирование макета отчета. В качестве примера выбран отчет по контрагентам, который был создан в статье «Пример написания простого отчета "с нуля"», в новом отчете выведем подотчет – "Запланированные взаимоотношения с контрагентом" – условно назовем новый отчет "Отчет по контрагентам".
Дизайнер
В дизайнере в разделе Отчеты создаем Отчет по контрагентам, который будет выводить информацию о контрагентах, отрасль и ответственных за контрагентов. Дополнительно выведем поле для ссылки подотчета – назовем его "Запланированные действия" - выведем по данной ссылке запланированные взаимоотношения контрагента. Используем справочники Контрагенты, Пользователи, Отрасль. Данные объекты можно найти на вкладке Источники данных отчета, в правой части окна – Объекты БД. В Объектах БД можно найти нужный справочник по полю Отображаемое имя, затем посмотреть имя таблицы в БД по полю Имя.
Редактирование источника данных
- На верхней панели выбираем пункт Редактировать и указываем язык запроса SQL.
- На вкладке Параметры вводим параметр для отчета «Ответственный менеджер» (Тип: Пользователь, связь: Одиночная).

3. Используем составленный в статье «Пример написания простого отчета "с нуля"». Внесем некоторые изменения в данный запрос.
Пишем запрос, который будет выводить Наименование контрагента, его Отрасль и Ответственного за данного контрагента. Все указанные поля по сути хранятся в одной таблице Contractor – Контрагенты, но некоторые поля хранят в них только идентификаторы других таблиц, например: Industry – Отрасль, поэтому в запросе соединим нужные таблицы.
Текст запроса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | select distinct Contractor. Name as Kontragent , Contractor.Id , ContractorIndustry.Industry as Otrasli , [ User ].FullName as Otvetstv , Contractor.CreationDate , ’Подробнее’ as LINK from Contractor left join [ User ] on Contractor.Responsible=[ User ].Id left join ContractorIndustry on Contractor.Industry=ContractorIndustry.Id {if {$OtvetstvennyyMenedzher} <> Null } where [ User ].Id = {$OtvetstvennyyMenedzher.Id} { end if} |
Описание запроса:
select distinct // исключение дублирующихся строк
Contractor.Name as Kontragent // новое название (псевдоним) Kontragent поля Name
, Contractor.Id// Идентификатор контрагента, далее используется для связи с подотчетом
, ContractorIndustry.Industry as Otrasli // псевдоним Otrasli поля Industry
, [User].FullNameasOtvetstv// псевдоним Otvetstv ответственного за контрагента пользователя
, Contractor.CreationDate
, ’Подробнее’ asLINK// выведем колонку LINK для размещения ссылки на подотчет.
fromContractor // указываем из какой таблицы брать данные.
leftjoin [User] onContractor.Responsible=[User].Id // соединяем таблицу Userс таблицей Contractorчерез поле Responsible (Ответственный) из таблицы Contractor с полем Idиз таблицы User. Это необходимо, чтобы в результате отчета в выводимом поле Ответственный было полное имя сотрудника, не его ID.
left join ContractorIndustry on Contractor.Industry=ContractorIndustry.Id // соединяем таблицу ContractorIndustry с таблицей Contractor через поле Industry (Отрасль) из таблицы Contractor с полем Id из таблицы ContractorIndustry. Это необходимо, чтобы в результате отчета в выводимом поле Отрасль было название отрасли, не его ID.
{if {$OtvetstvennyyMenedzher} <> Null }
where
[User].Id = {$OtvetstvennyyMenedzher.Id}
{endif}// указываем условие, при котором при пустом значении параметра Ответственный менеджер, будут показываться все записи, а при указанном параметре – будет отображаться только отфильтрованная запись.
Макет отчета
Переходим на вкладку Настройки отображения, отмечаем Макет отчета - .NETRazor

Переходим на вкладку Макет, где рисуем отображение отчета на .NETRazor в веб-части. Здесь можно написать код для отображения результирующих данных на языке HTML, либо использовать Мастер шаблона.

Выводим Доступные поля в колонку Выбранные поля, нажимаем кнопку Ок. Выбранные поля будут отображаться в отчете.

В результате получим сформированный код в Дизайнере.
Для проверки полученного отчета можно запустить режим отладки с помощью кнопки Отладка.

Если не указывать Ответственного менеджера, получим следующий результат:
Названия колонок отображаются так, как были указаны в запросе. Переименуем колонки: находим в коде, где отрисовываются заголовки - наименования колонок:

Далее переименовываем колонки следующим образом:
исходное значение:
1 | <th scope= "col" >@items.Columns[ "Kontragent" ]</th> |
Переименованное поле:
1 | <th scope= "col" >Контрагент</th> |
Таким же образом переименовываем другие колонки

В результате получим:

Выведем вместо слов Подробнее ссылку на подотчет "Запланированные действия".
Работа с подотчетом на .Net Razor
На вкладке Список отчетов находим Отчет по контрагентам (КБ), правой кнопкой мыши создаем подотчет:
Окно создания подотчета выглядит таким же образом, что и при создании обычного отчета, но с уже выбранной Группой. Назовем подотчет "Запланированные действия". Далее пишем запрос для подотчета вышеуказанным способом.
Текст запроса:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | select tbl.* from ( select c1. Name as Name , rs1.Theme as Theme, rs1.Description as Description, ’Звонок’ as DescriptionF, rs1.StartDate as StartDate from RelationshipCall rsc1 left join Relationship rs1 on rsc1.id = rs1.id left join Contractor c1 on rs1.Contractor = c1.Id where c1.id=@CID and rs1.DoneDate is null union select c2. Name as Name , rs2.Theme as Theme, rs2.Description as Description, ’Письмо’ as DescriptionF, rs2.StartDate as StartDate from RelationshipMail rsc2 left join Relationship rs2 on rsc2.id = rs2.id left join Contractor c2 on rs2.Contractor = c2.Id where c2.id=@CID and rs2.DoneDate is null union select c3. Name as Name , rs3.Theme as Theme, rs3.Description as Description, ’Встреча’ as DescriptionF, rs3.StartDate as StartDate from RelationshipMeeting rsc3 left join Relationship rs3 on rsc3.id = rs3.id left join Contractor c3 on rs3.Contractor = c3.Id where c3.id=@CID and rs3.DoneDate is null ) tbl |
Данная конструкция используется, чтобы сформировать одну таблицу у выбранных взаимоотношений. Как видно из запроса, для формирования такой таблицы используются одинаковые запросы объединенные cпомощью вертикального объединения UNION, которые в результирующих данных выведут одинаковые поля у разных взаимоотношений, в данном случае: Звонок, Письмо, Встреча.
Для связи родительского отчета и подотчета добавим параметр в "Запланированные действия" (КБ) с типом Целое число, чтобы передать туда ID Контрагента. В данном примере имя параметра CID.
Настраиваем отображение отчета на .NETRazor, как описано выше.
Создаем макет отчета с помощью Мастера Шаблонов вышеуказанным способом.
В коде задаем значение
1 | @{String temp = "other" ;} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <text>@if (row[ "DESCRIPTIONF" ]. ToString () != temp) { <tr style=’background: lightgreen’> <td>@row[ "DESCRIPTIONF" ]</td> <td></td> <td></td> <td></td> <td></td> </tr> }</text> |
1 | //будет отрисовываться заголовок, если <span lang= "EN-US" >String </span>не равен ‘Звонок’, ‘Письмо’, ‘Встреча’. |

Далее идет отрисовка остальных строк и столбцов. В конце задаем текущее значение столбцам
1 | <text>@{temp = row[ "DESCRIPTIONF" ]. ToString ();}</text> |

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

В поле Тип ссылки выбираем Отчет, после чего появятся другие поля для заполнения, в поле Название отчета указываем подотчет "Запланированные действия".
Далее указываем значение для параметра подотчета CID – ID, т.е. в параметр подотчета CID передается контрагент (ID контрагента), для вывода запланированных действий по конкретному контрагенту:
В поле Поле названия ссылки указываем то поле, к которому будет привязана ссылка на родительском отчете – LINK. Для удобства отображения подотчета поставим флажок в поле Открывать в новом окне:

В результате получим следующую ссылку:
1 | @Url.ReportLink(row,Model.Debug, "Запланированные действия (КБ)" ,new {CID= "Id" }, "LINK" ,true) |

Для проверки запускаем отладку отчета, в результате получим:
При нажатии на ссылку Подробнее откроется подотчет "Запланированные действия" в новой вкладке (на примере выведены "Запланированные действия" для контрагента с именем ООО "Газпром"):

Чтобы пользователи не смогли видеть параметр CID в подотчете, настроим отображение параметров: на вкладке Настройка отображения в части Форма ввода параметров, укажем значение Форма задается пользователем (.NETRazor):

Перейдя на вкладку Макет формы параметров, нажимаем на кнопку Мастер шаблона, мастер автоматически сформирует код для отображения параметров. Сделаем параметр не видимым, для этого обернем его в div, в результате получим код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @using EleWise.ELMA.BPM.Web.Reports.Extensions @using System.Data @model EleWise.ELMA.BPM.Web.Reports.Models.ReportParametersInfo <style> .list th { background: none repeat scroll 0 0 #666666; color: #FFFFFF; padding: 5px; text-align: left ; } .list td { border-bottom: 1px solid #CCCCCC; padding: 3px 5px; vertical-align: middle; } </style> <div style= "display:none" > <table style= "width:100%" class= "listTaskExec" > @Html.EditorFor(m => m.Parameters) </table> </div> |

Таким образом, можно написать более сложный отчет с использованием одно параметра, с макетом на .NETRazor.