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

Откуда:
Сообщений: 189
Приветствую всех!
Продолжаю изучение Апекса и постоянно наталкиваюсь на непонимание, как сделать ту или иную вещь, пытаюсь изобретать велосипед, но думаю он давно уже изобретен и решил обратиться к специалистам для помощи как правильно решить задачу т.к. я могу предложить несколько решений, но насколько они будут правильными для Апекса.
В общем есть стандартная схема, на одной странице выбираются товары по заданным условиям, которые потом отображается на странице Classic Report вместе с фотографиями. Ели изначально заданы определенные условия, то все понятно, нужно расширить различными IF и вот тут для меня тупик, на какой странице и каким средством это можно сделать.
19 авг 19, 16:36    [21952670]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Никита А
Member

Откуда:
Сообщений: 85
Javl,

Создаёте на страницы item необходимого типа и обращайтесь к ним в запросе через двоеточие + имя.
Например, создали на 10 странице элемент с именем P10_ID, а в запросе обращаемся как
select :P10_ID from dual
20 авг 19, 10:45    [21953122]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
Никита А
Javl,

Создаёте на страницы item необходимого типа и обращайтесь к ним в запросе через двоеточие + имя.
Например, создали на 10 странице элемент с именем P10_ID, а в запросе обращаемся как
select :P10_ID from dual


Не все так просто...может конечно криво описал свою проблему:

Есть выбор товара, к примеру как в стандартном приложении
select p.product_id,
p.product_name,
p.product_description,
p.category,
decode(p.product_avail, 'Y','Yes','N','No') product_avail,
p.list_price,
(select sum(quantity) from demo_order_items where product_id = p.product_id) units,
(select sum(quantity * p.list_price) from demo_order_items where product_id = p.product_id) sales,
(select count(o.customer_id) from demo_orders o, demo_order_items t where o.order_id = t.order_id and t.product_id = p.product_id group by p.product_id) customers,
(select max(o.order_timestamp) od from demo_orders o, demo_order_items i where o.order_id = i.order_id and i.product_id = p.product_id) last_date_sold,
p.product_id img,
apex_util.prepare_url(p_url=>'f?p='||:app_id||':6:'||:app_session||'::::P6_PRODUCT_ID,P6_BRANCH:'||p.product_id||','||3,p_dialog=> 'null') icon_link,
decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
'<img alt="'||apex_escape.html_attribute(p.product_name)||'" title="'||apex_escape.html_attribute(p.product_name)
||'" style="border: 4px solid #CCC; -moz-border-radius: 4px; -webkit-border-radius: 4px;" '
||'src="'||apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id)||'" height="75" width="75" />') detail_img,
decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id))
detail_img_no_style,
tags
from demo_product_info p
where
p.product_name = Условие1
and p.product_name = Условие2
and p.product_name = Условие3


К этому отчету нужно добавить условия с IF, не могу понять каким образом это сделать и куда запихнуть?
20 авг 19, 11:09    [21953169]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
blkangel
Member

Откуда:
Сообщений: 1898
Я изначально не понял проблему.
Используйте регион на на SQL запросе, а на PL/SQL Function Body returning SQL Query
20 авг 19, 11:29    [21953203]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Никита А
Member

Откуда:
Сообщений: 85
Создайте 3 элемента(item) на странице, в которых можно будет выбрать тип товара
P10_product_name_1
P10_product_name_2
P10_product_name_3
где "10", не забудьте поменять на номер вашей страницы, а "product_name_1" произвольное название
Javl
select p.product_id,
p.product_name,
p.product_description,
p.category,
decode(p.product_avail, 'Y','Yes','N','No') product_avail,
p.list_price,
(select sum(quantity) from demo_order_items where product_id = p.product_id) units,
(select sum(quantity * p.list_price) from demo_order_items where product_id = p.product_id) sales,
(select count(o.customer_id) from demo_orders o, demo_order_items t where o.order_id = t.order_id and t.product_id = p.product_id group by p.product_id) customers,
(select max(o.order_timestamp) od from demo_orders o, demo_order_items i where o.order_id = i.order_id and i.product_id = p.product_id) last_date_sold,
p.product_id img,
apex_util.prepare_url(p_url=>'f?p='||:app_id||':6:'||:app_session||'::::P6_PRODUCT_ID,P6_BRANCH:'||p.product_id||','||3,p_dialog=> 'null') icon_link,
decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
'<img alt="'||apex_escape.html_attribute(p.product_name)||'" title="'||apex_escape.html_attribute(p.product_name)
||'" style="border: 4px solid #CCC; -moz-border-radius: 4px; -webkit-border-radius: 4px;" '
||'src="'||apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id)||'" height="75" width="75" />') detail_img,
decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id))
detail_img_no_style,
tags
from demo_product_info p
where
p.product_name = :P10_product_name_1
and p.product_name = :P10_product_name_2
and p.product_name = :P10_product_name_3


Но такая конструкция не будет работать, или вместо AND используйте OR, или вообще отбор лучше делать не по названию товара, а по типу
20 авг 19, 11:53    [21953245]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
blkangel
Я изначально не понял проблему.
Используйте регион на на SQL запросе, а на PL/SQL Function Body returning SQL Query


Пробовал, функция возвращает одно значение, а их больше, если делать с курсором, то тоже возникает куча вопросов...
20 авг 19, 12:01    [21953262]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
Никита А
Создайте 3 элемента(item) на странице, в которых можно будет выбрать тип товара
P10_product_name_1
P10_product_name_2
P10_product_name_3
где "10", не забудьте поменять на номер вашей страницы, а "product_name_1" произвольное название
Javl
select p.product_id,
p.product_name,
p.product_description,
p.category,
decode(p.product_avail, 'Y','Yes','N','No') product_avail,
p.list_price,
(select sum(quantity) from demo_order_items where product_id = p.product_id) units,
(select sum(quantity * p.list_price) from demo_order_items where product_id = p.product_id) sales,
(select count(o.customer_id) from demo_orders o, demo_order_items t where o.order_id = t.order_id and t.product_id = p.product_id group by p.product_id) customers,
(select max(o.order_timestamp) od from demo_orders o, demo_order_items i where o.order_id = i.order_id and i.product_id = p.product_id) last_date_sold,
p.product_id img,
apex_util.prepare_url(p_url=>'f?p='||:app_id||':6:'||:app_session||'::::P6_PRODUCT_ID,P6_BRANCH:'||p.product_id||','||3,p_dialog=> 'null') icon_link,
decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
'<img alt="'||apex_escape.html_attribute(p.product_name)||'" title="'||apex_escape.html_attribute(p.product_name)
||'" style="border: 4px solid #CCC; -moz-border-radius: 4px; -webkit-border-radius: 4px;" '
||'src="'||apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id)||'" height="75" width="75" />') detail_img,
decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id))
detail_img_no_style,
tags
from demo_product_info p
where
p.product_name = :P10_product_name_1
and p.product_name = :P10_product_name_2
and p.product_name = :P10_product_name_3


Но такая конструкция не будет работать, или вместо AND используйте OR, или вообще отбор лучше делать не по названию товара, а по типу


В том и дело, я описал для упрощения понимания, на самом деле условий больше, по этому OR не вариант
20 авг 19, 12:02    [21953265]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Никита А
Member

Откуда:
Сообщений: 85
Javl


where
p.product_name = Условие1
and p.product_name = Условие2
and p.product_name = Условие3


Используйте оператор IN
p.product_name IN (Условие1, Условие2, Условие3)
20 авг 19, 12:12    [21953283]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
blkangel
Member

Откуда:
Сообщений: 1898
Javl
blkangel
Я изначально не понял проблему.
Используйте регион на на SQL запросе, а на PL/SQL Function Body returning SQL Query


