Difference between revisions of "DB.GetTrigger"

From SunFlurry wiki
Jump to: navigation, search
 
m (1 revision imported)
 
(No difference)

Latest revision as of 08:43, 7 February 2021

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

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

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

Синтаксис

DB.GetTrigger():<Значение триггера (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;