logo

[ELMA3] Пример написания сложного отчета

Пример написания сложного отчета с "нуля"

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

Дизайнер

В дизайнере в разделе Отчеты создаем Отчет по контрагентам, который будет выводить информацию о контрагентах, отрасль и ответственных за контрагентов. Дополнительно выведем поле для ссылки подотчета – назовем его "Запланированные действия" - выведем по данной ссылке запланированные взаимоотношения контрагента. Используем справочники Контрагенты, Пользователи, Отрасль. Данные объекты можно найти на вкладке Источники данных отчета, в правой части окна – Объекты БД. В Объектах БД можно найти нужный справочник по полю Отображаемое имя, затем посмотреть имя таблицы в БД по полю Имя.

Редактирование источника данных

  1. На верхней панели выбираем пункт Редактировать и указываем язык запроса SQL.
  2. На вкладке Параметры вводим параметр для отчета «Ответственный менеджер» (Тип: Пользователь, связь: Одиночная).

3. Используем составленный в статье «Пример написания простого отчета "с нуля"». Внесем некоторые изменения в данный запрос.

Пишем запрос, который будет выводить Наименование контрагента, его Отрасль и Ответственного за данного контрагента. Все указанные поля по сути хранятся в одной таблице Contractor – Контрагенты, но некоторые поля хранят в них только идентификаторы других таблиц, например: Industry Отрасль, поэтому в запросе соединим нужные таблицы.

Текст запроса:

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, либо использовать Мастер шаблона.

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

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

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


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


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


Далее переименовываем колонки следующим образом:

исходное значение:

<th scope="col">@items.Columns["Kontragent"]</th>

Переименованное поле:

<th scope="col">Контрагент</th>

Таким же образом переименовываем другие колонки

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

Выведем вместо слов Подробнее ссылку на подотчет "Запланированные действия".

Работа с подотчетом на .Net Razor

На вкладке Список отчетов находим Отчет по контрагентам (КБ), правой кнопкой мыши создаем подотчет:

Окно создания подотчета выглядит таким же образом, что и при создании обычного отчета, но с уже выбранной Группой. Назовем подотчет "Запланированные действия". Далее пишем запрос для подотчета вышеуказанным способом.

Текст запроса:
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, как описано выше.

Создаем макет отчета с помощью Мастера Шаблонов вышеуказанным способом.

В коде задаем значение

@{String temp = "other";}
для проверки типа взаимоотношения ‘Звонок’, ‘Письмо’, ‘Встреча’. Проверяем условие в цикле следующим образом:

<text>@if (row["DESCRIPTIONF"].ToString() != temp)

{

<tr style=’background: lightgreen’>

<td>@row["DESCRIPTIONF"]</td>

<td></td>

<td></td>

<td></td>

<td></td>

</tr>

}</text> 
//будет отрисовываться заголовок, если String не равен ‘Звонок’, ‘Письмо’, ‘Встреча’.

Далее идет отрисовка остальных строк и столбцов. В конце задаем текущее значение столбцам

<text>@{temp = row["DESCRIPTIONF"].ToString();}</text>

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

В поле Тип ссылки выбираем Отчет, после чего появятся другие поля для заполнения, в поле Название отчета указываем подотчет "Запланированные действия".

Далее указываем значение для параметра подотчета CID ID, т.е. в параметр подотчета CID передается контрагент (ID контрагента), для вывода запланированных действий по конкретному контрагенту:

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


В результате получим следующую ссылку:

@Url.ReportLink(row,Model.Debug,"Запланированные действия (КБ)",new {CID="Id"},"LINK",true)

Для проверки запускаем отладку отчета, в результате получим:

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


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


Перейдя на вкладку Макет формы параметров, нажимаем на кнопку Мастер шаблона, мастер автоматически сформирует код для отображения параметров. Сделаем параметр не видимым, для этого обернем его в div, в результате получим код:

@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.