DB.Save

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

Функция выполняет сохранение текущего измененного объекта или/и его строчных частей. Функция последовательно выполняет следующие действия:

  • Если объект открыт для визуального редактирования, будет произведен вызов события метаданных OnSave (см. Конфигурация данных проекта). Событие может отменить попытку записи.
  • Если объект открыт для визуального редактирования и он имеет обязательные для заполнения реквизиты, эти реквизиты будут проверены на заполненность, если хотя бы один из них не заполнен, будет вызвано исключение.
  • Измененные строчные части или/и совокупность сохраняемых реквизитов (если реквизиты самого объекта были изменены) формируют набор данных, и отправляются на сервер.
  • Сервер производит временную блокировку, если объект уже не заблокирован. Если блокировка неудачна, сервер останавливает попытку записи и возвращает ошибку.
  • Если объект новый, ему присваивается новый внутренний код базы данных
  • Всем незаполненным реквизитам-нумераторам объекта присваиваются новые номера в соответствии с префиксами, заданными этим реквизитам. Заполненные реквизиты-нумераторы с флагом уникальности проверяются на уникальность,если проверка неудачна (какой-либо из реквизитов не уникален), сервер останавливает попытку записи и возвращает ошибку.
  • Производится сохранение объекта в базу данных и обновление информации в журналах, в которые входит объект. Для новых объектов, имеющих реквизиты-нумераторы, заполняемые при создании объекта (а не при записи), хранящиеся в таблице временных нумераторов на сервере, будут удалены из этой таблицы.
  • Если предусмотрено установками, создается соответствующая запись в таблице журнала регистрации событий.
  • Если объект был заблокирован до записи, блокировка сохраняется. Если новый объект открыт для визуального редактирования или новый или существовавший объект имеет опцию заблокировать объект после сохранения, блокировка сохраняется. В иных случаях, временная блокировка снимается.
  • Сервер возвращает клиенту информацию по внутреннему коду объекта (для новых объектов) и номерам незаполненных реквизитов-нумераторов, эта информация принимается клиентом, который обновляет ей содержимое реквизитов и строчных частей объекта, если объект открыт для визуального редактирования, также обновляются визуальные поля реквизитов-нумераторов.
  • С объекта снимается признак изменен и, если он был открыт для редактирования в визуальной форме, с последней также снимается признак были изменения.

Синтаксис

DB.Save(<Режим сохранения периодических реквизитов (INT)>,<Заблокировать объект после сохранения (INT)>=0,<Элемент для изменения триггера или значение триггера (DB,INT)>)

Аргументы

  • <Режим сохранения периодических реквизитов (INT)> - (необязательный аргумент) Режим определяет, будут ли загруженные периодические реквизиты сохранены при сохранении самого объекта. Если объект является визуальным объектом открытым в режиме изменения, этот параметр всегда будет равен 1, иначе по умолчанию этот параметр равен 0.
  • <Заблокировать объект после сохранения (INT)> - (необязательный аргумент) Параметр определяет будет ли сохранена временная блокировка объекта после удачной записи. Если объект был заблокирован до записи, при любом значении этого аргумента, блокировка не будет снята. Так как в момент записи, объект, если он не был заблокирован, блокируется временной блокировкой, сохранение блокировки после записи имеет гарантированный успех. Параметр удобно использовать для блокировки новых объектов после записи, чтобы продолжать работать с ними, так как новый несохраненный объект еще не имеет внутренного кода базы данных и поэтому не может быть заблокирован.
  • <Элемент для изменения триггера или значение триггера (DB,INT)> - (необязательный аргумент) Параметр может иметь следующий тип:
    • Для типа объект базы данных, параметр определяет дополнительный элемент (чаще всего элемент родителя), на котором нужно установить триггер изменения (1) в случае, если сохранение элемента прошло успешно. Таким образом, удобно устанавливать триггеры на родителях элементов без триггеров (однако, можно подставлять не только элементы родителей). Система самостоятельно выполняет установку триггера на родителе элемента в случае, если сам элемент не имеет триггера, а его родитель имеет, и сохранение происходит из пользовательского интерфейса (не программно).
    • Для типа целое число, параметр определяет значение триггера текущего объекта после записи, если объект имеет триггер изменения. По умолчанию для объектов с триггерами запись будет вызывать их установку в единицу, но использование данного параметра позволяет установить произвольное значение, таким образом исключается дополнительная операция SetTrigger.

Примеры

//Пример производит блокировку и изменение документа аДок
аПольз:="";аМаш:="";аВремя:="";
If аДок.Lock(аПольз,аМаш,аВремя)=0 Then
  Message("Невозможно заблокировать документ "+аДок+", так как в данный момент с ним работает пользователь "+аПольз+" на "+аМаш+" в "+аВремя+"!","!");
  Exit;
EndIf;
Try
  //Перечитать аДок из базы данных, чтобы убедиться, что мы работаем со свежими данными и наше изменение не запишет устаревшие данные в базу данных
  аДок.Reload();
  //Изменим реквизит и сохраним объект
  аДок.Реквизит:=1;
  аДок.Save();
Finally
  аДок.Unlock();
EndTry;