Table of Contents

Использование пользовательских атрибутов в сводных отчетах

Рассмотрим использование пользовательских атрибутов в сводных отчетах на примере отчетной формы 'Сводное потребление в системах объектов учета'. Задача: создать вычисляемое поле для вывода процента отклонения фактической тепловой энергии от договорного значения. Фактические значения потребления берутся из узла 'Параметры сводного отчета по объектам учета' (поле Q_Heat), а договорное значение хранится в атрибуте объекта учета (атрибут ContractHeat, содержащий значение суточного договорного теплопотребления на объекте, ГКал/сутки).

ШАГ 1. Откройте в редакторе отчетов требуемую отчетную форму (главном меню пункт Справочники -> Отчетные формы).

ШАГ 2. В узле 'Параметры сводного отчета по объектам учета' создайте вычисляемое поле с именем calculatedField_Attribute с выражением:

ToDouble([Атрибуты объекта учета].[ContractHeat])

ШАГ 3. На закладке 'Обозреватель отчета' в свойствах отчетной формы задайте обработчик события 'Запрос источника данных'.

В открывшейся форме редактора скриптов введите текст для обработчика запроса, в котором рассчитывается и сохраняется в переменной daysCount длительность отчетного периода в сутках:

` using System.Data; using System;

// Количество суток в отчетном периоде private double daysCount = 0;

private void BaseReport_DataSourceDemanded(object sender, System.EventArgs e) { // Определяем количество суток в отчетном периоде

var report = (XtraReport)sender;

DateTime startDate = (DateTime)report.Parameters["DATE_START"].Value,
	     endDate = (DateTime)report.Parameters["DATE_END"].Value;

TimeSpan ts = endDate - startDate;

this.daysCount = ts.TotalDays;

} `

ШАГ 4. В узле 'Параметры сводного отчета по объектам учета' создайте вычисляемое поле с именем calculatedField_PercentValue. В свойстве 'Скрипты' для вычисляемого поля calculatedField_PercentValue выберите пункт 'Получить значение -> (Новый)', чтобы создать заготовку скрипта, которая будет возвращать значение вычисляемого поля. Заполните заготовку кодом для расчета процента отклонения фактического теплопотребления от договорного:

private void calculatedField_PercentValue_GetValue(object sender, DevExpress.XtraReports.UI.GetValueEventArgs e) 
{
	// Получаем значение атрибута для текущего объекта учета (суточное договорное значение)
	double? dayContractValue = this.GetCurrentColumnValue(this.calculatedField_Attribute.Name) as double?;

	if (!dayContractValue.HasValue || dayContractValue.Value == 0)
	{
		return;
	}

	// Пересчитываем договорную нагрузку на отчетный период 
	var contractHeat = this.daysCount * Convert.ToDouble(dayContractValue);

	// Получаем фактическое потребление тепловой энергии для текущего объекта учета
	DataRowView row = (DataRowView)e.Row;
	double? q = null;
	if ( row["Q_Heat"] != DBNull.Value)
	{
		q = Convert.ToDouble(row["Q_Heat"]);
	}

	// Получаем значение возвращаемое вычисляемым полем
	e.Value = 100 * (contractHeat - q) / contractHeat;
}

ШАГ 5. Свяжите вычисляемое поле calculatedField_PercentValue с требуемой ячейкой секции Detail.

ШАГ 6. С помощью кнопки на панели инструментов редактора отчетов сохраните сделанные изменения.