Шаг 88 - Свойство BatchCollisionCount

Описание
Возвращает число записей, которые не были обновлены в последней операции пакетного обновления (только в рабочей области ODBCDirect).

Значение
Возвращаемое значение имеет тип данных Long и указывает число записей, которые не были обновлены, или 0, если были успешно обновлены все записи.

Замечания
Данное свойство показывает, для какого количества записей возникали конфликты обновления или другие причины, не позволившие обновить записи, во время последней попытки пакетного обновления. Значение данного свойства соответствует числу закладок, указанному в свойстве BatchCollisions.
Если задать в свойстве Bookmark рабочего объекта Recordset значения закладок из массива BatchCollisions, то можно будет перейти на каждую запись, которая не была обновлена во время последней пакетной операции Update.
После исправления записей, испытавших конфликты обновления, можно снова вызвать метод Update в пакетном режиме. В этот момент механизм DAO предпримет новую попытку пакетного обновления, а свойство BatchCollisions снова будет определять набор записей, которые не были обновлены во второй попытке. Любые записи, успешно обновленные в предыдущей попытке, не будут участвовать в новой попытке, поскольку теперь их свойство RecordStatus будет определяться константой dbRecordUnmodified. Этот процесс может продолжаться и далее, пока не будут разрешены все возникающие конфликты, или до отказа пользователя от попыток обновления и закрытия результирующего набора записей.

Пример
Следующая программа использует свойство BatchCollisionCount и метод Update для демонстрации пакетного обновления, при котором любые конфликты обновления устраняются путем принудительного пакетного обновления.

Sub BatchX()

	Dim wrkMain As Workspace
	Dim conMain As Connection
	Dim rstTemp As Recordset
	Dim intLoop As Integer
	Dim strPrompt As String

	Set wrkMain = CreateWorkspace("ODBCWorkspace", 	"admin", "", dbUseODBC)
	' Это значение свойства DefaultCursorDriver 
	' требуется для пакетного обновления.
	wrkMain.DefaultCursorDriver = dbUseClientBatchCursor

	Set conMain = wrkMain.OpenConnection("Publishers", dbDriverNoPrompt, False, "ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

	' Следующее значение аргумента блокировки
	' требуется для пакетного обновления.
	Set rstTemp = conMain.OpenRecordset( "SELECT * FROM roysched", dbOpenDynaset, 0, dbOptimisticBatch)

	With rstTemp
		' Изменяет данные в локальном наборе записей.
		Do While Not .EOF
			.Edit
			If !royalty <= 20 Then
				!royalty = !royalty - 4
			Else
				!royalty = !royalty + 2
			End If
			.Update
			.MoveNext
		Loop

		' Попытка пакетного обновления.
		.Update dbUpdateBatch

		' Если имеются конфликты обновления, пользователю
		' предоставляется возможность выбрать 
		' принудительное обновление или разрешение
		' конфликтов по отдельности.
		If .BatchCollisionCount > 0 Then
			strPrompt = "Обнаружены конфликты. " & vbCr & "Вызвать программу принудительного " & vbCr & "обновления с помощью локальных данных?)"
			If MsgBox(strPrompt, vbYesNo) = vbYesNo Then 	.Update dbUpdateBatch, True
		End If
		.Close
	End With
	conMain.Close
	wrkMain.Close
End Sub

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