Шаг 111 - Свойство ValidationRule

Описание
Задает или возвращает значение, определяющее, какие данные являются допустимыми для поля при его изменении или добавлении в таблицу (только в рабочей области 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

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 21.03.2002