Гость
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ? / 15 сообщений из 15, страница 1 из 1
28.07.2011, 18:01
    #37371482
Rssla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
Всем привет!

Нужна помощь зала - я уже третий день бьюсь над проблемой. Мне нужно сделать "простенькое приложение" на APEXе, чтобы позволить соседнему отделу загружать в базу их данные. Я не специалист в АРЕХе ни разу, но задачку решить нужно.

В обещем, есть лист заказчиков на странице 1. По клику на имя заказчика попадаешь в Tabular Form в которой есть список критериев и для каждого критерия есть несколько параметров, которые должны отмечатья при помощи check box. То есть такая большая таблица из чек боксов. Для снятия данных с чек боксов используются APEX_APPLICATION.G_F01(i) ... APEX_APPLICATION.G_F05(i), куда записыватся SOME_ID.

apex_item.checkbox(1,"SOME_ID"), apex_item.checkbox(2,"SOME_ID") и т.д.

Потом по Submit выполняется

LOOP for i in 1..APEX_APPLICATION.G_F01.count
update #OWNER#.<table_name> set <fileds>
WHERE "SOME_ID" = APEX_APPLICATION.G_F01(i)


Все прекрасно работает, но только ОДИН раз. То есть для одного заказчика все заполняется ожидаемо, но когда пытаешься заполнить эту таблицу для второго заказчика, записываются данные от первого плюс данные от второго. То есть после выхода со страницы массивы APEX_APPLICATION.G_F01(i) не обнуляются. Хуже того, они не обнуляются даже при выходе из приложения.

Как их обнулить принудительно? Во всех примерах этот вопрос почему-то не рассматривается вообще, все кончается на заполнении данными базы (или удалении из базы). А вот как сбросить то, что было уже заполнено? Просто так в лоб APEX_APPLICATION.G_F01(i) := NULL; увы не работает, а как сделать правильно, я не могу найти.

Спасибо за ответы.
...
Рейтинг: 0 / 0
28.07.2011, 18:13
    #37371524
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
Rssla,

0. Версия APEX.
1. Запрос, которым заполняется табличная форма.
2. Пример на apex.oracle.com был бы прекрасным дополнением.
3. Это не по сабжу, но Вы в курсе об особенностях работы с флажками (checkbox) в табличных формах? Или у Вас количество циклов равно количеству столбцов с флажками?
...
Рейтинг: 0 / 0
28.07.2011, 21:13
    #37371767
SvUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
suPPLerЭто не по сабжу, но Вы в курсе об особенностях работы с флажками (checkbox) в табличных формах? Или у Вас количество циклов равно количеству столбцов с флажками?
Видимо, так и есть
suPPLerLOOP for i in 1..APEX_APPLICATION.G_F01.count
update #OWNER#.<table_name> set <fileds>
WHERE "SOME_ID" = APEX_APPLICATION.G_F01(i)

Ошибка здесь, в чекбоксах хрянятся только список выделенных значений,
в то время как во всех остальных коллекциях хранится весь список.
Т.е. фильтрует то он правильно, а сопоставить коллекции не может.
Для этого конкретно в чекбоксах нужно хранить не SOME_ID, а номер строки (rownum +осторожно с сортировками).
Пример:

DECLARE
p_delete_cnt number := 0;
begin
-- всегда пробегаются только выделенные checkboxes
-- apex_application.g_f30(i) - номер выделенной строки / checkbox
for i in 1 .. apex_application.g_f30.count loop

-- все кроме новой добавленной строки
if apex_application.g_f33( apex_application.g_f30(i) ) is not null then

-- удаляем
delete from mytable
where id = apex_application.g_f31( apex_application.g_f30(i) );

p_delete_cnt := p_delete_cnt + 1;
end if;
end loop;
...
Рейтинг: 0 / 0
28.07.2011, 21:20
    #37371775
SvUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
Вот еще пример
-- всегда пробегаются только выделенные checkboxes
for i in 1 .. apex_application.g_f01.count loop

-- доп условия
if apex_application.g_f01(i) is not null
and apex_application.g_f20( apex_application.g_f01(i) ) is not null then

insert into mytable( ... )
values( :P1_MY_ID,
apex_application.g_f05( apex_application.g_f01(i) ),
apex_application.g_f10( apex_application.g_f01(i) ),
apex_application.g_f15( apex_application.g_f01(i) ),
apex_application.g_f16( apex_application.g_f01(i) ),
apex_application.g_f19( apex_application.g_f01(i) ),
apex_application.g_f20( apex_application.g_f01(i) ) );
end if;
end loop;
Там с update всё аналогично, лень искать
...
Рейтинг: 0 / 0
29.07.2011, 12:09
    #37372459
Rssla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
suPPLer,

0.версия 3.2

