вторник, 24 апреля 2007 г.

Особенности работы CHECKBOX в APEX.

Хочу немного рассказать об особенностях работы с CheckBox'ом в отчетах Oracle Application Express, так как для меня логика работы не сразу оказалась очевидной (может быть просто плохо читал документацию :).
Добавить в отчет сам CheckBox очень легко - необходимо просто вызвать функцию APEX_ITEM.CHECKBOX в запросе, на основе которого строится отчет. Например:


Select object_name, object_id, object_type,
created, apex_item.checkbox(10, object_id)
From User_Objects;

Спецификацию данного метода можно посмотреть в документации. В основном, используются первые 3 параметра:

* p_idx - идентификатор глобальной переменной в APEX_APPLICATION
* p_value - значение присваиваемое CheckBox'у (из-за которого-то у меня и возникла путанница)
* p_attributes - HTML атрибуты.

Основная задача, при работе с CheckBox'ом - это обойти их все и получить список либо отмеченных, либо не отмеченных. Вот тут и начинаются вопросы...

Доступ к значению контрола можно получить через список глобальных переменных пакета APEX_APPLICATION. То есть, для запроса, приведенного выше, значение получается через переменную APEX_APPLICATION.g_f10.

Логично было бы предположить, что выбрать все отмеченные чек-боксы можно так:

Begin
For i In 1 .. APEX_APPLICATION.g_f10.Count Loop
If APEX_APPLICATION.g_f10(i) = 1 Then
....
End If;
End Loop;
End;

Ан нет... Чтобы получить все отмеченные чек-боксы, необходим цикл немного проще:

Begin
For i In 1 .. APEX_APPLICATION.g_f10.Count Loop
....
End Loop;
End;

То есть, APEX_APPLICATION.g_f10 содержит ТОЛЬКО ОТМЕЧЕННЫЕ чек-боксы!
Кроме того, параметр p_value содержит не состояние чек-бокса, а именно значение.
За состояние чек-бокса отвечает третий параметр - p_attributes. То есть, для того, чтобы контрол был включен необходимо задавать не "p_value = 1", а "p_attributes='CHECKED' ", например:


Select object_name, object_id,
object_type, created,
apex_item.checkbox(10, object_id,
DECODE( mod(object_id, 10),
1,
'CHECKED',
null
)
)
From User_Objects;


Вот так...

5 комментариев:

Анонимный комментирует...

Я что, дальтоник, не вижу в коде:

Select object_name, object_id, object_type,
created, apex_item.checkbox(10, object_id)
From User_Objects;

первые 3 параметра:

* p_idx
* p_value
* p_attributes ?!?

Я там почему-то вижу такой текст:
object_name, object_id, object_type,
created, apex_item.checkbox(10, object_id)

:(

alexander chistyakov комментирует...

Анонимный, в документации описано много больше параметров.

Cool_assassin комментирует...

Вот нигде не написано как забрать p_value из checkbox-а... А как его создать везде можно прочитать. Но за то что открыли немного глаза на это спасибо )

Cool_assassin комментирует...

Как оказалось моя проблема в чтении значения из чекбокса была в том что я пытался его прочитать из javascript. Попробовав все сделать через pl/sql процесс все успешно выполнилось. Еще раз спасибо за статью )

Максим Д. комментирует...

Просто огромный респект автору за статьи подобные ибо в апексе море непонятного мне, а с документацией я дружу плохо т.к. английский на уровне школы))