Доброго времени суток!
Возникла необходимость использовать вычисляемое поле с данными из двух таблиц для отчетной формы точки учета.
Поискал на форуме, нашел следующий раздел в руководстве http://soft.lers.ru/manual/index.html?calculatedfieldwithmultipletables.html, сделал все как по инструкции, но с скриптом возникли проблемы.
Шаг 4. При проверке скрипта:
double? heat1 = Lers.Reports.ScriptUtils.GetCurrentRowCellValue(dataDate, tcHeat1);
выдает ошибку:
The type or namespace name ‘ScriptUtils’ does not exist in the namespace ‘Lers.Reports’ (are you missing an assembly reference?)
Метод Lers.Reports.ScriptUtils.GetCurrentRowCellValue() описанный в документации больше не используется. Документацию мы обновили.
Создайте вычисляемое поле в узле Архивы потреблений и интеграторов и вместо скрипта для получения значения вычисляемого поля используйте выражение, которое включает данные из разных таблиц этого узла.
Например, для объекта с 2 точками учета по теплоснабжению и 1 точкой учета по ГВС, суммирование теплопотреблений задается следующим выражением для вычисляемого поля:
Как реализовать выражение для такого расчета?(теплоснабжение)
(([M1 - массовый расход в подающей магистрали]
-([ContractFlow - часовая договорная нагрузка по расходу воды тонн/час, для ХВС м3/час]*24))/[M1 - массовый расход в подающей магистрали])*100
Поясню. Наша РСО сравнивает расчетный расход и реальный.Хотелось бы видеть это сразу же в отчете.
В этом случае нужен скрипт, в котором реализованы обработчики событий: Запрос источника данных (DataSourceDemanded) и Получение значения (GetValue).
В узле Архив потреблений и интеграторов создайте вычисляемое поле (в данном примере - это calculatedField1).
В свойстве Скрипты этого поля, выберите Получить значение.
В автоматически созданную заготовку обработчика скопируйте текст из calculatedField1_GetValue()
В свойстве Скрипты для BaseReport выберите Запрос источника данных.
В автоматически созданную заготовку обработчика скопируйте текст из BaseReport_DataSourceDemanded().
При наличии обработчика события GetValue() вычисляемое поле calculatedField1 будет возвращать значение заданное в этом обработчике.
using System.Text;
using System.Data;
// Часовая договорная нагрузка по расходу воды (м3/час);
double contractFlow = 0;
// Обработчик события Запрос источника данных
private void BaseReport_DataSourceDemanded(object sender, System.EventArgs e)
{
// Ссылка на экземпляр формируемого отчета
XtraReport report = (XtraReport)sender;
// Источник данных отчета
DataSet dataSet = (DataSet)report.DataSource;
// Таблица с параметрами точки учета
DataTable table = dataSet.Tables["Параметры точки учета"];
// Часовая договорная нагрузка (м3/час);
if(table.Columns.Contains("ContractFlow") && table.Rows.Count > 0);
double.TryParse(Convert.ToString(table.Rows[0]["ContractFlow"]), out this.contractFlow );
}
// Обработчик события возвращающего значение, которое является результатом вычисляемого поля calculatedField1
private void calculatedField1_GetValue(object sender, DevExpress.XtraReports.UI.GetValueEventArgs e)
{
// Получаем массовый расход для текущей метки времени
double m1 = 0;
double.TryParse(Convert.ToString(((DataRowView)e.Row).Row["M1"]), out m1);
e.Value = (m1 - contractFlow * 24) * 100 / m1;
}