Table of Contents

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

Рассмотрим использование пользовательского атрибута на примере отчетной формы 'Ведомость учета параметров потребления тепла' для точки учета. Задача: создать вычисляемое поле для вывода процента отклонения фактической тепловой энергии от договорного значения. Фактические значения потребления берутся из узла 'Архивы потреблений и интеграторов', а договорное значение хранится в атрибуте точки учета.

ШАГ 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. С помощью кнопки на панели инструментов редактора отчетов сохраните сделанные изменения.