Lookup запрос(таблица), не передаются фильтры

По какой причине могут не передаваться в lookup-запрос фильтры? БД Oracle. Организован один управляющий дэш на весь датасет. Фильтры в упр. дэше выставлены для дэшборда:

В привязке запрос:

select ‘#zayavki’ REQ_NUM
from PARUS.UDO_MV_GOVCNTR_INF C ${where(C.SPROGRAM = ‘$(row.SPROGRAM)’)} and ${filters(NDOC_YEAR,SDOC_MONTH,SDOC_QUART,SDEPARTMENT_1,SDEPARTMENT_2 )}
${order_by}

В итоге в журнале датагейта вижу, что отрабатывает такой лукап-запрос

select ‘#zayavki’ REQ_NUM
from PARUS.UDO_MV_GOVCNTR_INF C
WHERE C.SPROGRAM = ‘09 Наука’ and 1=1

Где фильтры? )

Добрый день.
Можете приложить скрин, как в примере . Зайти в консоль отладки (F12) → Сеть → Полезная нагрузка.

И еще такой вопрос уточняющий - у Вас прописаны defaultValue у измерения в настройках куба?

у Вас прописаны defaultValue у измерения в настройках куба?

Да, “defaultValue”: “2022” по полю года.

Уточню ещё вот какой момент: есть несколько кубов для использования в разных дэшбордах(дэшей) одного датасета, в кубах общие поля и данные для фильтров. На весь датасет создан один управляющий дэш с на основе первого куба. Может быть в этом какая-то проблема? Но фильтрация дэшей на разных кубах из этого одного упр. дэша выполняется прекрасно.

Попробуйте таким образом прописать

