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

Нужна помощь зала - я уже третий день бьюсь над проблемой. Мне нужно сделать "простенькое приложение" на 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
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37371524
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rssla,

0. Версия APEX.
1. Запрос, которым заполняется табличная форма.
2. Пример на apex.oracle.com был бы прекрасным дополнением.
3. Это не по сабжу, но Вы в курсе об особенностях работы с флажками (checkbox) в табличных формах? Или у Вас количество циклов равно количеству столбцов с флажками?
...
Рейтинг: 0 / 0
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37371767
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37371775
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот еще пример
-- всегда пробегаются только выделенные 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
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37372459
Rssla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37372618
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37372656
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37372677
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvUser,

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

Если я правильно расшифровал, то у ТС для N столбцов с флажками в процессе выполняется N циклов по соответствующим коллекциям, в каждом из которых изменяются строки, для которых выделен конкретный флажок. Так что проблемы сжатого хранения отмеченных флажков в APPLICATION_ITEM.g_f0X её не касаются.
...
Рейтинг: 0 / 0
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37372700
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В любом случае нужно проверить исходные html, что нумерация нигде не сбита и идёт по-порядку.
Rsslaэто номер критерия. но я не знаю, как будут эти криетрии отсортированы
Да и еще, вырубите стандартную сортировку, если включена по столбцам, она не совсем совместима с apex_item, её нужно делать руками.
...
Рейтинг: 0 / 0
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37372727
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37372767
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37372814
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как обнулить глобаные переменные APEX_APPLICATION.G_F0X ?
    #37372979
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvUserДаже так ошибка может быть здесь

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

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

Rssla,

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

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

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


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