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