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

Top  Previous  Next

В выражениях вычисляемых полей можно использовать данные из родительского узла и всех его дочерних узлов. Данные из других узлов не доступны.

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

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

ExampleCalculatedFieldInDefferentNodes_1

Часто возникает необходимость использования в вычисляемых полях значений из разных узлов не связанных 'родитель-потомок'.

Рассмотрим использование в вычисляемых полях данных из произвольных узлов на примере отчетной формы 'Ведомость учета параметров потребления тепла' для точки учета с открытой системой теплоснабжения.        

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

ШАГ 1. Откройте в редакторе отчетов требуемую отчетную форму (главном меню пункт Справочники -> Отчетные формы).

ШАГ 2. В узле 'Архивы потреблений и интеграторов' создайте два вычисляемых поля calculatedField_M и calculatedField_Q, которые будут возвращать отклонение фактических значений потребления воды и тепловой энергии от соответствующих договорных.

ШАГ 3. В секцию ReportHeader добавьте ячейку с именем label_СontractFlow для отображения договорной нагрузки по потреблению воды и ячейку с именем label_СontractHeat для отображения договорной нагрузки по тепловой энергии. Свяжите эти ячейки с соответствующими полями из узла 'Параметры точки учета'.

ExampleCalculatedFieldInDefferentNodes_2

В секциях PageHeader, Detail и ReportFooter удалите лишние колонки и добавьте колонки для отображения значений вычисляемых полей calculatedField_M и calculatedField_Q.

ШАГ 4. Свяжите добавленные ячейки в секциях Detail и ReportFooter c соответствующими вычисляемыми полями.

ExampleCalculatedFieldInDefferentNodes_3

 

На закладке 'Обозреватель отчета' в свойствах отчетной формы задайте обработчик события 'Запрос источника данных'.

ExampleCalculatedFieldInDefferentNodes_1_DataSourceDemanded

Код скрипта задайте следующий:

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

Пример сформированного отчета:

ExampleCalculatedFieldInDefferentNodes_5

chapterup Наверх