Фильтрация в отчете Fast Report, ADO Data Set
При создании отчета в Fast Report использую ADO подключение.
Но при добавлении фильтра в отчет возникает ошибка
"Объект TSObjectLibrary.ADODataset не поддерживает интерфейс IDBDataset"
Прошу помочь.
Нравится
Евгения, по скриншоту видно, что Вы пытаетесь добавить поле из 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