Страница 1 из 2
Фильтрация данных в BusinessObject
Добавлено: 25 апр 2014, 15:56
kavit
Добрый день
Дано:
Генерируется отчет. В качестве источника данных используется BusinessObject класса
Код: Выделить всё
public classA
{
public bool IsNew {get;set;}
public string Value {get;set;}
}
Данные добавляются:
Код: Выделить всё
var items = new List<ClassA>();
items.AddRange(new[]
{
new ClassA { IsNew = true, Text = "Text 1" },
new ClassA { IsNew = false, Text = "Text 2" },
new ClassA { IsNew = false, Text = "Text 3" },
new ClassA { IsNew = true, Text = "Text 4" },
new ClassA { IsNew = true, Text = "Text 5" }
});
var report = new StiReport();
report.RegBusinessObject("Items", items);
report.Design();
Вопрос: Как можно осуществить фильтрацию выводимых данных. Например, для конкретного случая, по полю:
IsNew. Т.е. ожидается, что в таблице будет отображены только те данные, у которых поле IsNew установлено в определенное значение.
Встроенные фильтры не видят полей BusinessObject
Re: Фильтрация данных в BusinessObject
Добавлено: 25 апр 2014, 16:28
Леонид
Добрый день!
Вопрос не имеет отношения к отчётной системе. Это вопрос знания самого языка C#.
Ответ:
Код: Выделить всё
public class ClassA
{
public bool IsNew {get; set;}
public string Text {get; set;}
}
Далее в коде:
Код: Выделить всё
// создаём список классов
List<ClassA> items = new List<ClassA>();
// заполняем их
items.AddRange(new[]
{
new ClassA { IsNew = true, Text = "Text 1" },
new ClassA { IsNew = false, Text = "Text 2" },
new ClassA { IsNew = false, Text = "Text 3" },
new ClassA { IsNew = true, Text = "Text 4" },
new ClassA { IsNew = true, Text = "Text 5" }
});
// делаем выборку по необходимому критерию
List<ClassA> results = items.FindAll(x => x.IsNew == true);
// Далее, всё, как вы описали
StiReport report = new StiReport();
report.RegBusinessObject("Items", results);
report.Design();
P.S. И ещё, не могу не заметить, что использование конструкций вида var report = new StiReport(); - является моветоном, если они используются где-либо, кроме LINQ-выражений.
Re: Фильтрация данных в BusinessObject
Добавлено: 25 апр 2014, 16:46
kavit
Linq не подходит. Это хардкод, жестко определяющий набор данных.
Нужно дать возможность пользователям в дизайнере самим определить условия отображения данных.
Мы (разработчики) генерируем бизнес-объект, наполняем его данными, а пользователи сами составляют mrt
У вас есть существует механизм фильтрации в в DataBand-ах и им подобным. Вопрос как эти фильтры применить именно в источнику данных BusinessObject
Re: Фильтрация данных в BusinessObject
Добавлено: 25 апр 2014, 17:00
HighAley
Здравствуйте.
К сожалению, в нашем продукте это сделать невозможно.
Будет лучше это сделать до передачи объектов в отчёт.
Спасибо.
Re: Фильтрация данных в BusinessObject
Добавлено: 25 апр 2014, 17:17
Леонид
Хорошо, можно и без LINQ.
Код: Выделить всё
items.AddRange(new[]
{
new ClassA { IsNew = true, Text = "Text 1" },
new ClassA { IsNew = false, Text = "Text 2" },
new ClassA { IsNew = false, Text = "Text 3" },
new ClassA { IsNew = true, Text = "Text 4" },
new ClassA { IsNew = true, Text = "Text 5" }
});
// создаём datatable
DataTable dtResult = new DataTable("Result");
// создаём колонки
DataColumn colIsNew = new DataColumn("IsNew", typeof(bool));
DataColumn colText = new DataColumn("Text", typeof(string));
// добавляем колонки в табличку
dtResult.Columns.AddRange(new DataColumn[] {colIsNew, colIsNew} );
// здесь пользователи заполняют данные... //
// после этого мы "перебрасываем" данные из бизнес-объекта в обычный DataTable
foreach (ClassA a in items)
{
DataRow row = dtResult.NewRow();
row["IsNew"] = a.IsNew;
row["Text"] = a.Text;
dtResult.Rows.Add(row);
}
dtResult.AcceptChanges();
// передаём DataTable репорту
StiReport report = new StiReport();
report.RegData("Results", dtResult);
report.Design();
Не?
Re: Фильтрация данных в BusinessObject
Добавлено: 27 апр 2014, 13:42
kavit
Нашел направление решения, на основании этой заметки:
http://support.stimulsoft.com/index.php ... -from-code. На скриншотах видно использование фильтра. Теперь в дизайнере можно настроить фильтр по полю.
В коде нужно настроить:
Код: Выделить всё
var dataBand = report.GetComponentByName("Data") as StiDataBand;
if (dataBand != null)
{
dataBand.Filters.Add(new StiFilter("items.IntValue", StiFilterCondition.GreaterThan, "8", StiFilterDataType.Numeric));
}
Странно слышать про ответ:
Здравствуйте.
К сожалению, в нашем продукте это сделать невозможно.
Будет лучше это сделать до передачи объектов в отчёт.
Система фильтров у вас есть и работает.
Вопрос как в дизайнере выбрать поле "Колонка фильтра" для BusinessObject. Вы же сделали зачем-то элемент UI "выбор колонки" в условии фильтрации. Может это поле работает для источников данных, КРОМЕ BusinessObject?
Еще вопрос общего характера:
Как можно добавлять картинки с режимом preview, чтобы получился формат как в Confluence, чтобы в тексте картинка была маленькая, а при нажатии на нее можно посмотреть в полном размере?
Re: Фильтрация данных в BusinessObject
Добавлено: 28 апр 2014, 10:26
Aleksey
Здравствуйте,
Система фильтров у вас есть и работает.
Вопрос как в дизайнере выбрать поле "Колонка фильтра" для BusinessObject. Вы же сделали зачем-то элемент UI "выбор колонки" в условии фильтрации. Может это поле работает для источников данных, КРОМЕ BusinessObject?
Вы можете применять фильтрацию только для бэндов. Для самого бизнес объекта это сделать невозможно.
Еще вопрос общего характера:
Как можно добавлять картинки с режимом preview, чтобы получился формат как в Confluence, чтобы в тексте картинка была маленькая, а при нажатии на нее можно посмотреть в полном размере?
К сожалению, данный функционал не реализован в нашем продукте.
Спасибо.
Re: Фильтрация данных в BusinessObject
Добавлено: 28 апр 2014, 13:38
kavit
Вы можете применять фильтрацию только для бэндов. Для самого бизнес объекта это сделать невозможно.
Вопрос в другом. Опишу по шагам.
Чтобы установить фильтр в дизайнере для DataBand. Нужно
1) выбрать DataBand
2) в свойствах выбрать "Фильтры"
3) Нажать "Добавить фильтр"
4) В поле "Колонка" в выпадающем меню выбрать поле по которому будет выполняться фильтрация
5) В дополнительном поле ниже указать условия фильтра (значение)
Так вот: на 4-м этапе, поле "Колонка" = readonly, т.е. нельзя вписать значение поля, по которому будет выполняться фильтрация в Band-е. Можно выбрать только из выпадающего списка. И вот в чем проблема:
в выпадающем списке появляются поля, только если источник данных "ADO.NET (dataset, datatable и т.д.)". (см. attach). Если источник данных для Band-а является BusinessObject, то в выпадающем меню полей нет.
Вопрос: почему и что сделать чтобы можно было выбирать поля фильтра для Databand-a?
Еще вопрос общего характера:
Как можно добавлять картинки с режимом preview, чтобы получился формат как в Confluence, чтобы в тексте картинка была маленькая, а при нажатии на нее можно посмотреть в полном размере?
Это я спрашивал, про форум, не про ваш продукт. Как на форуме в моих сообщениях добавлять картинки более аккуратно, чтобы они не заполняли все пространство?
Re: Фильтрация данных в BusinessObject
Добавлено: 28 апр 2014, 14:38
HighAley
Здравствуйте.
kavit писал(а):Вопрос в другом. Опишу по шагам.
Чтобы установить фильтр в дизайнере для DataBand. Нужно
1) выбрать DataBand
2) в свойствах выбрать "Фильтры"
3) Нажать "Добавить фильтр"
4) В поле "Колонка" в выпадающем меню выбрать поле по которому будет выполняться фильтрация
5) В дополнительном поле ниже указать условия фильтра (значение)
Так вот: на 4-м этапе, поле "Колонка" = readonly, т.е. нельзя вписать значение поля, по которому будет выполняться фильтрация в Band-е. Можно выбрать только из выпадающего списка. И вот в чем проблема:
в выпадающем списке появляются поля, только если источник данных "ADO.NET (dataset, datatable и т.д.)". (см. attach). Если источник данных для Band-а является BusinessObject, то в выпадающем меню полей нет.
Вопрос: почему и что сделать чтобы можно было выбирать поля фильтра для Databand-a?
В выпадающем меню отображаются только поля из источника данных данного бэнда независимо от того то обычный Data Source или Business Object. Для бизнес объектов также отображаются поля.
- FilterWithBO.png (25.01 КБ) 4191 просмотр
Если вам этого не достаточно, то вы можете заменить Field Is Value на Field Is Expression и писать любое выражение.
kavit писал(а):
Еще вопрос общего характера:
Как можно добавлять картинки с режимом preview, чтобы получился формат как в Confluence, чтобы в тексте картинка была маленькая, а при нажатии на нее можно посмотреть в полном размере?
Это я спрашивал, про форум, не про ваш продукт. Как на форуме в моих сообщениях добавлять картинки более аккуратно, чтобы они не заполняли все пространство?
К сожалению другого способа добавлять картинки нету.
Спасибо.
Re: Фильтрация данных в BusinessObject
Добавлено: 28 апр 2014, 16:16
kavit
Прикрепил видео (
http://megaswf.com/s/2658392). В нем видно, что для Databand нет возможности выбрать колонку фильтра.
Что я делаю не так?
Версия Stimulsoft в подписи.