Перейти к основному содержимому

Действия (Actions)

Настройки операций с базой данных.

Введение​

Постоянно выполняется какая-либо манипуляция данными, и часто существуют правила, например:

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

Действия (actions) служат именно для этого — чтобы внедрить код, который будет выполняться в определённых ситуациях при манипуляции данными.

При вставке или изменении какой-либо информации выполняются действия сохранения (save) и сохранено (saved):

  • save: Перед выполнением команды в базе данных.
  • saved: После выполнения команды в базе данных.

А при удалении, стирании или исключении какой-либо информации выполняются действия удаления (remove) и удалено (removed).

  • remove: Перед выполнением команды в базе данных.
  • removed: После выполнения команды в базе данных.

Таким образом, когда мы изменяем что-то в форме, с операциями создания, изменения или удаления информации, в базе данных выполняются различные операции, и соответствующие действия (actions) выполняются.

Слышали о triggers базы данных? Триггер базы данных выполняется всякий раз, когда происходят изменения данных, поэтому действия (actions) похожи на триггеры, только на уровне кода.

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

  • Создание: insert into ...
  • Изменение: update ...
  • Удаление: delete from ...

Когда мы выполняем одну из этих команд базы данных через _db.execute(...), никакое действие не будет выполнено, потому что команда выполняется напрямую в базе данных без возможности взаимодействия с действиями.

В коде действий можно использовать любой ресурс полиглотного low-code фреймворка.

Действия выполняются, когда происходит какая-либо манипуляция данными в формах бэк-офиса, авто-генерируемого Netuno, или когда мы выполняем операции в базе данных в коде, используя:

  • _db.insert(...), _db.form(...).insert(), _db.insertIfNotExits(...), _db.insertMany(...), среди прочих.
  • _db.update(...), _db.form(...).update(), _db.updateMany(...), среди прочих.
  • _db.delete(...), _db.form(...).delete(), _db.deleteMany(...), среди прочих.

То есть, когда мы используем в коде какой-либо механизм полиглотного low-code фреймворка для выполнения операций манипуляции данными, будет выполнено соответствующее действие, если оно существует.

Однако если команда выполняется напрямую в базе данных, то выполнить действие будет невозможно.

Рекомендуется избегать выполнения команд напрямую в базе данных, чтобы не обходить механизмы манипуляции данными, которые предлагает Netuno.

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

Элемент данных (Data Item)​

Элемент данных (_dataItem) — это ресурс полиглотного low-code фреймворка, который содержит весь набор данных, создаваемых, изменяемых или удаляемых.

Через ресурс _dataItem мы можем получить доступ ко всей информации и проверить детали процесса выполняющейся операции.

См. документацию ресурса DataItem, чтобы узнать больше деталей о том, что поддерживает ресурс _dataItem.

Внимание: Ресурс _dataItem доступен только в коде действий (actions).

Сохранить, Записать, Изменить или Создать Новое (Save)​

Чтобы создать action, которая будет выполняться при создании новой записи или при изменении чего-либо, скрипт этой action будет называться save, что означает, что что-то сохраняется в базе данных, например:

  • мое_приложение/server/actions/моя_форма/save.js

Это действие выполняется перед выполнением команды базы данных.

Когда нужно выполнить код после того, как данные сохранены в базе данных, мы используем действие saved, например:

  • мое_приложение/server/actions/моя_форма/saved.js

Это действие выполняется после выполнения команды базы данных.

То есть внутри приложения в папке server/actions мы создаём подпапку с именем формы (таблицы), а внутри размещаем скрипт с именем save или saved, который содержит соответствующий код для выполнения до или после команды базы данных.

Чтобы определить, является ли это созданием данных, можно проверить с помощью if результат метода _dataItem.isInsert(), например:

мое_приложение/server/actions/моя_форма/save.js
if (_dataItem.isInsert()) {
// Создаются новые данные...
}

Чтобы определить, является ли это изменением данных, можно проверить с помощью if результат метода _dataItem.isUpdate(), например:

мое_приложение/server/actions/моя_форма/saved.js
if (_dataItem.isUpdate()) {
// Изменяются данные...
}

Получить ID​

Чтобы получить ID (идентификатор) элемента, который изменяется:

_dataItem.getId()

Проверить, что изменяется​

Чтобы проверить, что изменяется, можно использовать getOldRecord() для получения старых данных в базе данных и сравнить с новыми данными getRecord(), например:

if (_dataItem.getOldRecord().getString("email") != _dataItem.getRecord().getString("email")) {
// Внимание: E-mail изменяется!
}

Сгенерировать ошибку​

Можно сгенерировать ошибку, чтобы предотвратить продолжение операции; генерация ошибки обычно выполняется перед выполнением команды базы данных, то есть в действии save, например:

мое_приложение/server/actions/моя_форма/save.js
_dataItem.setStatusWithError()
.setErrorTitle("Email")
.setErrorMessage("Изменять e-mail не разрешено.")

Проверить, была ли ошибка​

Можно проверить, была ли какая-либо ошибка при выполнении команды в базе данных; могут возникать различные ошибки, например:

  • Не разрешается иметь повторяющиеся e-mail.
  • Обязательное поле было заполнено некорректно.
  • И многие другие.

Проверка ошибок обычно выполняется после выполнения команды базы данных, то есть в действии saved, например:

мое_приложение/server/actions/моя_форма/saved.js
if (_dataItem.isError()) {
// Произошла какая-то ошибка, и сохранить данные не удалось...
}

Настройка (Setup)​

Можно иметь специальную action, которая выполняется только при изменении данных во время конфигурации (setup) базы данных.

Например:

  • мое_приложение/server/actions/моя_форма/setup_save.js
  • мое_приложение/server/actions/моя_форма/setup_saved.js

Удалить, Стереть или Исключить (Remove)​

Чтобы создать action, которая будет выполняться при удалении какой-либо записи, скрипт этой action будет называться remove, что означает, что что-то удаляется из базы данных, например:

  • мое_приложение/server/actions/моя_форма/setup_remove.js

Это действие выполняется перед выполнением команды базы данных.

Когда нужно выполнить код после того, как данные сохранены в базе данных, мы используем действие removed, например:

  • мое_приложение/server/actions/моя_форма/setup_removed.js

Это действие выполняется после выполнения команды базы данных.

То есть внутри приложения в папке server/actions мы создаём подпапку с именем формы (таблицы), а внутри размещаем скрипт с именем remove или removed, который содержит соответствующий код для выполнения перед или после команды базы данных.

Конфликт со связями​

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

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

мое_приложение/server/actions/моя_форма/removed.js
if (_dataItem.isStatusAsError() && _dataItem.isStatusAsRelations()) {
_log.error(
"Не удалось удалить, потому что есть связь с таблицей "
+ _dataItem.getRelationTable() +" использующей ID " + _dataItem.getRelationItem().getInt("id")
)
}

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

мое_приложение/server/actions/моя_форма/remove.js
_db.form("другая_форма")
.where(
_db.where("моя_форма_id")
.equals(_dataItem.getRecord().getInt("id"))
)
.delete()

Настройка (Setup)​

Можно иметь специальную action, которая выполняется только при удалении данных во время конфигурации (setup) базы данных.

Например:

  • мое_приложение/server/actions/моя_форма/setup_remove.js
  • мое_приложение/server/actions/моя_форма/setup_removed.js

Заключение​

С помощью действий (actions) мы можем централизовать конкретные операции, связанные с манипуляцией определёнными данными.

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

Программирование действий простое и чрезвычайно полезное; их можно расширять, используя любой другой ресурс полиглотного low-code фреймворка.

В коде действий можно использовать любой ресурс полиглотного low-code фреймворка.

Рассмотрите использование действий — и вы быстро убедитесь, насколько полученная простота может усилить множество полезных стратегий.