Это не статья документации, а рассмотрение конкретного кейса.
Обязательно будет преобразована в статью c абстрактным примером, когда у нас дойдут руки 😓
Есть таблица с годами years
Есть таблица с выходными calendar
reference(years)
)Необходимо заполнять календарь данными о выходных и отображать его в представлении.
В представление в качестве аргумента передан выбранный год ($year reference(years)
).
Можно проверять в коде представления - есть ли данные по выходным года из $year
, и если их нет - отображать кнопку "Заполнить календарь"
в меню.
{
$year reference(main.years)
}:
SELECT
@extra_actions = [
{
name: (
CASE
WHEN
(SELECT COUNT(id) FROM main.calendar WHERE year = $year) < 365
THEN
'Заполнить каледарь'
END
),
action: {
schema: 'main',
name: 'calendar_filling',
args: {
arg: $year
},
},
}
],
date @{},
year @{},
week_number @{},
week_day @{},
is_vacation @{ }
FROM
main.calendar
WHERE
year = $year
Так как в строках 15-21 (из прошлого кодэдитора) мы указали экшн main.calendar_filling
action: {
schema: 'main',
name: 'calendar_filling',
args: {
arg: $year
},
},
то тело этого экшна исполнится по клику на кнопку Заполнить календарь
Экшны можно создать/отредактировать в меню администратора 🕹 All Actions
.
https://<ваш-инстанс>.ozma.org/views/admin/actions_table_all
Пример того, что может происходить в экшне:
export default async function handleEvent(args) {
// sql запрос для получения года по идентификатору
let queryStr = `SELECT name FROM main.years WHERE id = ${args.year}`;
// получает данные sql запроса из базы
const exprResult = await FunDB.getUserView({
type: "anonymous",
query: queryStr
});
// пишет в лог полученные данные из базы
FunDB.writeEvent(JSON.stringify(exprResult));
// в year - год, полученные по его идентификатору
const year = exprResult.result.rows[0].values[0].value;
// создаем 365 записей для года
for (let i = 0; i < 365; i++) {
await FunDB.insertEntity({
schema: "main", name: "calendar"
},
{
year: args.year,
date: generateDate(i, year),
week_number: generateWeekNumber(i,year),
week_day: generateWeekDay(i, year),
is_vacation: generateIsVacation(i, year)
}
);
}
return { ok: true }
}
/*
function generateDate(day_index, year) { }
...
*/
В args
попадают значения, переданные из UserView.
В данном случае в args.year
- год, переданный из представления
В коде процедуры можно создать/изменить/удалить любое количество записей в базе (строки 18-28) или получить набор данных по sql запросу (строки 3-9)