Использование ограничения на данные в выпадающем списке может быть полезным, когда ограничение должно быть только на уровне пользовательского интерфейса, а проверки check constraints не могут быть применимы к задаче.
Например, нужно чтобы пользователь в поле "Ответственный" за задачу мог выбрать только из сотрудников, которые работают прямо сейчас.
Использование условия в check constraint-е вида "ответственный - это сотрудник, который работает сейчас" не подойдет, так как попытка "увольнения" сотрудника приведет к тому, что все записи, где этот сотрудник был ответственным, перестанут проходить проверку и "увольнения" не получится.
В этом случае стоит использовать интерфейсное ограничение на данные в выпадающем списке.
Это ограничение позволяет выводить в интерфейсе пользователя только "сотрудников, работающих сейчас", при этом ни в каких проверках данных в базе это ограничение не нуждается. В таблице задач могут присутствовать старые записи, в которых, например, ответственный - уже не работает.
Для использования интерфейсных ограничений необходимо:
options_view
для референс-поляvalue
и pun
:
value
- содержит идентификатор записи, которая будет вставляться в референс-поле при выбореpun
- строка-лэйбл, которая будет отображаться в выпадающем спискеЕсли уж выбранное значение в референс-поле не было найдено в представлении, на которое ссылается
options_view
, то в качестве лэйбла отобразится значение главной колонки (как обычно и происходит без ограничений).
options_view
указывается ссылка на представление с набором данных:options_view = &schema.user_view_name
options_view = {
ref: &schema.user_view_name,
args: {
arg1: $id,
arg2: 95
}
}
SELECT
....
responsible_contact @{
link = &base.person_form,
options_view = &hrm.ref_employees_working_now_view,
},
...
FROM
pm.actions
...
Пример использования:
Таблица Действий
Представление для ограничения таблицы действий
С помощью options_view
можно ограничить значения в выпадающем всписке в представлении с типом multi_select
:
{ $id reference(user.groups) }:
SELECT
@type = 'multi_select',
@options_view = {
ref: &user.only_my_tasks,
args: {
person: (SELECT id FROM base.people WHERE user = $$user_id)
}
},
"group" @{
default_value = $id,
},
task @{
"select" = true,
}
FROM
user.tasks_for_groups
WHERE
"group"= $id
FOR INSERT INTO
user.tasks_for_groups
{
$owner reference(base.people) null @{
caption = 'Ответственный',
options_view = &hrm.ref_employees_working_now_view,
}
}:
SELECT
...
FROM
...
WHERE
$owner IS NULL OR responsible_person = $owner
...
Пример использования: Доска Сделок