Пробовал, функция возвращает одно значение, а их больше, если делать с курсором, то тоже возникает куча вопросов...


Вам нужно вернуть запрос, обработав все исходные данные со всеми условиями, при чем тут одно значение?
20 авг 19, 12:13    [21953285]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Никита А
Member

Откуда:
Сообщений: 85
Никита А
Javl

where
p.product_name = Условие1
and p.product_name = Условие2
and p.product_name = Условие3


Используйте оператор IN
p.product_name IN (Условие1, Условие2, Условие3)

Только не условие, а значение.
SELECT * FROM имя_таблицы WHERE поле IN (значение1, значение2...)
20 авг 19, 12:16    [21953290]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
blkangel
Javl
пропущено...


Пробовал, функция возвращает одно значение, а их больше, если делать с курсором, то тоже возникает куча вопросов...


Вам нужно вернуть запрос, обработав все исходные данные со всеми условиями, при чем тут одно значение?


Я пробовал, пишу
declare
ID NUMBER(10);
.....
....
BEGIN
даже просто без IF
select......
end;

При сохранении функция вернула 0 и ошибка
20 авг 19, 12:24    [21953303]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
Никита А
Javl

where
p.product_name = Условие1
and p.product_name = Условие2
and p.product_name = Условие3


Используйте оператор IN
p.product_name IN (Условие1, Условие2, Условие3)

Спасибо, про IN забыл, но мне кажется это полностью не поможет мне наверное нужна функция, но не получается ее указать в репорте.
20 авг 19, 12:28    [21953311]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Никита А
Member

Откуда:
Сообщений: 85
Javl,
Если Вам нужно добавить условие в sql, используйте конструкцию CASE.
select case 1 when 1 then 1 end, case 2 when 1 then 1 end from dual;
--     если 1 равен 1 то  1   , если 2 равен 1 то  1
select case when 1 = 1 then 1 end, case  when 2 = 1 then 1 end from dual;
--     если  1 равен 1  то  1    , если    2 равен 1 то  1 
20 авг 19, 12:28    [21953312]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
Чтобы еще больше упростить понимание задачи:
На первой странице 3 поля для выбора, в первом молочка, во втором хлебо-булочные, в третьем вино-водочные.
Пользователь может выбрать:
молоко, черный хлеб, водку,
а может выбрать молоко и сдобную булку, а третье поле пустое.
При отборе в репорт у молока есть 5 изображений, нужно выбрать с определенной датой.


В таком случае все-таки расширенный селект или функция?
20 авг 19, 12:37    [21953323]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
blkangel
Member

Откуда:
Сообщений: 1898
declare
    l_query varchar2(32767);
BEGIN
    l_query:='select ';
    if :P111_XXXX is not null then 
        l_query:=l_query||',name ';
    End if;
    if :P111_YYYY is not null then 
        l_query:=l_query||', value ';
    End if;    
    l_query:=l_query||' from dual';
    return l_query
end;
20 авг 19, 12:39    [21953325]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
blkangel
declare
    l_query varchar2(32767);
BEGIN
    l_query:='select ';
    if :P111_XXXX is not null then 
        l_query:=l_query||',name ';
    End if;
    if :P111_YYYY is not null then 
        l_query:=l_query||', value ';
    End if;    
    l_query:=l_query||' from dual';
    return l_query
end;


Огромное спасибо, попробую, отпишусь!!!!!!!!!!!!
20 авг 19, 12:44    [21953336]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
blkangel
Member

Откуда:
Сообщений: 1898
Javl,
Еще маленький совет, чтобы админ не взгрел, помните про бинды.
20 авг 19, 14:14    [21953469]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
blkangel,

ORA-20999: PL/SQL function body did not return a value.

