Фильтрация в отчете Fast Report, ADO Data Set

При создании отчета в Fast Report использую ADO подключение.
Но при добавлении фильтра в отчет возникает ошибка
"Объект TSObjectLibrary.ADODataset не поддерживает интерфейс IDBDataset"

Прошу помочь.

Нравится

7 комментариев

Евгения, по скриншоту видно, что Вы пытаетесь добавить поле из ADODataset во встроенное окно фильтрации отчета FastReport.
Ошибка возникает в результате того, что Filter Builder не может работать с ADODataset (так как к нему нельзя построить SQL запрос).

Наталия, спасибо за ответ.
Я поняла, что добавить фильтацию через Filter Builder к полю ADODataset с этом случае нельзя.

Из темы http://www.community.terrasoft.ua/forum/topic/6590 было создано собственное окно фильтации. Но в моем случае при запуске отчета с собственным окном фильтрации возникает ошибка :

"Невозможно редактировать сервис 'Offerings\General\Main Grid\fr_FastReport'. Объект TSObjectLibrary.ADODataset ({5119679C-DF62-4F33-ABD8-CD2BA96A64EA}) не поддерживает интерфейс IDBDataset ({B77D78C1-40FD-4A5A-9592-DC0A6072AA3B}) «Call Stack»"

Вопрос - Как же тогда сделать фильтрацию?!

Поскольку ADODataset возвращает уже готовые данные, фильтровать его для отчета можно одним из двух способов:
1. Создать в ADODataset набор параметров, в которые будут передаваться значения из окна фильтрации.
При нажатии на кнопку "Ок" заполнять параметры и открывать ADODataset:

var dsSource = Services.GetSingleItemByUSI('ads_Test');
SetParameterValue(dsSource.Parameters, 'pIndex', IndexValue);
dsSource.Open();

2. При нажатии на кнопку "Ок" получить экземпляр MemoryDataset, передать через атрибуты в MemoryDataset значения полей окна фильтрации и ADODataset.
В событии OnDatasetAfterOpen MemoryDataset открывать ADODataset, выполнять прохождение по всем его записям и в случае, если запись соответствует значению поля окна фильтрации, заполнять MemoryDataset. В отчете FastReport уже будет не ADODataset, а MemoryDataset.

Спасибо за ответ.
Наталия, прошу вас написать еще подробнее, если можете, то со скриншотами, пожалуйста.

Евгения, какой из способов описать подробнее?

Рассмотрим последовательно:
1. В теле функции обработки события нажатия на кнопку "Ок" окна фильтрации реализовать:

- считывание значений полей окна фильтрации:

var CashAccountID = edtCashAccount.Value;
var CurrencyID = edtCurrency.Value;

- получение экземпляра MemoryDataset:

var dsReport = frpMain.DatasetByUSI('mds_CashBreak');

- передача через атрибуты в MemoryDataset значения полей окна фильтрации:

dsReport.Attributes('CashAccountID') = CashAccountID;
dsReport.Attributes('CurrencyID') = CurrencyID;

2. У MemoryDataset следует создать обработчик события OnDatasetAfterOpen, в теле функции которого реализовать:

- считывание значений полей окна фильтрации:

var CashAccountID = Dataset.Attributes('CashAccountID');
var CurrencyID = Dataset.Attributes('CurrencyID');

- заполнение MemoryDataset, см. http://www.community.terrasoft.ua/forum/topic/5397

Показать все комментарии