Фиксирует изменения, сделанные в буферизированной строке, буферизированной таблице, курсоре, или курсор-адаптере.

TABLEUPDATE( [nRows [, lForce]] [, cTableAlias | nWorkArea] [, cErrorArray] )

Параметры

nRows

Определяет, какие изменения сделанные в таблице или курсоре должен быть фиксированы.
Обратите внимание:
Visual FoxPro допускает Оптимистичесую буферизацию Строк по умолчанию, для тех курсоров, которые ассоциированы с объектом CursorAdapter .

Следующая таблица описывает значения для nRows .

nRows Описание

0

Если строка или буферизация таблицы разрешены, фиксируются только изменения, сделанные в текущей строке курсора. (Значение по умолчанию)

При работе с объектом CursorAdapter , Visual FoxPro выполняет соответствующую команду, помещенную в свойствах InsertCmd , UpdateCmd , или DeleteCmd только для этой строки.

1

Если буферизация таблицы разрешена, фиксируются изменения, сделанные во всех записях таблицы или курсора.

Если буферизация строки разрешена, фиксируются только изменения, сделанные в текущей записи таблицы или курсора.

При работе с объектом CursorAdapter , Visual FoxPro выполняет соответствующие команды в свойствах InsertCmd , UpdateCmd , и DeleteCmd для каждой задействованной строки.

2

Фиксирует изменения, сделанные в таблице или курсоре тем же способом, как если бы nRows = 1. Однако, ошибка не происходит, когда изменение не может быть фиксировано. Visual FoxPro продолжает обрабатывать любые остающиеся записи в таблице или курсоре.

Если включен параметр cErrorArray , то создается массив, содержащий сведения об ошибке в случае, если ошибка происходит.

Для совместимости с приложениями предыдущих версий Visual FoxPro, параметр nRows также может быть установлен в Ложь (.F). и Истину (.T). вместо 0 и 1 соответственно. При определении 0 или 1 для nRows , указатель записи остается на записи, где изменения не могли быть зафиксированы. Для определения причины, почему изменения не могли быть зафиксированы, используйте функцию AERROR( ) . При работе с объектом CursorAdapter и определении 1 или 2 для nRows , все изменения, сделанные в курсоре в следующих событиях CursorAdapter должны быть зафиксированы в течение того же самого запроса TABLEUPDATE () , если не происходит ошибка:
  • BeforeInsert

  • AfterInsert

  • BeforeDelete

  • AfterDelete

  • BeforeUpdate

  • AfterUpdate

Visual FoxPro передает значения nRows в обработчик событий CursorAdapter BeforeCursorUpdate .
lForce

Определяет, будет ли записывать Visual FoxPro поверх тех изменений, которые сделанны в таблице или курсоре другим пользователем сети. Следующая таблица описывает значения для lForce .

lForce Описание

Ложь (.F).

Фиксирует изменения в таблице или курсоре, начиная с первой записи и до конца таблицы или курсора. (Значение по умолчанию)

Истина (.T).

Обновление записей с любыми изменениями, сделанные в таблице или курсоре другим сетевым пользователем. Предложение WHERE использует только поля ключа.

При работе с объектом CursorAdapter , Visual FoxPro передает значение lForce в следующие обработчики событий CursorAdapter :
cTableAlias

Определяет псевдоним таблицы или курсора, в котором фиксируются изменения. Если Вы включаете таблицу или псевдоним курсора, Вы должны включить параметр lForce .
nWorkArea

Определяет рабочую область таблицы или курсора, в котором фиксируются изменения. Если Вы включаете рабочую область, Вы должны включить параметр lForce .
cErrorArray

Определяет имя созданного массива, когда nRows = 2 и изменение в записи не может быть фиксировано. Массив содержит единственный столбец, содержащий номера записей, для которых изменения не могли быть зафиксированы. Если Вы включаете имя массива, Вы должны включить или псевдоним курсора или таблицы cTableAlias или номер рабочей области nWorkArea .
Обратите внимание:
При ошибке обновления записей, за исключением простой ошибки фиксирования, первый элемент cErrorArray будет содержать -1.  Вы сможете использовать AERROR( ) для определения причины, почему изменения не могли быть фиксированы.

Visual FoxPro передает значение cErrorArray , если оно существует, в обработчик события CursorAdapter AfterCursorUpdate .

Возвращаемое значение

Логический тип данных. TABLEUPDATE( ) Возвращает Истину (.T). если изменения во всех записях зафиксированы.

Иначе, TABLEUPDATE( ) возвращает Ложь (.F)., что указывает на неудачу. Процедура ON ERROR не выполняется. Фуанкция AERROR( ) может использоваться, чтобы вернуть информацию о причине отказа.

Обратите внимание:
TABLEUPDATE( ) всегда возвращает Истину (.T)., когда Вы модифицируете данные, используя Буферизацию Таблицы, и обновляете таблицу или таблицы источника данных от разных клиентов, при установке значения BatchUpdateCount больше чем 1. Поэтому, избегайте устанавливать значение BatchUpdateCount больше чем 1 в подобных сценариях.

Замечания

TABLEUPDATE( ) не может зафиксировать изменения, сделанные в таблице или курсоре, который не имеет разрешения на буферизацию записей или таблицы. Если Вы запускаете TABLEUPDATE( ) , а буферизация записей или таблицы не допускаются, Visual FoxPro генерирует сообщение об ошибке. Однако, TABLEUPDATE( ) может, тем не менее, фиксировать изменения в таблице или курсоре, которые имеют соответствующие правила проверки. Для разрешения или запрещения буферизации записей или таблицы, используйте CURSORSETPROP( ) .