declare
l_query varchar2(32767);
BEGIN
l_query:='select p.product_id,
p.product_name,
p.product_description,
p.category,
decode(p.product_avail, 'Y','Yes','N','No') product_avail,
p.list_price,
(select sum(quantity) from demo_order_items where product_id = p.product_id) units,
(select sum(quantity * p.list_price) from demo_order_items where product_id = p.product_id) sales,
(select count(o.customer_id) from demo_orders o, demo_order_items t where o.order_id = t.order_id and t.product_id = p.product_id group by p.product_id) customers,
(select max(o.order_timestamp) od from demo_orders o, demo_order_items i where o.order_id = i.order_id and i.product_id = p.product_id) last_date_sold,
p.product_id img,
apex_util.prepare_url(p_url=>'f?p='||:app_id||':6:'||:app_session||'::::P6_PRODUCT_ID,P6_BRANCH:'||p.product_id||','||3,p_dialog=> 'null') icon_link,
decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
'<img alt="'||apex_escape.html_attribute(p.product_name)||'" title="'||apex_escape.html_attribute(p.product_name)
||'" style="border: 4px solid #CCC; -moz-border-radius: 4px; -webkit-border-radius: 4px;" '
||'src="'||apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id)||'" height="75" width="75" />') detail_img,
decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id))
detail_img_no_style,
tags
from demo_product_info p'
if :VOL1 is not null and :VOL2 is not null and :VOL3 is not null then
l_query:=l_query;
End if;
end;

Что неправильно?
20 авг 19, 15:36    [21953560]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
Javl
blkangel,

ORA-20999: PL/SQL function body did not return a value.

declare
l_query varchar2(32767);
BEGIN
l_query:='select p.product_id,
p.product_name,
p.product_description,
p.category,
decode(p.product_avail, 'Y','Yes','N','No') product_avail,
p.list_price,
(select sum(quantity) from demo_order_items where product_id = p.product_id) units,
(select sum(quantity * p.list_price) from demo_order_items where product_id = p.product_id) sales,
(select count(o.customer_id) from demo_orders o, demo_order_items t where o.order_id = t.order_id and t.product_id = p.product_id group by p.product_id) customers,
(select max(o.order_timestamp) od from demo_orders o, demo_order_items i where o.order_id = i.order_id and i.product_id = p.product_id) last_date_sold,
p.product_id img,
apex_util.prepare_url(p_url=>'f?p='||:app_id||':6:'||:app_session||'::::P6_PRODUCT_ID,P6_BRANCH:'||p.product_id||','||3,p_dialog=> 'null') icon_link,
decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
'<img alt="'||apex_escape.html_attribute(p.product_name)||'" title="'||apex_escape.html_attribute(p.product_name)
||'" style="border: 4px solid #CCC; -moz-border-radius: 4px; -webkit-border-radius: 4px;" '
||'src="'||apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id)||'" height="75" width="75" />') detail_img,
decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id))
detail_img_no_style,
tags
from demo_product_info p'
if :VOL1 is not null and :VOL2 is not null and :VOL3 is not null then
l_query:=l_query;
End if;
end;

Что неправильно?


С предыдущим постом разобрался, сейчас ругается на строку где select

l_query:='select ';

ORA-20999: Parsing returned query results in "ORA-20999: Failed to parse SQL query! <p>ORA-06550: line 4, column 6: ORA-00907: missing right parenthesis</p>".
20 авг 19, 16:32    [21953632]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
blkangel
Member

Откуда:
Сообщений: 1898
Экранировать кто будет, а return где?

declare
    l_query varchar2(32767);
