Простой пример отказа от полей с типом "поиск" ("подстановка") в пользу скриптов и числовых полей.
Так как в скриптах библиотек используется sql(), то необходимо разрешить доступ в каждой библиотеке к двум другим.
Это не готовое решение.
Три библиотеки.
Триггеры отслеживают самые распространенные события:
- в библиотеке Payments => создание записи, изменение записи и поля,
- в библиотеках Projects и Staff => создание и удаление ссылки.
В окончательном решении необходимо предусмотреть другие события.
Обновление полей
Amount Paid
в библиотеках Projects и Staff выполняются автоматически триггерами.
При необходимости эти поля можно обновить вручную из библиотек Projects и Staff с помощью скрипта массового действия.
Для использования sql() в библиотеку Payments добавлены скрытые поля JS:
- id_pr для отслеживания ID записи в поле Projects,
- id_st для отслеживания ID записи в поле
Staff,
- am_pr и am_st для отслеживания значения поля Amount в зависимости от значения поля Type. Кроме того эти поля используются для агрегации в библиотеке.
Результат выполнения запроса sql() сумма полей am_pr или am_st при условии совпадения ID.
Скрипт обновления на примере библиотеки Projects:
let entries = selectedEntries();
for (let ob of entries) {
changeLink( ob );
}
function changeLink( ee ) {
let id_ee =
ee.id;
let lbn = libByName('Payments');
let sum = sql('SELECT SUM ("am_pr") FROM "Payments" WHERE "id_pr" = "' + id_ee + '"').asInt(); //Целое число
if (ee.field('Amount Paid') != sum) {
ee.set('Amount Paid', sum);
}
return true;
}
Шаблоны библиотек примера:
Будет интересно узнать мнение о производительности библиотек из примера по сравнению с исходными библиотеками автора.