По какой причине могут не передаваться в 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
у Вас прописаны 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
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
"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. Исправление будет на след. неделе. Как временное решение предлагаем использовать выражение:
Это не решение полное, это прямое втыкакание условия “and NDOC_YEAR = '2022”, которое потом придется опять править в следующем году. Есть уже один “гвоздь”, который задает по-умолчанию фильтрацию в кубе, не хотелось бы добавлять второй. Я и так могу просто сразу написать “where NDOC_YEAR = 2022” в запросе даже без использования ненужной здесь cond. Но это же не правильно.
Тем более,что не учитываются остальные поля из управляющего дэша.
А если захотят посмотреть предыдущий год?
Да и не один же “год” в фильтрах находится, есть и квартал, и месяц, есть и подразделения. Если по какому либо из других параметров отфильтуют, по нескольким из многих подразделений, например, как быть?