Описание
Задает или возвращает значение, определяющее, какие данные являются допустимыми для поля при его изменении или добавлении в таблицу (только в рабочей области Microsoft Jet).
Значение
Задаваемое и возвращаемое значение данного свойства определяется выражением типа String, которое задает условие сравнения в виде предложения WHERE инструкции SQL, но без ключевого слова WHERE. Для объекта, еще не добавленного в семейство Fields, данное свойство доступно для чтения/записи. Более подробное описание характеристик чтения/записи данного свойства см. в разделе "Дополнительные сведения".
Замечания
Свойство ValidationRule определяет, проводится ли проверка условий на значение в указанном поле. Попытка ввести данные, не удовлетворяющие условиям на значение, приводит к перехватываемой ошибке. При этом возвращается сообщение об ошибке, текст которого задается в свойстве ValidationText, а если значение этого свойства не задано, то текст выражения, заданного в свойстве ValidationRule.
Для объекта Field использование свойства ValidationRule зависит от того, какой из объектов содержит семейство Fields, как показано в следующей таблице:
Вмещающий объект Доступ Index Не поддерживается QueryDef Только чтение Recordset Только чтение Relation Не поддерживается TableDef Чтение/запись
Для объекта Recordset свойство ValidationRule доступно только для чтения. Для объекта TableDef использование свойства ValidationRule определяется типом объекта TableDef, как показано в следующей таблице:
Тип объекта TableDef Доступ Основная таблица Чтение/запись Присоединенная таблица Только чтение
Условия на значение поддерживаются только в базах данных, использующих ядро Microsoft Jet.
В строковом выражение, определяющем свойство ValidationRule объекта Field, допускаются ссылки только на это поле. Данное выражение не может содержать ссылки на определяемые пользователем функции, статистические функции SQL или запросы. Если свойство ValidateOnSet объекта Field имеет значение True, то для определения условий на значение поля выражение для свойства ValidationRule должно быть синтаксически верным (с именем поля в качестве подразумеваемого операнда) и возвращать значение True. Если для свойства поля ValidateOnSet задано значение False, свойство ValidationRule игнорируется.
Выражение для свойства ValidationRule объекта Recordset или TableDef может содержать ссылки на любые поля этого объекта, в остальном действуют ограничения, перечисленные выше для объектов Field.
Для объекта Recordset типа таблицы свойство ValidationRule автоматически наследует значение свойства ValidationRule объекта TableDef, на основе которого создан объект Recordset.
Для объекта TableDef, созданного на основе присоединенной таблицы, свойство ValidationRule наследует значение соответствующего свойства базовой основной таблицы. Если базовая основная таблица не поддерживает условия на значения, то значением свойства ValidationRule становится пустая строка ("").
Если значение свойства задается путем слияния строки с нецелым числом, а в системной настройке задано использование десятичного разделителя, отличного от десятичной точки (например, запятой, как в следующем примере: strFilter = "ЦЕНА > " & lngPrice, где lngPrice = 125,50), то при попытке проверить условия на значение возникнет ошибка. Причина заключается в том, что при слиянии строк число преобразуется в строковое значение с использованием текущего системного десятичного разделителя, а в языке Microsoft Jet SQL распознается только американский символ десятичного разделителя (точка).
Пример
Следующая программа создает объект Field в указанном объекте TableDef и задает его свойства ValidationRule и ValidationText с помощью переданных данных. Далее демонстрируется использование свойств ValidationRule и ValidationText при вводе данных. Для выполнения данной процедуры требуется функция SetValidation.
Sub ValidationRuleX() Dim dbsNorthwind As Database Dim fldDays As Field Dim rstEmployees As Recordset Dim strMessage As String Dim strDays As String Dim errLoop As Error Set dbsNorthwind = OpenDatabase("Борей.mdb") ' Создает новое поле в таблице "Сотрудники", ' используя указанные значения свойств. Set fldDays = SetValidation(dbsNorthwind.TableDefs!Сотрудники, "Отгулы", dbInteger, 2, "BETWEEN 1 AND 20", _ "Допускаются числа от 1 до 20!") Set rstEmployees = dbsNorthwind.OpenRecordset("Сотрудники") With rstEmployees ' Цикл по всем компонентам объекта Recordset. Для каждой ' записи поля заполняются данными, введенными пользователем. Do While Not .EOF .Edit strMessage = "Введите число отгулов для " & !Имя & " " & !Фамилия & vbCr & _ "[" & !Отгулы.ValidationRule & "]" Do While True ' Принимает данные от пользователя. strDays = InputBox(strMessage) If strDays = "" Then .CancelUpdate Exit Do End If !Отгулы = Val(strDays) ' Свойство ValidateOnSet по умолчанию имеет значение ' False. Данные в буфере будут проверяться на ' соответствие свойству ValidationRule при вызове ' метода Update. On Error GoTo Err_Rule .Update On Error GoTo 0 ' При успешном выполнении метода Update ' печатает результаты изменения данных. If .EditMode = dbEditNone Then Debug.Print !Имя & " " & !Фамилия & " - " & "Число отгулов = " & _ !Отгулы Exit Do End If Loop If strDays = "" Then Exit Do .MoveNext Loop .Close End With ' Удаляет новое поле, созданное только для демонстрации. dbsNorthwind.TableDefs!Сотрудники.Fields.Delete fldDays.Name dbsNorthwind.Close Exit Sub Err_Rule: If DBEngine.Errors.Count > 0 Then ' Отображает семейство Errors. For Each errLoop In DBEngine.Errors MsgBox "Код ошибки: " & errLoop.Number & vbCr & _ errLoop.Description Next errLoop End If Resume Next End Sub Function SetValidation(tdfTemp As TableDef, strFieldName As String, intType As Integer, _ intLength As Integer, strRule As String, strText As String) As Field ' Создает и добавляет новый объект Field в семейство Fields ' указанного объекта TableDef. Set SetValidation = tdfTemp.CreateField(strFieldName, intType, intLength) SetValidation.ValidationRule = strRule SetValidation.ValidationText = strText tdfTemp.Fields.Append SetValidation End Function