Динамические и фильтрованные списки
Предположим, у нас есть база данных с таблицами items
, companies
и item_companies
.
Для статьи о выручке нужно отображать только покупателей, а для статьи о расходах — только поставщиков.
Типичный запрос для получения списка компаний выглядит так:
SELECT id, name FROM companies
Если основной запрос данных содержит параметр @item_id
, его можно использовать и для формирования списка значений. Например, SQL-запрос может выглядеть следующим образом:
SELECT c.id, c.name FROM companies c INNER JOIN item_companies ic ON ic.company_id = c.id WHERE ic.item_id = @item_id
Это пример динамического списка значений. Такие списки обновляются при каждом изменении параметров, например, @item_id
.
Во втором случае, если колонка item_id
присутствует в таблице данных, нужно показывать список покупателей, если item_id
соответствует статье выручки, и список поставщиков, если это статья расходов.
Для решения этой задачи можно добавить третью колонку, которая будет использоваться в качестве фильтра, аналогично item_id
. Например, SQL-запрос может выглядеть так:
SELECT c.id, c.name, ic.item_id FROM companies c INNER JOIN item_companies ic ON ic.company_id = c.id
Это пример фильтрованного списка.
В Excel для этого используются динамические формулы, которые автоматически создаёт надстройка SaveToDB. В других продуктах списки значений просто фильтруются по значению третьей колонки.
В некоторых случаях реализация может быть проще с использованием таблиц или представлений. Например, таблица states
содержит колонки: id
, country_id
, state
.
Если основной запрос данных содержит параметр @country_id
, можно задать запрос из таблицы в поле HANDLER_CODE
следующим образом:
id, +state, @country_id
Этот код преобразуется в следующий запрос:
SELECT id, state FROM states WHERE country_id = @country_id ORDER BY state
Для создания фильтрованного списка значений достаточно указать три колонки в поле HANDLER_CODE
(где country_id
должна быть третьей):
id, state, country_id
Этот запрос преобразуется в простой SELECT:
SELECT id, state, country_id FROM states
Для фильтрованных списков параметры сортировки +
и -
можно не использовать, так как списки сортируются автоматически.