Фильтрация данных в отчетах

Фильтрация данных в отчетах: спецификации и технические детали для Delphi
Корректная фильтрация данных — критический узел системы отчетности. В данной подборке представлены технические материалы по реализации фильтрации с учетом спецификаций компонентов Delphi, стандартов качества обработки данных и аппаратных ограничений.
Материалы реализации: три основных подхода
- TDBGrid.Filter (TCustomGrid.Filter): Встроенный механизм фильтрации по одному полю (текстовый, числовой, логический). Реализует интерфейс IDataFilter. Особенность: фильтр применяется к визуализированным данным, а не к исходному набору. Ограничение: не поддерживает составные условия (AND/OR) без дополнительной обвязки. Для отчетов FastReport / QuickReport рекомендуется использовать только для предварительного просмотра.
- TDataSet.OnFilterRecord: Событие, вызываемое для каждой записи при навигации. Параметр Accept: Boolean позволяет программисту реализовать любую логику (сравнение строк, диапазоны, регулярные выражения). Спецификация: производительность падает на наборах свыше ~100 000 записей (линейная сложность). Рекомендуется для отчетов малого объема (до 50 000 строк).
- Параметрические запросы (TFDQuery, TADOQuery): Фильтрация на уровне СУБД (WHERE). Технические детали: при использовании TFDConnection + SQLite/PostgreSQL передача параметров через Params.ByName('param').AsString. Преимущество: минимальный трафик, работа с индексами. Недостаток: не применим для клиентских наборов (TClientDataSet).
Сравнение альтернатив для отчетов большого объема
- Фильтр через TClientDataSet + Index + FindKey / Locate — скорость поиска 0.5–2 мс (зависит от индекса). Подходит для MDX-структур (многомерных). Недостаток: требует предварительной индексации.
- Фильтрация через TFDTable.Filter (локальный Filter) — использует FileSystem диспетчера базы данных. Спецификация: поддерживает операторы >, <, =, LIKE, IN. Не поддерживает функции (UPPER, SUBSTRING). Альтернатива для Firebird/Interbase.
- Динамическая SQL-генерация — построение строки WHERE из переменных формы. Технический нюанс: требуется защита от SQL-инъекций (использование TFDQuery.SQL.Text += ...). Стандарт: всегда применять Params вместо конкатенации строк.
Требования к качеству при фильтрации (стандарты)
Для отчетов, выводимых на печать или экспорт, фильтр должен проходить три этапа проверки: 1) Консистентность данных — фильтр не должен пропускать записи, удовлетворяющие условиям (полнота). 2) Идемпотентность — повторное применение без очистки не меняет результат. 3) Формализация — использование приведения типов: для TDateField -> FormatDateTime('yyyy-mm-dd', ...).
Материалы по специфическим инструментам
- TdxDBTreeList (ExpressQuantumTreeList): Поддерживает фильтрацию по уровням иерархии. Фильтр применяется к текущему уровню и всем дочерним (если не отключено свойство FilterChildrenMode).
- TMS TAdvStringGrid: Встроенный фильтр по столбцам (AutoFilter). Для отчетов — использование TDBAdvGrid с привязкой к TDataSet. Особенность: требует ручного сброса фильтра при смене отчета.
- FastReport TfrxDBFilter: Программный объект для применения условий к TfrxDBDataSet. Стандарт: использует механизм событий (OnBeforeFilter, OnAfterFilter) для ленивой загрузки.
Технические ограничения и требования к аппаратному обеспечению
Фильтрация на клиентской стороне (TDataSet.Filter, TClientDataSet.Filtered) при объеме данных свыше 200 000 записей упирается в пропускную способность памяти (bandwidth) и частоту процессора. Рекомендуемый порог для интерактивных отчетов — 30 000 записей. Для серверной фильтрации (SQL) необходимое условие — наличие покрывающих индексов по полям фильтрации (B-tree или Hash). Спецификации для Delphi 12 / 2026: поддержка фильтрации через TFDQuery.SQLText + Filter (смешанный режим) только для FireDAC, не для dbGo.
Добавлено: 27.04.2026
