Table of Contents

Использование вычисляемого поля с данными из разных узлов

В выражениях вычисляемых полей можно использовать данные из родительского узла и всех его дочерних узлов. Данные из других узлов не доступны. Например, если создается вычисляемое поле в узле 'Архивы потреблений и интеграторов', то в вычисляемом поле можно использовать только данные из следующих узлов:

  • Архивы потреблений и интеграторов,
  • Архив интеграторов,
  • Рассчитанные значения,
  • Потребления за время действия НС,
  • Потребления за время отсутствия данных в конце отчетного периода,
  • Среднесуточные значения,
  • Суммарные потребления за отчетный период.

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

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