Oracle Reports: как в параметрах разобрать множество?

Verdie
Дата: 05.11.2008 02:49:32
Oracle Reports 6.0

Каким образом можно реализовать, чтобы при наборе в текстовом поле параметров отчета к примеру 123, 012, 456 в запрос вставлялись эти данные как ... in ('123', '012', '456')?
max(id)
Дата: 05.11.2008 05:55:16
Можно попробовать такой подход :

1) создать элемент типа placeholder column, тип данных указываем character (например CP_IN_STR)
2) добавить данный элемент в секцию where запроса (например так "select * from dual
where 1=1 &CP_IN_STR"). Если у вас существуют другие условия накладываемые на выборку, то условие 1 = 1 нужно "выбросить", здесь оно добавленно т.к. Reports выдаёт ошибку при сохранении запроса с "пустым" where.
3) в триггере BEFORE REPORT добавляем строку для заполнения placeholder-а нужным условием (например :cp_in_str := ' and 1 in ('||:P_1||')';). Разумеется в параметре P_1 мы ждём правильную "строку чисел через запятую", так что соответствующие проверки приветствуются.

Если ни чего не забыл, то всё... и дальше как обычно.

P.S. Не очень красиво и т.д., но должно работать.
Verdie
Дата: 06.11.2008 01:18:37
При таком раскладе триггер не подцепляет параметр P_1.

Каким образом placeholder разберет строчку на множество? Думаю такой вариант только для одного значения уместен...
max(id)
Дата: 06.11.2008 07:51:44
Verdie
При таком раскладе триггер не подцепляет параметр P_1.

Вы уверены? Объясните...
Verdie

Каким образом placeholder разберет строчку на множество?

Он её не разбирает.
Если вы не поняли, то элемент типа placeholder column заполняется строкой с условием которое должно быть дабавленно в секцию WHERE вашего запроса.
В описаном примере если в параметр P_1 передать строку '1, 2, 3' то значение CP_IN_STR будет ' and 1 in (1, 2, 3)'.
После чего строка из CP_IN_STR будет подставлена в ваш SQL запрос вместо литерала &CP_IN_STR и получится что то вроде:
select * from dual where 1=1 and 1 in (1, 2, 3)
.
Verdie
Думаю такой вариант только для одного значения уместен...

Ну это пока только ваши мысли ... ;-)) Хотелось бы услышать ваши аргументы.
ps
Дата: 06.11.2008 14:16:38
Тема старая. Здесь даже примеры и картинки есть. Надо только поискать.
Oracle Reports. Как в дата модели сделать макроподстановку алиаса?
Verdie
Дата: 11.11.2008 03:41:41
автор
Вы уверены? Объясните...


Если вставлять тот пример что вы писали ( :cp_in_str := ' and 1 in ('||:P_1||')';)) в триггер AFTER REPORT то параметр :P_1 в запрос не подсталвяется т.е. подставляется and 1 in (), а вот если вставлять тоже выражение в AFTER PARAMETER FORM, то тогда значение подставляется.

автор
Он её не разбирает.
Если вы не поняли, то элемент типа placeholder column заполняется строкой с условием которое должно быть дабавленно в секцию WHERE вашего запроса.
В описаном примере если в параметр P_1 передать строку '1, 2, 3' то значение CP_IN_STR будет ' and 1 in (1, 2, 3)'.
После чего строка из CP_IN_STR будет подставлена в ваш SQL запрос вместо литерала &CP_IN_STR и получится что то вроде:

select * from dual where 1=1 and 1 in (1, 2, 3)


Это все понятно. Вопрос в том как сделать чтобы в параметры забивалось 1,2,3 а в запрос подставлялось in ('1','2','3') т.е. с разделителями '' ?
max(id)
Дата: 01.12.2008 06:21:56
Verdie
автор
Вы уверены? Объясните...


Если вставлять тот пример что вы писали ( :cp_in_str := ' and 1 in ('||:P_1||')';)) в триггер AFTER REPORT то параметр :P_1 в запрос не подсталвяется т.е. подставляется and 1 in (), а вот если вставлять тоже выражение в AFTER PARAMETER FORM, то тогда значение подставляется.

Про AFTER REPORT я не говорил, в моём примере был BEFORE. Можно конечно и AFTER PARAMETER FORM использовать, но тогда если ошибаюсь нужно не placeholder column использовать, а например параметр отчёта.

Verdie

Это все понятно. Вопрос в том как сделать чтобы в параметры забивалось 1,2,3 а в запрос подставлялось in ('1','2','3') т.е. с разделителями '' ?

попробуйте просто replace-ом:
... ''''||replace('1,2,3',',',''',''')||''''...