Блог Александра Божко
Архивы
Рубрики

TfrxADOComponents

Две предыдущие недели я практически полностью посвятил компонентам доступа к данным и построению отчетов. Накопилось очень много материала, который, к сожалению, я просто не успел систематизировать. По большей части все мои “изыскания” так или иначе связаны с рабочими проектами. А рабочие проекты имеют свойство иногда “гореть”. Поэтому в очередной раз приношу извинения читателям за “рваный ритм” своего блога.

Кроме того, я  стал обладателем двух очень серьезных наборов компонентов, о чем планирую рассказать отдельно и очень обстоятельно.

Ну, а пока я продолжу тему затронутую в этом посте.

Напомню, суть вопроса. У некоторых DataSet‘ов, в частности у TADOQuery, отсутствуют свойства MasterSource и MasterField. Требуется построить отчет с несколькими уровнями данных в FastReport.

Приведенное мной решение не оправдало ожиданий. К сожалению вынужден признать, что так делать нельзя. На большом объеме данных “пропадают” записи в подчиненной таблице.

Как быть?

Вариантов существует несколько.

Первый способ – создать запросы непосредственно в БД (напомню, в моем случае речь идет об Access) и использовать TADOTable. Минус – надо менять структуру базы, кто слушал вебинар, возможно помнит, что в нашем проекте задача это не совсем простая.

Второй способ – использовать альтернативный набор компонентов, в частности FireDAC. Я  использовал это решение в проекте (уж очень было любопытно посмотреть на практике). В принципе, не возникло абсолютно никаких проблем.

Третий способ, думаю, самый идеологически правильный. А именно, использование компонентов доступа к данным FastReport.

Документация гласит следующее:

FastReport позволяет создавать новые компоненты в run-time. В FastReport принципы создания компонентов доступа к данным максимально приближены к тем, что используются в среде Delphi. Так же, как и в Delphi, на форму кладется компонент и в инспекторе объектов настраиваются его свойства. Компонентная идеология очень гибкая: можно легко создавать новые компоненты для поддержки разных движков доступа к данным.

http://www.fast-report.com/public_download/html/UserMan-ru/index.html?tfrxadoquery.htm

Собственно, в нашем случае все сводится к тому, что у нас есть возможность в дизайнере разместить компоненты TfrxADOQuery. Для этого компонента есть возможность задать связь Master-Details.

http://www.fast-report.com/public_download/html/UserMan-ru/index.html?tfrxadoquery.htm (спасибо Николаю Звереву за ссылку).

Предварительно нужно разместить на форме компонент TfrxADOComponents. Это будет работать и в FastReport Embarcadero Edition. При том работать очень быстро!

И в продолжение затронутой темы – эксперименты по производительности. Николай Зверев предложил вместо переоткрытия запроса использовать фильтр. Примерно так:

OnAfterScroll:
qryExpenses.Filter := 'EXPCATEGORY_ID=' + qryCategoriesExpCategoryID.AsString;
qryExpenses.Filtered := True;
qryExpenses.First;

При этом (процитирую Николая), если [свойство] CursorLocation = clUseClient (значение по дефолту), то фильтр применяется локально. Если CursorLocation = clUseServer – то текст фильтра тупо примешивается к Where условию запроса.

Проверил на практике. В моем варианте (с передачей параметра) тестовая база обрабатывается почти в три (!!!) раза быстрее чем с использованием фильтра.

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика