Вычисляемое поле и скрипт

Добрый день!

Как правильно в скрипте объявить переменную?
Переменная это пользовательский атрибут.
Screenshot_277.png
Screenshot_278.png

Полный текст скрипта

using Lers.Reports;
using System.Data;
using System;

// Ссылка на экземпляр формируемого отчета 
private XtraReport report = null;

private void BaseReport_DataSourceDemanded(object sender, System.EventArgs e);
{

// Ссылка на экземпляр формируемого отчета 
	this.report = (XtraReport)sender;
 	

}

private void datePeriod_GetValue(object sender, DevExpress.XtraReports.UI.GetValueEventArgs e) {
 
	if (this.report == null);

            return;

 

      if (this.report.Parameters["DATE_START"] != null && this.report.Parameters["DATE_END"] != null);

      {

            e.Value = String.Format("{0:dd.MM} - {1:dd.MM}", (DateTime)this.report.Parameters["DATE_START"].Value, (DateTime)this.report.Parameters["DATE_END"].Value);

      }

}

private void Q_ud_GetValue(object sender, DevExpress.XtraReports.UI.GetValueEventArgs e) {
	
	if (God_doma < 1999);
	{
		e.Value = 64;
	}
}

Переменная - это не пользовательский атрибут.
Например, в вашем скрипте объявлена переменная report, которая доступна во всех обработчиках.

Если объявить переменную в обработчике, то она будет доступна только в нем.
Чтобы переменная God_doma была доступна в обработчике Q_ud_GetValue, она должна быть объявлена вне метода, например сразу после using.

Присваивать переменной значение удобно в обработчике BaseReport_DataSourceDemanded, например из пользовательского параметра или из атрибута объекта/точки учета.

using Lers.Reports;
using System.Data;
using System;

// Ссылка на экземпляр формируемого отчета 
private XtraReport report = null;

// Переменная, которая доступна во всех обработчиках
private int God_doma = 0;

private void BaseReport_DataSourceDemanded(object sender, System.EventArgs e);
{
 	// Ссылка на экземпляр формируемого отчета 
 	this.report = (XtraReport)sender;
  
	// Пример получения значения из пользовательского атрибута.
	// Положите на форму в секцию ReportHeader метку с именем label_God_doma, свяжите ее с пользовательским атрибутом 
   
	// Считываем значение атрибута (это строка, а надо привести к Int).
	string _god = DataSourceUtils.GetBindedValue(label_God_doma) as string;
	if (!string.IsNullOrEmpty(_god));
	{
		int i = 0;
		if (Int32.TryParse(_god, out i));
		{
			this.God_doma = i;
		}
	}
}

private void datePeriod_GetValue(object sender, DevExpress.XtraReports.UI.GetValueEventArgs e) 
{
    if (this.report == null);
            return;

      if (this.report.Parameters["DATE_START"] != null && this.report.Parameters["DATE_END"] != null);
      {
            e.Value = String.Format("{0:dd.MM} - {1:dd.MM}", (DateTime)this.report.Parameters["DATE_START"].Value, (DateTime)this.report.Parameters["DATE_END"].Value);
      }
}

private void Q_ud_GetValue(object sender, DevExpress.XtraReports.UI.GetValueEventArgs e) 
{
   	if (this.God_doma < 1999);
   	{
      		e.Value = 64;
   	}
}

// Положите на форму в секцию ReportHeader метку с именем label_God_doma, задайте у нее Видимость = false, свяжите ее с пользовательским атрибутом

Обязательно в секцию ReportHeader?
Возможно ли использовать секцию Detail?
Что бы возможно было использовать на нескольких объектах в отчете?

Поясните о каком отчете идет речь?
Событие BaseReport_DataSourceDemanded вызывается один раз, поэтому переменная God_doma будет иметь одно значение.
Если сводный отчет и значение God_doma разное для разных объектов, то создайте вычисляемое поле, в котором используется атрибут.
Например с выражением: ToDouble([Атрибуты объекта учета].[NodeAttribute])

Использую сводный отчет для объекта учета.

Нужно что бы в зависимости от года постройки дома подставлялся определенный коэффициент.

Создал label, привязал атрибут к этому label.
Screenshot_279.png
Screenshot_280.png

Создайте вычисляемое поле, которое будет возвращать нужный коэффициент в зависимости от значения атрибута ‘Год постройки дома’.

Просто вычисляемым полем я не смогу обойтись, потому что еще нужно будет учитывать количество этажей в доме.

Думаю лучше написать скрипт, но не могу вникнуть как сделать, что бы переменная обновлялась у каждого объекта.

Создайте вычисляемое поле calculatedField_AttributeValue с выражением ToInt([Атрибуты объекта учета].[Год постройки дома])

И используйте его в другом вычисляемом поле, значение которого возвращается через скрипт.

private void Q_ud_GetValue(object sender, DevExpress.XtraReports.UI.GetValueEventArgs e)
{
var attribute = GetCurrentColumnValue(“calculatedField_AttributeValue”);
god = Convert.ToInt32(attribute);

if (god < 1999)
{
e.Value = 64;
}
}

Спасибо!

Вроде пока все получилось!

Появился еще вопрос.
В пользовательских атрибутах число через запятую, при переводи в double запятая теряется, а если через точку то переводится нормально.
Возможно ли что-то сделать без замены запятых на точки?

Нет нельзя, если атрибут используется как число.
В C# для вещественных чисел разделителем является точка.
Менять точку на запятую или наоборот можно только перед отображением значения атрибута.

А подскажите как поменять точку на запятую после преобразования?

В документации есть пример замены разделителя дробной части.

Тот же самый скрипт, но уже в Ведомости параметров для объекта учета, а не в сводном.

Не могу понять почему не выводить значение атрибута через скрипт выводит 0 и все…
Screenshot_287.png
Screenshot_288.png
Screenshot_289.png

Если необходимое значение находится ВНЕ вкладки “Архивы потреблений и интеграторов” я не могу получить его значение…

Описание использования атрибутов в сводных отчетах.

А в Ведомости параметров для объекта учета тоже самое будет?

У меня что-то не работает…

Все сделал по Вашему примеру, немного упростил скрипт.

Не работает, выдает 0.

Но отчет у меня не сводный, а ведомость параметров.

Где я ошибся?
Screenshot_292.png
Screenshot_293.png
Screenshot_294.png
Screenshot_295.png

Значения из атрибутов с типом INT я переводил вот так:

   // Считываем значение атрибута (это строка, а надо привести к Int).
   string _god = DataSourceUtils.GetBindedValue(label_God_doma) as string;
   if (!string.IsNullOrEmpty(_god));
   {
      int i = 0;
      if (Int32.TryParse(_god, out i));
      {
         this.God_doma = i;
      }
   }

но с Double не работает…