Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Oracle Reports: как в параметрах разобрать множество?  [new]
Verdie
Member

Откуда: Владивосток
Сообщений: 7
Oracle Reports 6.0

Каким образом можно реализовать, чтобы при наборе в текстовом поле параметров отчета к примеру 123, 012, 456 в запрос вставлялись эти данные как ... in ('123', '012', '456')?
5 ноя 08, 02:49    [6395387]     Ответить | Цитировать Сообщить модератору
 Re: Oracle Reports: как в параметрах разобрать множество?  [new]
max(id)
Member

Откуда: Владивосток
Сообщений: 407
Можно попробовать такой подход :

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. Не очень красиво и т.д., но должно работать.
5 ноя 08, 05:55    [6395426]     Ответить | Цитировать Сообщить модератору
 Re: Oracle Reports: как в параметрах разобрать множество?  [new]
Verdie
Member

Откуда: Владивосток
Сообщений: 7
При таком раскладе триггер не подцепляет параметр P_1.

Каким образом placeholder разберет строчку на множество? Думаю такой вариант только для одного значения уместен...
6 ноя 08, 01:18    [6400829]     Ответить | Цитировать Сообщить модератору
 Re: Oracle Reports: как в параметрах разобрать множество?  [new]
max(id)
Member

Откуда: Владивосток
Сообщений: 407
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
Думаю такой вариант только для одного значения уместен...

Ну это пока только ваши мысли ... ;-)) Хотелось бы услышать ваши аргументы.
6 ноя 08, 07:51    [6401016]     Ответить | Цитировать Сообщить модератору
 Re: Oracle Reports: как в параметрах разобрать множество?  [new]
ps
Member

Откуда:
Сообщений: 503
Тема старая. Здесь даже примеры и картинки есть. Надо только поискать.
Oracle Reports. Как в дата модели сделать макроподстановку алиаса?
6 ноя 08, 14:16    [6403471]     Ответить | Цитировать Сообщить модератору
 Re: Oracle Reports: как в параметрах разобрать множество?  [new]
Verdie
Member

Откуда: Владивосток
Сообщений: 7
автор
Вы уверены? Объясните...


Если вставлять тот пример что вы писали ( :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') т.е. с разделителями '' ?
11 ноя 08, 03:41    [6420363]     Ответить | Цитировать Сообщить модератору
 Re: Oracle Reports: как в параметрах разобрать множество?  [new]
max(id)
Member

Откуда: Владивосток
Сообщений: 407
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',',',''',''')||''''...
1 дек 08, 06:21    [6506700]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить