DB.SetTrigger

From SunFlurry wiki
Jump to: navigation, search
  SetTrigger (Работа с триггерами)
Объект:Объект базы данных
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Сервер и БД
Исключения:Неподходящий объект, триггер не создан в проекте, объект заблокирован, ошибка БД
Визуальность:Нет

Функция устанавливает значение триггера изменения текущего объекта, если таковой был задан в Студии. Триггер является дополнительным особым реквизитом (@TRIGGER) объекта, который может содержать 4 состояния. При любой записи объекта в базу данных (визуальной или программной), состояние триггера устанавливается в единицу (1), это может служить указанием на то, что объект был изменен. Когда необходимо провести синхронизацию с внешними источниками данных или выгрузку куда-либо, производится выборка по измененным объектам, производится синхронизация и состояние триггера устанавливается равным 2 (или 0, в зависимости от желания разработчика), см. описание простого процесса объектов выгрузки ниже. Только объекты справочников или документов могут иметь триггер. При изменении триггера, запись всего объекта не производится, поэтому объект не обязательно перечитывать после блокировки для изменения его триггера. При изменении подчиненного справочника в визуальном интерфейсе (удаление или сохранение), система автоматически установит триггер на элементе-родителе, если подчиненный элемент не имеет оного. При программном сохранении или удалении, разработчик может также легко установить триггер родителя, для этого предусмотрен третий аргумент функций Save и Mark. Триггер может иметь 4 состояния:

  • 0 -- объект был создан до того, как был добавлен триггер. Это неопределенное состояние, можно описать "объект никогда не изменялся и не участвовал в синхронизации". Если объект был создан и записан после того, как триггер был добавлен в Студии, его состояние будет равно единице. Разработчик может использовать это состояние для нахождения совокупности объектов для начальной синхронизации.
  • 1 -- объект был изменен. Это состояние автоматически записывается в триггер системой при любом изменении объекта.
  • 2 -- (рекомендуется) объект синхронизирован. Это состояние можно использовать для указания на то, что объект прошел синхронизацию и больше не изменен. Для системы это состояние ничем не отличается от состояния 0 или 3.
  • 3 -- (рекомендуется) временное состояние. Это состояние можно использовать после того, как объект начал выгружаться, но до того, как станет известно, что объект выгружен и успешно принят на удаленном пункте назначения. Если за время, пока выгрузка находится "в пути", будет произведено изменение объекта, он автоматически получит состояние 1. Когда станет известно, что выгрузка завершена успешно, программа может проверить триггеры на выгружаемых объектах, для объектов, у которых триггеры по-прежнему равны 3, программа изменит их на 2 (объект выгружен), в остальных случаях, объект был изменен во время обмена и должен остаться в состоянии 1, чтобы попасть в следующий сеанс выгрузки.

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

    • Убедиться, что обмен с внешним источником не происходит где-то еще (к примеру, с помощью серверного семафора DBLockStringMutex).
    • Произвести выборку по объектам, триггеры которых не имеют состояния 2.
    • Получить и заблокировать следующий объект, перечитать его с помощью функции Reload.
    • Добавить объект в файл или поток выгрузки, установить состояние его триггера в 3, разблокировать объект.
    • Окончить цикл выгрузки объектов и ожидать ответа от удаленной стороны, о том, что выгрузка принята и зафиксирована
    • ...
    • Если выгрузка зафиксирована, произвести выборку по объектам, триггеры которых имеют состояние 3.
    • Получить и заблокировать следующий объект, перечитывать его с помощью функции Reload не обязательно, так как установка триггера не сохраняет весь объект и триггер не хранится в загруженном объекте, каждый вызов GetTrigger является вызовом базы данных.
    • Если триггер объекта по прежнему имеет состояние 3, изменить его состояние на 2, разблокировать объект
    • Окончить цикл, разблокировать серверный семафор (DBUnlockStringMutex).

Синтаксис

DB.SetTrigger(<Значение триггера (INT)>)

Аргументы

  • <Значение триггера (INT)> - Числовое значение в диапазоне 0..3, задающее новое состояние триггера.

Примеры

//Пример показывает завершающую стадию обмена, когда для отправленных ранее объектов в списке СпВОжидании после получения сигнала о том, что обмен прошел успешно,
//  необходимо установить триггер в состояние 2.
For i:=1 To СпВОжидании.Size() Do
  aEl:=СпВОжидании.Get(i);
  If aEl.Lock() Then
    If aEl.GetTrigger()=3 Then
      aEl.SetTrigger(2);
    EndIf;  
    aEl.Unlock();
  EndIf;
EndDo;