File: ...\Samples\Solution\Forms\Qbf.scx

Этот пример позволяет пользователю искать и фильтровать записи через тот же интерфейс, через который он их просматривает.

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

  CopyCode imageКопировать код
* фрагмент кода из события cmdQBFMode.Click
BEGIN TRANSACTION
APPEND BLANK
THISFORM.Refresh

Когда пользователь выберет Query, , то код, связанный с событием Click кнопки cmdQBFMode, откатывает транзакцию назад и удаляет новую запись.

Вы можете применять транзакции только с таблицами, содержащимися в базе данных. Если Вы хотите включить возможности QBF для таблицы, которая не содержится в базе данных, то можете пройти через все элементы управления в форме, сохранить старые значения свойства ControlSource и присвоить свойству ControlSource этих элементов управления пустое значение. После получения строки запроса пользователя, Вы можете вновь пройти через элементы управления и восстановить прежние значения свойства ControlSource.

Код, связанный с событием Click кнопки cmdQBFMode, тоже проходит через все элементы управления формы, проверяет значения, введенные пользователем, и вызывает метод ParseCondition для того, чтобы собрать строку фильтра.

Пользователь может ввести одиночное значение или целое выражение для сопоставления. Например, , чтобы установить фильтр, пользователь может ввести любое из приведенных ниже значений:

  CopyCode imageКопировать код
Sales Manager

!= "Sales Manager"

Если пользователь не вводит выражение, то кавычки не требуются.

Метод ParseCondition

  CopyCode imageКопировать код
LPARAMETERS cCondition, cControlSource
LOCAL lcRetCondition, lcFieldName
IF TYPE('cCondition') = 'C'
cCondition = ALLTRIM(cCondition)
ENDIF

lcFieldName = SUBSTRC(cControlSource,(RATC(".",cControlSource)+1))


IF !EMPTY(cCondition) THEN
IF TYPE('cCondition')$ "CM"
IF ("<" $ cCondition OR ;
"==" $ cCondition OR ;
"LIKE" $ cCondition OR ;
"<>" $ cCondition OR ;
"!=" $ cCondition OR ;
"#" $ cCondition OR ;
"=" $ cCondition OR ;
">" $ cCondition)
lcRetCondition = lcFieldName + cCondition
ENDIF
ENDIF

IF EMPTY(lcRetCondition)
DO CASE
* помещает кавычки вокруг символьных выражений
CASE TYPE(cControlSource) $ "CM"
lcRetCondition = lcFieldName + " = " + CHR(34) + cCondition + CHR(34)

* помещает скобки вокруг выражений даты
CASE TYPE(cControlSource) $ "DT"
lcRetCondition = lcFieldName + " = {" + DTOC(cCondition) + "}"

OTHERWISE
lcRetCondition = lcFieldName + " = " + STR(cCondition)
ENDCASE
ENDIF
ELSE
lcRetCondition = ""
ENDIF

RETURN lcRetCondition

См. также