Использование пользовательских атрибутов
Рассмотрим использование пользовательского атрибута на примере отчетной формы 'Ведомость учета параметров потребления тепла' для точки учета. Задача: создать вычисляемое поле для вывода процента отклонения фактической тепловой энергии от договорного значения. Фактические значения потребления берутся из узла 'Архивы потреблений и интеграторов', а договорное значение хранится в атрибуте точки учета.
ШАГ 1. Откройте в редакторе отчетов требуемую отчетную форму (главном меню пункт Справочники -> Отчетные формы).
ШАГ 2. В секцию ReportHeader добавьте ячейку с именем label_СontractHeat для отображения договорной нагрузки по тепловой энергии. Свяжите эту ячейку с соответствующим полем из узла 'Атрибуты точки учета'.
На закладке 'Обозреватель отчета' в свойствах отчетной формы задайте обработчик события 'Запрос источника данных'.
ШАГ 3. В свойстве 'Скрипты' для вычисляемого поля calculatedField_Q выберите пункт 'Получить значение -> (Новый)', чтобы создать заготовку скрипта, которая будет возвращать значение вычисляемого поля.
ШАГ 4. Код скриптов обработчиков:
using System;
using System.Data;
using Lers.Reports;
// Часовая договорная нагрузка.
private double? contractHeat = null;
// Обработчик запроса источника данных
private void BaseReport_DataSourceDemanded(object sender, System.EventArgs e)
{
double contractValue = 0;
object binded_value = null;
// Получаем значение пользовательского атрибута связанного с ячейкой label_СontractHeat
// Значение атрибута хранится как строка.
binded_value = DataSourceUtils.GetBindedValue(label_ContractHeat);
// Получаем догворное значение часовой нагрузки (ГКал/час)
if (double.TryParse(Convert.ToString(binded_value), out contractValue))
{
this.contractHeat = contractValue;
}
}
// Обработчик возвращающий значение, которое является результатом вычисляемого поля calculatedField_Q.
private void calculatedField_Q_GetValue(object sender, DevExpress.XtraReports.UI.GetValueEventArgs e)
{
DataRowView row = (DataRowView)e.Row;
// Получаем фактическое потребление тепловой энергии (для каждой метки времени свое, ГКал/сутки)
double? q = null;
if ( row["Q"] != DBNull.Value)
{
q = Convert.ToDouble(row["Q"]);
}
// Получаем значение, которое является результатом вычисляемого поля.
// Процент отклонения фактического расхода тепла от договорного значения.
// this.contractHeat - значение часовой договорной нагрузки (ГКал/час) считанное из пользовательского атрибута.
if (q.HasValue && this.contractHeat.HasValue)
{
e.Value = 100 * (q - 24 * this.contractHeat.Value) / (24 * this.contractHeat.Value);
}
}
ШАГ 5. Свяжите вычисляемое поле calculatedField_Q с требуемой ячейкой секции Detail.
ШАГ 6. С помощью кнопки на панели инструментов редактора отчетов сохраните сделанные изменения.