BEGIN
l_query:=q'[select p.product_id,
    p.product_name,
    p.product_description,
    p.category,
    decode(p.product_avail, 'Y','Yes','N','No') product_avail,
    p.list_price,
    (select sum(quantity) from demo_order_items where product_id = p.product_id) units,
    (select sum(quantity * p.list_price) from demo_order_items where product_id = p.product_id) sales,
    (select count(o.customer_id) from demo_orders o, demo_order_items t where o.order_id = t.order_id and t.product_id = p.product_id group by p.product_id) customers,
    (select max(o.order_timestamp) od from demo_orders o, demo_order_items i where o.order_id = i.order_id and i.product_id = p.product_id) last_date_sold,
    p.product_id img,
    apex_util.prepare_url(p_url=>'f?p='||:app_id||':6:'||:app_session||'::::P6_PRODUCT_ID,P6_BRANCH:'||p.product_id||','||3,p_dialog=> 'null') icon_link,
    decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
    '<img alt="'||apex_escape.html_attribute(p.product_name)||'" title="'||apex_escape.html_attribute(p.product_name)
    ||'" style="border: 4px solid #CCC; -moz-border-radius: 4px; -webkit-border-radius: 4px;" '
    ||'src="'||apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id)||'" height="75" width="75" />') detail_img,
    decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
    apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id))
    detail_img_no_style,
    tags
    from demo_product_info p]';
    if :VOL1 is not null and :VOL2 is not null and :VOL3 is not null then 
        l_query:=l_query;
    End if;
    return l_query;
end;
/
20 авг 19, 16:48    [21953655]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
blkangel
Экранировать кто будет, а return где?

declare
    l_query varchar2(32767);
BEGIN
l_query:=q'[select p.product_id,
    p.product_name,
    p.product_description,
    p.category,
    decode(p.product_avail, 'Y','Yes','N','No') product_avail,
    p.list_price,
    (select sum(quantity) from demo_order_items where product_id = p.product_id) units,
    (select sum(quantity * p.list_price) from demo_order_items where product_id = p.product_id) sales,
    (select count(o.customer_id) from demo_orders o, demo_order_items t where o.order_id = t.order_id and t.product_id = p.product_id group by p.product_id) customers,
    (select max(o.order_timestamp) od from demo_orders o, demo_order_items i where o.order_id = i.order_id and i.product_id = p.product_id) last_date_sold,
    p.product_id img,
    apex_util.prepare_url(p_url=>'f?p='||:app_id||':6:'||:app_session||'::::P6_PRODUCT_ID,P6_BRANCH:'||p.product_id||','||3,p_dialog=> 'null') icon_link,
    decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
    '<img alt="'||apex_escape.html_attribute(p.product_name)||'" title="'||apex_escape.html_attribute(p.product_name)
    ||'" style="border: 4px solid #CCC; -moz-border-radius: 4px; -webkit-border-radius: 4px;" '
    ||'src="'||apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id)||'" height="75" width="75" />') detail_img,
    decode(nvl(dbms_lob.getlength(p.product_image),0),0,null,
    apex_util.get_blob_file_src('P6_PRODUCT_IMAGE',p.product_id))
    detail_img_no_style,
    tags
    from demo_product_info p]';
    if :VOL1 is not null and :VOL2 is not null and :VOL3 is not null then 
        l_query:=l_query;
    End if;
    return l_query;
end;
/


Спасибо огромное, очень помогли!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

P.s. Правильно ли я понял, что для каждого варианта будет

declare
l_query varchar2(32767);
l_query1 varchar2(32767);
l_query2 varchar2(32767);

и т.д.?
20 авг 19, 17:39    [21953699]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
Спасибо, уже разобрался!
21 авг 19, 07:58    [21953941]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
Javl
Member

Откуда:
Сообщений: 189
blkangel,
К сожаления не нашел как на форуме написать личное сообщение...


Хотел бы еще раз поблагодарить за подсказки, реально, очень сильно помогли!!!!!
22 авг 19, 08:42    [21955035]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите правильный путь для приложения Apex!  [new]
blkangel
Member

Откуда:
Сообщений: 1898
Javl,

Это основы апекса, надо бы хотя бы для чайников книжечку почитать.

P.S. В профиле есть почта.
23 авг 19, 09:10    [21956189]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle APEX Ответить