Работа с Data Sources в коде отчета в классе Reportscript

CouRageCouRage Санкт-Петербург
отредактировано 10:22 Раздел: FastReport .NET
Мне необходимо в коде отчета обратится к одному из источников данных отчета (Data Sources), сделать в нем поиск по одному из полей или пофильтровать его.
Как это лучше делать ?

Пробовал через Report.Dictionary.FindByName(<tablename>) и Report.GetDataSource(<tablename>). Оба метода возвращают TableDataSource. Как в нем искать и как его фильтровать пока не понял. Как через него получить ссылку на DataTable Тоже непонятно.

Комментарии

  • отредактировано 10:22
    Report.GetDataSource - то, что нужно.
    Искать можно так:
    TableDataSource ds = Report.GetDataSource("MyTable") as TableDataSource;
    // открываем и заполняем
    ds.Init();
    // перебираем строки
    while (ds.HasMoreRows)
    {
      // обращаемся к полю. Имя поля вставлено из окна "Данные"
      if (((String)Report.GetColumnValue("MyTable.MyColumn")) == "...")
      {
      }
      ds.Next();
    }
    

    Фильтр для источника данных надо устанавливать в бэнде "Данные".
  • CouRageCouRage Санкт-Петербург
    отредактировано 10:22
    Спасибо за ответ.

    Итерирование - это как-то не самый (совсем не) эффективный способ обработки данных.
    А если источник большой ?
    А если нужно отсортировать данные ?
    Для каждого источника, который нужно отфильтровать и обработать, создавать бэнд ? Как то это не очень (очень не) удобно.

    Вот если бы можно было из TableDataSource получить DataView. Там есть и RowFilter, и Sort.
  • отредактировано 10:22
    Сортировка и фильтрация есть и в TableDataSource; для этого в метод Init надо передать два параметра:
    public void Init(string filter, SortCollection sort)
    Фильтр - это выражение FastReport, ничего общего с фильтром RowFilter не имеет.

    Если и это неудобно, используйте TableDataSource.Table - это DataTable.
  • CouRageCouRage Санкт-Петербург
    отредактировано 10:22
    Спасибо. Понятно.
  • CouRageCouRage Санкт-Петербург
    отредактировано 10:22
    Есть какой то способ обратиться к полю источника данных отчета из скрипта отчета ?
    Я делаю так
    Report.GetDataSource(<tablename>)[<fieldname>]
    
    Это не очень удобно, т.к. такая конструкция возвращает object и нужно каждый раз преобразовывать данные.

    Удобнее всего было бы прямое обращение к источникам в словаре данных отчета. Например, в DataSources есть таблица MyTable и в коде обращаться так:
    MyTable.MyField
    
  • отредактировано 10:22
    Это не типизированный датасет как в VS; напрямую обращаться нельзя. Более того, и таблица, и поле могут иметь в названии пробелы. Рекомендованный способ обращения к полю из скрипта - перетащите в скрипт поле из окна "Данные", при этом FastReport сделает что-то вроде

    ((String)Report.GetColumnValue("Products.ProductName"))
  • CouRageCouRage Санкт-Петербург
    отредактировано 10:22
    Про перетаскивание забыл совсем. Спасибо.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.