Использование пользовательских атрибутов в сводных отчетах
Рассмотрим использование пользовательских атрибутов в сводных отчетах на примере отчетной формы 'Сводное потребление в системах объектов учета'. Задача: создать вычисляемое поле для вывода процента отклонения фактической тепловой энергии от договорного значения. Фактические значения потребления берутся из узла 'Параметры сводного отчета по объектам учета' (поле 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. С помощью кнопки на панели инструментов редактора отчетов сохраните сделанные изменения.