Шаг 148 - Свойство ValidateOnSet

Описание
Задает или возвращает значение, определяющее режим проверки поля на соответствие заданным условиям на значение объекта Field при указании значения свойства Value объекта (только в рабочей области Microsoft Jet).

Значение
Задаваемое или возвращаемое значение является выражением типа Boolean, которое может иметь одно из следующих значений:

Только объекты Field в объектах Recordset поддерживают свойство ValidateOnSet как доступное для чтения/записи.

Замечания
Полезно задавать для свойства ValidateOnSet значение True при работе с записями, содержащими большие поля Memo. Ожидание вызова метода Update для проверки данных на соответствие условиям на значение может привести к значительным потерям времени при записи содержимого полей Memo в базу данных, если окажется, что эти данные не принимаются из-за нарушения условий на значение в другом поле.

Пример
Следующая программа использует свойство ValidateOnSet для демонстрации перехвата ошибок при вводе данных. Для выполнения данной процедуры требуется функция ValidateData.

Sub ValidateOnSetX()

	Dim dbsNorthwind As Database
	Dim fldDays As Field
	Dim rstEmployees As Recordset

	Set dbsNorthwind = OpenDatabase("Борей.mdb")

	' Создает и добавляет новый объект Field 
	' в семейство Fields таблицы "Сотрудники".
	Set fldDays = dbsNorthwind.TableDefs!Сотрудники.CreateField( "Отгулы", dbInteger, 2)
	fldDays.ValidationRule = "BETWEEN 1 AND 20"
	fldDays.ValidationText = "Допускаются числа от 1 до 20!"
	dbsNorthwind.TableDefs!Сотрудники.Fields.Append fldDays
	Set rstEmployees = dbsNorthwind.OpenRecordset("Сотрудники")

	With rstEmployees

		Do While True
			' Добавляет новую запись.
			.AddNew
			' Принимает данные от пользователя для трех полей. 
			' Проверяет, что данные не противоречат условиям 
			' для любого из полей.
			If ValidateData(!Имя, "Введите имя.") = False Then Exit Do
			If ValidateData(!Фамилия, "Введите фамилию.") = False Then Exit Do
			If ValidateData(!Отгулы, "Введите число отгулов.") = False Then Exit Do
			.Update
			.Bookmark = .LastModified
			Debug.Print !Имя & " " & !Фамилия & " - " & "Отгулы = " & !Отгулы
			' Удаляет новую запись, созданную только для демонстрации.
			.Delete
			Exit Do
		Loop

		' Отменяет вызов метода AddNew, если хотя бы одно
		' из условий было нарушено.
		If .EditMode <> dbEditNone Then .CancelUpdate
		.Close
	End With

	' Удаляет новое поле, созданное только для демонстрации.
	dbsNorthwind.TableDefs!Сотрудники.Fields.Delete fldDays.Name
	dbsNorthwind.Close

End Sub

Function ValidateData(fldTemp As Field, strMessage As String) As Boolean

	Dim strInput As String
	Dim errLoop As Error
	ValidateData = True
	' Свойство ValidateOnSet доступно для чтения/записи 
	' только для объектов Field в объектах Recordset.
	fldTemp.ValidateOnSet = True

	Do While True
		strInput = InputBox(strMessage)
		If strInput = "" Then Exit Do

		' Перехват ошибок при задании значений полей.
		On Error GoTo Err_Data
		If fldTemp.Type = dbInteger Then
			fldTemp = Val(strInput)
		Else
			fldTemp = strInput
		End If
		On Error GoTo 0
		If Not IsNull(fldTemp) Then Exit Do
	Loop

	If strInput = "" Then ValidateData = False
	
	Exit Function

	Err_Data:
	If DBEngine.Errors.Count > 0 Then
		' Отображает семейство Errors. Свойство Description
		' последнего объекта Error получит значение свойства
		' ValidationText соответствующего поля.
		For Each errLoop In DBEngine.Errors
			MsgBox "Код ошибки: " & errLoop.Number & vbCr & errLoop.Description
		Next errLoop
	End If
	Resume Next
End Function

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