Добрый день!
Как правильно в скрипте объявить переменную?
Переменная это пользовательский атрибут.
Добрый день!
Как правильно в скрипте объявить переменную?
Переменная это пользовательский атрибут.
Полный текст скрипта
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.
Создайте вычисляемое поле, которое будет возвращать нужный коэффициент в зависимости от значения атрибута ‘Год постройки дома’.
Просто вычисляемым полем я не смогу обойтись, потому что еще нужно будет учитывать количество этажей в доме.
Думаю лучше написать скрипт, но не могу вникнуть как сделать, что бы переменная обновлялась у каждого объекта.
Создайте вычисляемое поле 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 и все…
Если необходимое значение находится ВНЕ вкладки “Архивы потреблений и интеграторов” я не могу получить его значение…
А в Ведомости параметров для объекта учета тоже самое будет?
У меня что-то не работает…
Все сделал по Вашему примеру, немного упростил скрипт.
Не работает, выдает 0.
Но отчет у меня не сводный, а ведомость параметров.
Где я ошибся?
Значения из атрибутов с типом 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 не работает…