Фильтрация данных в BusinessObject

Обсуждение Stimulsoft Reports.NET
kavit
Сообщения: 47
Зарегистрирован: 23 янв 2014, 11:14

Фильтрация данных в BusinessObject

Сообщение 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
Stimulsoft 2014.1.1900.0 Winforms / Windows 7 / Visual Studio 2012 UP4
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Фильтрация данных в BusinessObject

Сообщение Леонид »

Добрый день!

Вопрос не имеет отношения к отчётной системе. Это вопрос знания самого языка 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-выражений.
kavit
Сообщения: 47
Зарегистрирован: 23 янв 2014, 11:14

Re: Фильтрация данных в BusinessObject

Сообщение kavit »

Linq не подходит. Это хардкод, жестко определяющий набор данных.
Нужно дать возможность пользователям в дизайнере самим определить условия отображения данных.
Мы (разработчики) генерируем бизнес-объект, наполняем его данными, а пользователи сами составляют mrt

У вас есть существует механизм фильтрации в в DataBand-ах и им подобным. Вопрос как эти фильтры применить именно в источнику данных BusinessObject
Stimulsoft 2014.1.1900.0 Winforms / Windows 7 / Visual Studio 2012 UP4
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Фильтрация данных в BusinessObject

Сообщение HighAley »

Здравствуйте.

К сожалению, в нашем продукте это сделать невозможно.
Будет лучше это сделать до передачи объектов в отчёт.

Спасибо.
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Фильтрация данных в BusinessObject

Сообщение Леонид »

Хорошо, можно и без 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();
Не?
kavit
Сообщения: 47
Зарегистрирован: 23 янв 2014, 11:14

Re: Фильтрация данных в BusinessObject

Сообщение 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, чтобы в тексте картинка была маленькая, а при нажатии на нее можно посмотреть в полном размере?
Вложения
pic_2.png
pic_2.png (215.42 КБ) 4193 просмотра
pic_1.png
pic_1.png (51.68 КБ) 4193 просмотра
Stimulsoft 2014.1.1900.0 Winforms / Windows 7 / Visual Studio 2012 UP4
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Фильтрация данных в BusinessObject

Сообщение Aleksey »

Здравствуйте,
Система фильтров у вас есть и работает.
Вопрос как в дизайнере выбрать поле "Колонка фильтра" для BusinessObject. Вы же сделали зачем-то элемент UI "выбор колонки" в условии фильтрации. Может это поле работает для источников данных, КРОМЕ BusinessObject?
Вы можете применять фильтрацию только для бэндов. Для самого бизнес объекта это сделать невозможно.
Еще вопрос общего характера:
Как можно добавлять картинки с режимом preview, чтобы получился формат как в Confluence, чтобы в тексте картинка была маленькая, а при нажатии на нее можно посмотреть в полном размере?
К сожалению, данный функционал не реализован в нашем продукте.

Спасибо.
kavit
Сообщения: 47
Зарегистрирован: 23 янв 2014, 11:14

Re: Фильтрация данных в BusinessObject

Сообщение kavit »

Вы можете применять фильтрацию только для бэндов. Для самого бизнес объекта это сделать невозможно.
Вопрос в другом. Опишу по шагам.
Чтобы установить фильтр в дизайнере для DataBand. Нужно
1) выбрать DataBand
2) в свойствах выбрать "Фильтры"
3) Нажать "Добавить фильтр"
4) В поле "Колонка" в выпадающем меню выбрать поле по которому будет выполняться фильтрация
5) В дополнительном поле ниже указать условия фильтра (значение)

Так вот: на 4-м этапе, поле "Колонка" = readonly, т.е. нельзя вписать значение поля, по которому будет выполняться фильтрация в Band-е. Можно выбрать только из выпадающего списка. И вот в чем проблема:
в выпадающем списке появляются поля, только если источник данных "ADO.NET (dataset, datatable и т.д.)". (см. attach). Если источник данных для Band-а является BusinessObject, то в выпадающем меню полей нет.

Вопрос: почему и что сделать чтобы можно было выбирать поля фильтра для Databand-a?
Еще вопрос общего характера:
Как можно добавлять картинки с режимом preview, чтобы получился формат как в Confluence, чтобы в тексте картинка была маленькая, а при нажатии на нее можно посмотреть в полном размере?
Это я спрашивал, про форум, не про ваш продукт. Как на форуме в моих сообщениях добавлять картинки более аккуратно, чтобы они не заполняли все пространство?
Вложения
2014-04-28_1324.png
2014-04-28_1324.png (91.34 КБ) 4184 просмотра
Stimulsoft 2014.1.1900.0 Winforms / Windows 7 / Visual Studio 2012 UP4
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Фильтрация данных в BusinessObject

Сообщение 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
FilterWithBO.png (25.01 КБ) 4183 просмотра
Если вам этого не достаточно, то вы можете заменить Field Is Value на Field Is Expression и писать любое выражение.
kavit писал(а):
Еще вопрос общего характера:
Как можно добавлять картинки с режимом preview, чтобы получился формат как в Confluence, чтобы в тексте картинка была маленькая, а при нажатии на нее можно посмотреть в полном размере?
Это я спрашивал, про форум, не про ваш продукт. Как на форуме в моих сообщениях добавлять картинки более аккуратно, чтобы они не заполняли все пространство?
К сожалению другого способа добавлять картинки нету.

Спасибо.
kavit
Сообщения: 47
Зарегистрирован: 23 янв 2014, 11:14

Re: Фильтрация данных в BusinessObject

Сообщение kavit »

Прикрепил видео (http://megaswf.com/s/2658392). В нем видно, что для Databand нет возможности выбрать колонку фильтра.
Что я делаю не так?

Версия Stimulsoft в подписи.
Stimulsoft 2014.1.1900.0 Winforms / Windows 7 / Visual Studio 2012 UP4
Ответить