Страница 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
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 в подписи.