Изменения фиксируются в таблице или курсоре, открытых в текущей рабочей области если TABLEUPDATE( ) запускается без дополнительных параметров cTableAlias или nWorkArea .

Если используется буферизация таблицы и модифицирован набор записей, TABLEUPDATE( ) перемещает указатель записи на последнюю модифицированную запись.

Обратите внимание:
Запрос TABLEUPDATE( ) для локальной таблицы или представления, которые не используют  полей с ключами, генерирует длинное предложение WHERE , чтобы найти строку модификации. Заданное по умолчанию количество полей, которое поддерживается в предложении WHERE - 40. Если Вы получаете ошибку SQL: Избыточная Длина Инструкции (Ошибка 1812) , Вы должны или использовать поле ключа для модификации или увеличивать сложность предложения WHERE с использованием SYS(3055) . Если Вы используете функцию SYS(3055) , увеличьте ее значение до количества, которое восьмикратно превышает количество полей в таблице как показано в следующем примере:

Скопировать код
SYS(3055, 8 * MIN(40, FCOUNT( ))

При выполнении пакетной операции TABLEUPDATE () , из-за особенностей поведения ODBC, Visual FoxPro неспособен обнаружить конфликты, когда никакой ошибки не генерируется сервером, так же как если ничто не модифицировано, например, ни одна строка не соответствует предложению WHERE . Это может произойти, когда Вы используете WhereType установленный в DB_KEYANDUPDATABLE, DB_KEYANDMODIFIED, или DB_KEYANDTIMESTAMP, и другой пользователь изменил одно из основных значений в предложении WHERE так, что строка не может быть найдена инструкцией для модификации.

Взаимодействие с объектом CursorAdapter.

Следующее поведение касается работы с объектом CursorAdapter :

  • TABLEUPDATE () работает только с курсором, ассоциированным с объектом CursorAdapter .

  • TABLEUPDATE () выполняет команды, согласно типу источника данных и сохраненых в свойствах CursorAdapter InsertCmd , UpdateCmd , или DeleteCmd команд, над текущей строкой курсора или строками соответственно.

  • TABLEUPDATE () передает значение GETFLDSTATE(1) в следующие обработчики событий CursorAdapter , которые касаются каждой задействованной строки:

    Для подробной информации о GETFLDSTATE () , см. Функция GETFLDSTATE( ) .

  • Успешное завершение TABLEUPDATE () сбрасывает состояние полей согласно обычному поведению TABLEUPDATE () .

  • Когда буферизация таблицы допускается, Вы можете покинуть текущую запись в следующих событиях CursorAdapter :

    Вы можете также изменить данные в курсоре. Эти функциональные возможности поддерживают сценарии типа поиска автоинкрементного значения в базовой таблице и вставки его в курсор. Когда происходит такой сценарий, объект CursorAdapter должен автоматически возвратиться к записи, изменения которой должны быть зафиксированы после того, как произошло событие, и фиксирует изменения.

    В Visual FoxProе 9.0, Вы не можете выполнить Функцию TABLEREVERT () когда TABLEUPDATE( ) находится в состояни выполнения.

    Как правило, объект CursorAdapter использует функциональные возможности управления транзакциями, обеспеченные ADO или ODBC. API и Visual FoxPro закрывают транзакцию, когда функция TABLEUPDATE( ) завершается успешно. Однако, если Вы хотите посылать команды управления транзакциями непосредственно в базовой программе, Вы можете установить свойство UseTransactions объекта CursorAdaptor в Ложь (.F.) и CursorAdapter не будет использовать транзакции, чтобы посылать команды Insert, Update, or Delete.

Пример

Следующий пример демонстрирует, как Вы можете использовать TABLEUPDATE( ) для фиксирования изменений, сделанных в буферизованной таблице. Создана таблица employees , и инструкция SQL INSERT вставляет значение "Smith"  в поле cLastName .

MULTILOCKS установлен в ON , что является требованием для буферизации таблицы. CURSORSETPROP( ) используется, чтобы установить режим буферизации в Оптимистическую Буферизацию Таблицы (5).

Отображается первоначальное значение поля cLastName (Smith), и поле cLastName изменяется применением REPLACE . Отображается новое значение поля cLastName (Jones). Используется TABLEUPDATE( ), чтобы зафиксировать изменения в таблице ( TABLEREVERT( ) может быть выполнена вместо этого для отказа от изменений). Затем отображается модифицированное значение поля cLastName (Jones).

Скопировать код
CLOSE DATABASES
CREATE TABLE employee (cLastName C(10))
SET MULTILOCKS ON && Must turn on for table buffering.
= CURSORSETPROP('Buffering', 5, 'employee' ) && Enable table buffering.
INSERT INTO employee (cLastName) VALUES ('Smith')
CLEAR
? 'Original cLastName value: '
?? cLastName && Displays current cLastName value (Smith).
REPLACE cLastName WITH 'Jones'
? 'New cLastName value: '
?? cLastName && Displays new cLastName value (Jones).
= TABLEUPDATE(.T.) && Commits changes.
? 'Updated cLastName value: '
?? cLastName && Displays current cLastName value (Jones).

См. Также