Rambler's Top100

(c)2009-2017 openinfotech.ru

СУБД HyTech

Документация
Функция htRecordModify

htRecordModify - Модификация записи в таблице

Назначение:

Функция позволяет модифицировать запись по ее физическому номеру. Модификация невозможна, если таблица открыта в режиме "только на чтение" или захвачена другими пользователями сети в монопольном режиме. Нельзя также править запись, захваченную другими пользователями сети. Реального изменения постоянной части не происходит. Исправления заносятся в журнал изменений. Последующие операции поиска "видят" новое содержимое записи.

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

  • захват записи (запрет другим пользователям менять или удалять запись); для таблиц, задействованных в транзакциях, захват не обязателен, так как записи такой таблицы не могут быть модифицированы другими пользователями до завершения транзакции; однако следует иметь в виду, что записи такой таблицы могут быть свободно захвачены другими станциями и таким образом заблокированы от модификации или удаления;
  • актуализация записи (чтение тела захваченной записи, которое теперь уже никто не изменит);
  • выполнение необходимых изменений содержимого записи;
  • отработка функции модификации записи;
  • освобождение записи от захвата.
  • Операция требует обязательного захвата модифицируемой записи при работе в сети на нетранзакциональных таблицах, иначе завершится с ошибкой. Захват возможен как отдельный (htHoldRecord, htHoldResults или htHoldFreeRecords), так и совмещенный с чтением (htHoldReadRecord).

Прототип:

int HTAPI htRecordModify(
  THANDLE	hTable, 	/* Обработчик для таблицы */
  long		gRecordNo, 	/* Физический номер модифицируемой записи */
  void far	*fpRecord	/* Тело записи */
);

Параметры:

hTable задает обработчик открытой таблицы
gRecordNo задает физический номер удаляемой записи
fpRecord задает адрес буфера, содержащего новое (модифицированное) тело записи.

Результат:

0 при успешном завершении
отрицательное число код ошибки

Пример.

Заменить фамилию в записи под номером 10 на JONSON. Работа в сети.

typedef struct tagREC { /* Структура записи таблицы */
	char	name[10];
	char	sex;
	int	fee;
} REC;
THANDLE 	hTable;
REC		sBody;
long		gRecNo = 10L;
 . . .
/* Захватить запись и прочитать ее содержимое */
rc = htHoldReadRecord( hTable, gRecNo, &sBody );
if( rc < 0 )
	/* Обработка ошибок */
else
{
	/* Сменить значение фамилии */
	/* (символьное поле нужно заполнить до конца) */
	setmem( sBody.name, sizeof(sBody.name), ' ' );
	memcpy( sBody.name, "JONSON", 6 );
	/* Сохранить изменение */
	rc = htRecordModify( hTable, gRecNo, &sBody );
	if( rc < 0 )
		/* Обработка ошибок */
	/* Освободить запись (даже в случае ошибки модификации) */
	htReleaseRecord( hTable, gRecNo );
}