Функция ModifyAnyTableRecord Назад В начало Вперед

Назначение

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

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

Реальное копирование мемо-поля из файла происходит только в функции ModifyTableRecord, данная функция не позволяет копировать мемо-поле.

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

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

Описание

function ModifyAnyTableRecord(tableCode: word; var buffer) : word;

Параметры

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

buffer - буфер записи, тип которого берется из сгенерированного tbl2obj include-файла.

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

Код ошибки. (tsOk, tsInternalError).

Функция не выбрасывает исключений.

Пример

#include recAaa1.inc

handler with replace c_aaa1 on trigger aaa1 convert
action
{
  var old_buf : record as table aaa1; // буфер старой таблицы
  var new_buf : recAAA1; // буфер новой таблицы, берем из include-файла
  var new_buf2 : recAAA2; // буфер другой новой таблицы, берем из include-файла

  GetTableBuffer(old_buf);  // считываем старый буфер
  new_buf := recAAA1(old_buf); // копируем не изменившиеся поля

  ModifyTableRecord(new_buf);  // сохраняем изменения

  // так можно, если s - уникальный ключ
  new_buf2.s := old_buf.s;  // копируем поле таблицу
  // для такого кода Aaa2 должна быть уже отконвертирована
  ModifyAnyTableRecord(coAaa2, new_buf); // сохраняем изменения

  // а иначе делаем так
  new_buf2.nRec := myNrec;  // берем где-нибудь nRec (например, по ссылке)
  // для такого кода Aaa2 должна быть уже отконвертирована
  if (GetAnyTableRecord(coAaa2, new_buf2, tiAaa2$Aaa2Id) = tsOk)
  {
	new_buf2.s := old_buf.s;  // копируем поле
	ModifyAnyTableRecord(coAaa2, new_buf); // сохраняем изменения
  }

 result := true;
}

Версия

Атлантис 5.0.02.