Динамические фильтры применяются для фильтрации (ограничения количества записей) в таблицах. Условия фильтрации записей определяются конечными пользователями и сохраняются в списке фильтров данной таблицы. Фильтр представляет собой выражение на языке Clarion, которое может быть вычислено при помощи функции evaluate(). В выражении фильтра могут быть использованы имена полей primary-файла и связанных с ним lookup-файлов.
Динамический фильтр реализован в виде шаблона с тремя controls:
Обычно эти controls я размещаю в панели инструментов таблицы:

Списки Фильтров хранятся в специальном файле 'Filter':
Filter
FILE,DRIVER('TOPSPEED'),OEM,NAME(Filter_spr),PRE(fil),CREATE,BINDABLE,THREAD
Table_key KEY(fil:Table,fil:Number),NOCASE,OPT,PRIMARY
Record RECORD,PRE()
Table STRING(20)
! Название таблицы
Number SHORT
! Номер
фильтра по порядку
Name CSTRING(101)
! Название фильтра
Expression CSTRING(201) ! Выражение
фильтра
END
END
Описание файла Filter не нужно в основном приложении. Весь доступ к файлу производится при помощи функции выбора фильтра Filter_s(). Эта функция вызывается только при помощи шаблона DFilter.
Список Фильтров предназначен для редактирования и выбора Фильтров, применяемых в различных таблицах для ограничения диапазона просматриваемых записей. Окно "Фильтры" показывает только фильтры, относящиеся к той таблице, из которой оно было вызвано. В данном примере показаны фильтры Ведомости Счетов.
Форма записи Списка Фильтров:
"Таблица" -
Условное название таблицы, для которой будет
применяться данный фильтр. Это поле
заполняется автоматически е его изменять нельзя.
"Номер" -
Порядковый номер фильтра
"Фильтр" -
Название фильтра, по которому он будет
выбираться конечным пользователем
"Выражение" - Выражение фильтра на языке Clarion.
После вычисления выражение должно принимать
значение "Истина" или "Ложь". Если
выражение принимает значение "Истина" (не
равно нулю), то условие фильтра считается
выполненным и запись будет показана в
таблице. В выражениях можно применять имена
полей фильтруемого файла базы данных (а иногда и
связанных с ним). Можно применять функции
языка Clarion.
Кнопка "Проверка" - Проверка выражения
фильтра на отсутствие синтаксических ошибок.
Функция Filter_s() предназначена для вызова окна Списка Фильтров с целью выбора одного из имеющихся фильтров. В качестве параметра функция получает строку с обозначением таблицы. Выводит на экран окно со Списком Фильтров данной таблицы в режиме выбора записи (процедурой Filter_t). Функция возвращает длинную строку в которой содержится как Название фильтра так и Выражение фильтра, разделенные символом '|'. Прототип функции: Filter_s(String),String
Filter_s FUNCTION(
TableName )
!============================================
CODE
if Filter::Used = 0
CheckOpen(Filter,1)
.
Filter::Used += 1
clear( Fil:Record )
fil:Table = TableName
set( fil:Table_key, fil:Table_key )
next( Filter )
if erorcode()
fil:Table = TableName
.
GlobalRequest = SelectRecord
Filter_t
! Выбор из Списка Фильтров
if GlobalResponse<>RequestCompleted
clear( fil:Record )
.
Filter::Used =- 1
if Filter::Used = 0
close( Filter )
.
return( clip(fil:Expression) &'|'& clip(fil:Name) )
Функция Filter_s() вызывается только при
помощи шаблона DFilter, который передает ей
имя таблицы и разбирает ее возвращаемое
значение.
Шаблон DFilter является control-шаблоном, предназначенным для управления динамическим фильтром таблицы. Он размещает в окне три control-a:
#!=================================================================================
#CONTROL (DFilter, 'Управление Динамическим Фильтром')
#!=================================================================================
CONTROLS
CHECK(' Фильтр:'),MSG('Включить/Выключить
фильтр<160>'),TIP('Вкл/Выкл фильтр'), USE(G:FilterFlag),
AT(,,40,10)
ENTRY(@s40),AT(43,0,124,10),FONT(,,0800000H,FONT:bold),MSG('Название
фильтра'),TIP('Название фильтра'), |
USE(G:FilterName), SKIP, READONLY
BUTTON(''),AT(129,0,11,11),MSG('Список
фильтров'),TIP('Фильтры'),ICON('LOOK.ICO'),USE(?ButtonFilter),SKIP
END
#!
#DISPLAY ('')
#DISPLAY ('Управление Фильтром')
#DISPLAY ('')
#PROMPT ('Обозначение Таблицы:', @s26), %TablName, REQ,
DEFAULT(%Procedure)
#DISPLAY ('')
#BOXED( 'Имена Переменных для Фильтра' )
#PROMPT ('FilterFlag:', @s20), %FilterFlagVar, DEFAULT( 'G:FilterFlag')
#PROMPT ('FilterName:', @s20), %FilterNameVar, DEFAULT( 'G:FilterName')
#PROMPT (' FilterStr:', @s20), %FilterStrVar, DEFAULT( 'G:FilterStr')
#ENDBOXED
#!
#!----- Инициализация процедуры ------
#AT (%ProcedureInitialize)
%FilterFlagVar = 0 ! В начале фильтр выключен
#ENDAT
#!
#! ---- ?G:FilterFlag, after generated code ----
#AT (%ControlPostEventHandling, '?G:FilterFlag', 'Accepted')
! -- Только перерисовать окно
ForceRefresh = True
do RefreshWindow
#ENDAT
#!
#! ---- ?ButtonFilter, after generated code ----
#AT (%ControlPostEventHandling, '?ButtonFilter', 'Accepted')
%FilterStrVar = Filter_s( '%TablName' )
if %FilterStrVar <> ''
r# = instring( '|', %FilterStrVar, 1, 1 )
if r# > 0
%FilterNameVar = sub( %FilterStrVar, r#+1,
len(clip(%FilterStrVar)) - r# )
%FilterStrVar = sub( %FilterStrVar, 1, r#-1 )
.
ForceRefresh = True
do RefreshWindow
.
#ENDAT
#!
#! ---- Validate Record: Filter Checking ----
#AT (%RecordFilter, '1')
if %FilterFlagVar=True
if %FilterStrVar<>'' and evaluate( %FilterStrVar )='0'
exit
.
.
#ENDAT