Динамические фильтры

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

Динамический фильтр реализован в виде шаблона с тремя controls:

Обычно эти controls я размещаю в панели инструментов таблицы:

DFilter.gif (8406 bytes)

Списки Фильтров хранятся в специальном файле '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.

 

Список Фильтров

Filter_t.gif (8933 bytes)

Список Фильтров предназначен для редактирования и выбора Фильтров, применяемых в различных таблицах для ограничения диапазона просматриваемых записей.  Окно "Фильтры" показывает только фильтры, относящиеся к той таблице, из которой оно было вызвано.  В данном примере показаны фильтры Ведомости Счетов.   

Форма записи Списка Фильтров:

Filter_u.gif (4381 bytes)

"Таблица"       - Условное название таблицы, для которой будет применяться данный фильтр.  Это поле заполняется автоматически е его изменять нельзя.
"Номер"          - Порядковый номер фильтра
"Фильтр"        - Название фильтра, по которому он будет выбираться конечным пользователем
"Выражение" - Выражение фильтра на языке Clarion.   После вычисления выражение должно принимать значение "Истина" или "Ложь".  Если выражение принимает значение "Истина" (не равно нулю), то условие фильтра считается выполненным и запись будет показана в таблице.  В выражениях можно применять имена полей фильтруемого файла базы данных (а иногда и связанных с ним).  Можно применять функции языка Clarion.
Кнопка "Проверка" - Проверка выражения фильтра на отсутствие синтаксических ошибок.
 

Функция Filter_s()

Функция 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

Шаблон 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

Hosted by uCoz