select '#zayavki' REQ_NUM
from PARUS.UDO_MV_GOVCNTR_INF C ${where(C.SPROGRAM = '$(row.SPROGRAM)')} 
and case when replace($$${filters(NDOC_YEAR)}$$,'''','''''') = '1=1' then NDOC_YEAR=2022 else ${filters(NDOC_YEAR)} end
and ${filters(SDOC_MONTH,SDOC_QUART,SDEPARTMENT_1,SDEPARTMENT_2 )}
${order_by}

В итоге получается такой запрос
select ‘#zayavki’ REQ_NUM
from PARUS.UDO_MV_GOVCNTR_INF C
WHERE C.SPROGRAM = ‘09 Наука’
and case when replace($$1=1$$,‘’‘’,‘’‘’‘’) = ‘1=1’ then NDOC_YEAR=2022 else 1=1 end
and 1=1
и получаем “java.sql.SQLException: ORA-00911: invalid character” на неэкранированный кавычками текст “$$1=1$$”
но и ${filters(SDOC_MONTH,SDOC_QUART,SDEPARTMENT_1,SDEPARTMENT_2 )} всё равно так же преобразовалось в 1=1

Выше синтаксис это PostgreSQL прикладывал

select '#zayavki' REQ_NUM
from PARUS.UDO_MV_GOVCNTR_INF C ${where(C.SPROGRAM = '$(row.SPROGRAM)')} 
and case when replace(q'[${filters(NDOC_YEAR)}'],'''','''''') = '1=1' then NDOC_YEAR=2022 else ${filters(NDOC_YEAR)} end
and ${filters(SDOC_MONTH,SDOC_QUART,SDEPARTMENT_1,SDEPARTMENT_2 )}
${order_by}

Без replace проще - ‘${filters(NDOC_YEAR)}’ = ‘1=1’. Но эта конструкция в принципе нерабочая, т.к. этот case не редактирует запрос до выполнения, но сам становится его исполняемой частью. Нельзя просто так взять и выставить в результате условие отбора = “then NDOC_YEAR=2022” - тут должен быть возвращен строковый, числовой результат, который уже с чем-то сравнивать можно, например.
В итоге после
select ‘#zayavki’ REQ_NUM
from PARUS.UDO_MV_GOVCNTR_INF C
${where(cond(C.SPROGRAM = ‘$(row.SPROGRAM)’,))}
and case when ‘${filters(NDOC_YEAR)}’ = ‘1=1’ then NDOC_YEAR=2022 else ${filters(NDOC_YEAR)} end
and ${filters(SDOC_MONTH,SDOC_QUART,SDEPARTMENT_1,SDEPARTMENT_2 )}
${order_by}
получаем нерабочий запрос:
select ‘#zayavki’ REQ_NUM
from PARUS.UDO_MV_GOVCNTR_INF C
WHERE C.SPROGRAM = ‘12 Производ-ный конт’
and case when ‘1=1’ = ‘1=1’ then NDOC_YEAR=2022 else 1=1 end
and 1=1
с руганью “java.sql.SQLException: ORA-00905: missing keyword” на " then NDOC_YEAR=2022 else 1=1 end"
Но ладно год, значения по умолчанию, но и ${filters(SDOC_MONTH,SDOC_QUART,SDEPARTMENT_1,SDEPARTMENT_2 )} всё равно так же ведь преобразовалось в 1=1

Приняли в работу этот кейс, будем разбираться как сделать на Oracle

Можно попробовать функцию cond:

$filter( cond(NDOC_YEAR = $(row.NDOC_YEAR), '2022')  )

вот ещё пример:

"filter( cond(year_start <= $(row.y), []) and cond(short_tp = $(row.short_tp), []) and cond(short_tp = ql($(row.short_tp)) or col != '$(row.short_tp)' && version = ql($(version)), []) )",

$filter( cond(NDOC_YEAR = $(row.NDOC_YEAR), '2022') )
Я так понимаю это возможно только когда поле row.NDOC_YEAR явно выводится в таблицу источник. Но для вывода оно в исходной не нужно и служит только для фильтрации данных.
в результате получили ожидаемый вариант нерабочего запроса с ошибкой “java.sql.SQLException: ORA-00920: invalid relational operator”:
WHERE 1=1 and '2022'
Прошу дать решение. Заказчику нужно что-то дельное показывать.

Спасибо, за детальную инфу, нашли ошибку у нас в реализации функции cond. Исправление будет на след. неделе. Как временное решение предлагаем использовать выражение:

$filter( cond(NDOC_YEAR = $(row.NDOC_YEAR), ['NDOC_YEAR = 2022']) )

или

$filter( cond(NDOC_YEAR = $(row.NDOC_YEAR), ["NDOC_YEAR = '2022'"]) )

если нужно год как текст (в кавычках)

Ожидаемый SQL:

WHERE 1=1 and NDOC_YEAR = '2022'

Исправлено в luxmsbi-pg-8.8.14

Теперь $filter( cond(NDOC_YEAR = $(row.NDOC_YEAR), '2022') ) выдаёт WHERE 1=1 and NDOC_YEAR = '2022'

Это не решение полное, это прямое втыкакание условия “and NDOC_YEAR = '2022”, которое потом придется опять править в следующем году. Есть уже один “гвоздь”, который задает по-умолчанию фильтрацию в кубе, не хотелось бы добавлять второй. Я и так могу просто сразу написать “where NDOC_YEAR = 2022” в запросе даже без использования ненужной здесь cond. Но это же не правильно.
Тем более,что не учитываются остальные поля из управляющего дэша.

Мы думаем над тем как ссылаться на фильтры кубов по умолчанию. Возможно будет что-то типа

cond(default_filters(src.cube1))

Если вы не хотите в 2023 году менять дефолты с 2022 на 2023, то есть вариант вычислять текущий год в базе, например

where( cond( NDOC_YEAR = $(period.date), ["NDOC_YEAR = date_part('year', NOW())"] )  )

выдаст SQL: WHERE NDOC_YEAR = date_part('year', NOW())

А если захотят посмотреть предыдущий год?
Да и не один же “год” в фильтрах находится, есть и квартал, и месяц, есть и подразделения. Если по какому либо из других параметров отфильтуют, по нескольким из многих подразделений, например, как быть?

оказалось, что в элементе типа table не работает проброска фильтров.
Евгений Вячеславович обещал починить