1. SELECT ......
"OBL_ID", ob.name obligation_name,
-- это ID критерия, который фактически является номером строки (и его название)

apex_item.checkbox(1,m."ID", DECODE(m."REP_REQUIRED", 1, 'CHECKED',NULL)) r_req,
apex_item.checkbox(2,m."ID", DECODE(m."CUST_OPERATIONAL", 1, 'CHECKED',NULL)) cust_op,
.....
where
....
m.cust_id = :P4_CUSTOMERS

2.какой пример на apex.oracle.com ?

3. очень может быть, что не в курсе :-) да, у меня количество циклов равно количеству столбцов с флажками, а для каждого столбика своя G_F0. Это не правильно? А что делать вместо этого?

Тот факт, что записываются только выделенные флажки, как раз не проблема. Проблема в том, например, что эти самые G_F0 как-то странно себя ведут.
Например, если я выделяют ОДИН флажок во втором столбике (соответствует G_F02), то почему-то записываются данные для ВСЕХ строк (если вызвать эту страничку для это кастомера еще раз, то весь столбик будет выделен). Причем этот эффект почему-то только для G_F02, для других столбиков флажки заполняются случайным образом. Я обсолютно не понимаю поведение этих переменных, я пыталась поискать документацию о том, как это все работает, но что-то как-то пусто.

@SvUser
то самое SOME_ID фактически соответствует номеру строки, это номер критерия. но я не знаю, как будут эти криетрии отсортированы, так что, полагаю, использование этого ай ди надежнее, чем просто номер строки.
...
Рейтинг: 0 / 0
29.07.2011, 12:52
    #37372618
SvUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
Rsslaто самое SOME_ID фактически соответствует номеру строки, это номер критерия. но я не знаю, как будут эти криетрии отсортированы, так что, полагаю, использование этого ай ди надежнее, чем просто номер строки.
В том-то и суть. т.е. у вас допустим 3 строки, и 3 столбца, hidden + 2 checkbox, следующим образом заполнены:
Код: plaintext
1.
2.
 1  x
 2     z
 3  y

тогда коллекции будут:
g_f01: 1, 2, 3
g_f02: x, y
g_f03: z

т.е. ваши checkbox-ы нельзя сопоставлять в одном апдейте,
Код: plaintext
1.
update #OWNER#.<table_name> set <fileds> 
 WHERE "SOME_ID" = APEX_APPLICATION.G_F01(i)
для каждого должен быть отдельный цикл, где по значению вычисляется номер строки, с помощью которого можно сопоставить коллекции.

Обратите внимание как должен генерироваться html, если проставить в checkbox правильный rownum (с учетом сортировок):
<input type="checkbox" name="f30" value="1" id="f30_0001" />
<input type="checkbox" name="f30" value="2" id="f30_0002" />
<input type="checkbox" name="f30" value="3" id="f30_0003" />
Проверьте, что у вас также, нумерация идёт по порядку.
...
Рейтинг: 0 / 0
29.07.2011, 12:58
    #37372656
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
Rssla1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT ......
"OBL_ID", ob.name obligation_name,
-- это ID критерия, который фактически является номером строки (и его название)

 apex_item.checkbox( 1 ,m."ID", DECODE(m."REP_REQUIRED",  1 , 'CHECKED',NULL)) r_req,
apex_item.checkbox( 2 ,m."ID", DECODE(m."CUST_OPERATIONAL",  1 , 'CHECKED',NULL)) cust_op,
.....
where
....
m.cust_id = :P4_CUSTOMERS


Как раз интересны FROM и WHERE полностью. Если не можете показать, чтобы не разглашать лишнего, создайте подобные таблицы T1, T2 и т.п. Попробуйте поработать с ними. Эффект непонятной работы коллекций остался?

Rssla2.какой пример на apex.oracle.com ?

http://apex.oracle.com

Регистрируетесь, получаете доступ, создаёте таблицу, приложение, страницу, которая работает с коллекциями. Проблема повторяется - даёте сюда данные учётки, чтобы можно было посмотреть, как конкретно Вы работаете с apex_item и коллекциями apex_application.

Пока есть варианты:

0. У Вас ошибка в одном из процессов, который работает с коллекциями.
1. У Вас ошибка в запросе.
2. На странице есть JS-код, который творит подобное безобразие.
3. Никому не встретившийся за время работы с 3.2 баг. :)
...
Рейтинг: 0 / 0
29.07.2011, 13:04
    #37372677
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
SvUser,

Rsslaу меня количество циклов равно количеству столбцов с флажками, а для каждого столбика своя G_F0.

Если я правильно расшифровал, то у ТС для N столбцов с флажками в процессе выполняется N циклов по соответствующим коллекциям, в каждом из которых изменяются строки, для которых выделен конкретный флажок. Так что проблемы сжатого хранения отмеченных флажков в APPLICATION_ITEM.g_f0X её не касаются.
...
Рейтинг: 0 / 0
29.07.2011, 13:10
    #37372700
SvUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
В любом случае нужно проверить исходные html, что нумерация нигде не сбита и идёт по-порядку.
Rsslaэто номер критерия. но я не знаю, как будут эти криетрии отсортированы
Да и еще, вырубите стандартную сортировку, если включена по столбцам, она не совсем совместима с apex_item, её нужно делать руками.
...
Рейтинг: 0 / 0
29.07.2011, 13:19
    #37372727
SvUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
suPPLerЕсли я правильно расшифровал, то у ТС для N столбцов с флажками в процессе выполняется N циклов по соответствующим коллекциям, в каждом из которых изменяются строки, для которых выделен конкретный флажок. Так что проблемы сжатого хранения отмеченных флажков в APPLICATION_ITEM.g_f0X её не касаются.
а как же:
LOOP for i in 1..APEX_APPLICATION.G_F01.count
update #OWNER#.<table_name> set <fileds>
WHERE "SOME_ID" = APEX_APPLICATION.G_F01(i)
Если APEX_APPLICATION.G_F01 - checkbox, то откуда возьмутся сопоставленные ему set <fileds> ?

В баг, которого ни у кого не было не верю, Rssla, если еще не нашли ошибку,
привидите пожалуйста этот кусок кода полностью,
ошибка скорее всего здесь.
...
Рейтинг: 0 / 0
29.07.2011, 13:36
    #37372767
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
SvUserа как же:
LOOP for i in 1..APEX_APPLICATION.G_F01.count
update #OWNER#.<table_name> set <fileds>
WHERE "SOME_ID" = APEX_APPLICATION.G_F01(i)
Если APEX_APPLICATION.G_F01 - checkbox, то откуда возьмутся сопоставленные ему set <fileds> ?

Да очень просто, глядя на уже приведённый ТС код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
for i in  1 ..APEX_APPLICATION.G_F01.count 
LOOP 
update #OWNER#.<table_name> set "REP_REQUIRED" =  1 
 WHERE "SOME_ID" = APEX_APPLICATION.G_F01(i);
end loop;

for i in  1 ..APEX_APPLICATION.G_F02.count 
LOOP 
update #OWNER#.<table_name> set "CUST_OPERATIONAL" =  1 
 WHERE "SOME_ID" = APEX_APPLICATION.G_F02(i);
end loop;

/* И так далее */

То есть, одна строка таблицы обновится столько раз, сколько для неё отмечено флажков, завязанных на соответствующие поля.
...
Рейтинг: 0 / 0
29.07.2011, 13:51
    #37372814
SvUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
suPPLerSvUserа как же:
пропущено...

Если APEX_APPLICATION.G_F01 - checkbox, то откуда возьмутся сопоставленные ему set <fileds> ?

Да очень просто, глядя на уже приведённый ТС код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
for i in  1 ..APEX_APPLICATION.G_F01.count 
LOOP 
update #OWNER#.<table_name> set "REP_REQUIRED" =  1 
 WHERE "SOME_ID" = APEX_APPLICATION.G_F01(i);
end loop;

for i in  1 ..APEX_APPLICATION.G_F02.count 
LOOP 
update #OWNER#.<table_name> set "CUST_OPERATIONAL" =  1 
 WHERE "SOME_ID" = APEX_APPLICATION.G_F02(i);
end loop;

/* И так далее */

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

Даже так ошибка может быть здесь,
если checkbox снимаем, APEX_APPLICATION.G_F01(i) его не содержит, REP_REQUIRED старое значение NULL не примет.
...
Рейтинг: 0 / 0
29.07.2011, 15:02
    #37372979
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
SvUserДаже так ошибка может быть здесь

Вывод правильный, но пока что вся тема в стадии "может быть".
...
Рейтинг: 0 / 0
29.07.2011, 18:25
    #37373490
SvUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
Rssla,

ждём подробностей :)
...
Рейтинг: 0 / 0
30.07.2011, 16:55
    #37373961
SvUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
с checkbox-ами действительно погорячился, по представленным огрызкам рано было делать выводы.

Rssla,

т.е. от вас требуется:

1. Полный код SQL запроса (можете заменить названия на схематические, но запрос нужен полный)
2. Полный код процесса обработки по Submit.
3. Вырубите стандартную сортировку по столбцам (на всякий случай, с checkbox'ами может и работает, зато с некоторыми другими элементами нет)
4. Если используется какой-то дополнительный код - вырубить.
5. Проверить триггеры в m и уникальность m."ID".

т.е. либо табличная форма неправильно выводится, либо неправильно обрабатывается, либо ошибка в sql/триггерах.
...
Рейтинг: 0 / 0
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ? / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]