Динамические и фильтрованные списки

Динамические и фильтрованные списки

Предположим, база данных содержит таблицы 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

Для фильтрованных списков параметры сортировки + и - можно не использовать, т.к. списки сортируются автоматически.