Сохранение состояния флажка после ошибки - PullRequest
1 голос
/ 20 сентября 2011

Я использую Oracle ApEx и у меня есть стандартный отчет SQL со следующим вызовом apex_item.checkbox, то есть:

select 
apex_item.checkbox(1, empno) cbox, 
"EMPNO",
"ENAME",
"JOB",
"MGR",
"HIREDATE",
"SAL",
"COMM",
"DEPTNO"
from "EMP" 
where 
( 
instr(upper("ENAME"),upper(nvl(:P1_REPORT_SEARCH,"ENAME"))) > 0 or
instr(upper("JOB"),upper(nvl(:P1_REPORT_SEARCH,"JOB"))) > 0 
)

Моя проблема, помимо того, что этот отчет находится на одной из моих страниц, я такжеиметь на странице другие элементы, которые являются обязательными полями, поэтому, когда пользователь нажимает на 3 из 10 флажков на основе вышеуказанного SQL-запроса и отправляет страницу, пользователю выдается сообщение об ошибке, указывающее, что элемент на странице является обязательным.

Теперь, когда пользователю сообщается об этой ошибке, 3 из 10 отмеченных флажков теперь не отмечены.

Могу ли я сохранить постоянство / состояние флажка на основе описанного выше сценария?поскольку я не хочу, чтобы пользователь повторно проверял записи, которые он уже проверял.

Я заинтересован в решении этого вопроса средствами Oracle ApEx, если это возможно.Однако подход jQuery также может работать.

1 Ответ

3 голосов
/ 22 сентября 2011

я нашел способ сделать это, со смесью апекса и jquery:

  • В процессе отправки: получите состояние флажков (через apex_application ) и сохраните их через apex_collections

  • После обновления: получить значения с помощью обратного вызова ajax и установить их заново с помощью некоторого кода JavaScript.

Я сделал отчет (Отчет 1), основанный на emp, с вашим запросом (но пропустил предложение where). Page overview

Мой процесс отправки, когда я получаю отмеченные флажки (через apex_application вы получаете только отмеченные флажки!) И храните их в коллекции. Эта коллекция создается или очищается при каждой отправке. Я оставил отладку сообщения, так что вы можете отслеживать их. Да, и сохраненное значение равно empno, так как вы основали элемент флажка на этом столбце, а не 1 или 0.

apex_debug_message.log_message('on submit point');
APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION('COLL_REPORT1');

FOR i IN 1..APEX_APPLICATION.G_F01.COUNT LOOP
apex_debug_message.log_message('loop chk: '||i||': '||TO_NUMBER(APEX_APPLICATION.G_F01(i)));
   APEX_COLLECTION.ADD_MEMBER(p_collection_name => 'COLL_REPORT1', 
                              p_n001 => TO_NUMBER(APEX_APPLICATION.G_F01(i))
                              );
END LOOP;

Затем создайте процесс обратного вызова ajax: Здесь я создаю массив json, который просто хранит значения флажков и помогает мне легко разобрать значения после этого. Коллекция усекается после извлечения.

DECLARE
   v_first BOOLEAN := TRUE;
   v_json VARCHAR2(4000);
BEGIN
   v_json := '[';
   FOR r IN (SELECT n001 FROM APEX_collections
              WHERE collection_name = 'COLL_REPORT1')
   LOOP
      apex_debug_message.log_message('stored value: '||r.n001);
      IF NOT v_first THEN
         v_json := v_json ||',';
      ELSE
         v_first := FALSE;
      END IF;
      v_json := v_json || r.n001;
   END LOOP;

   v_json := v_json || ']';

   APEX_COLLECTION.TRUNCATE_COLLECTION('COLL_REPORT1');

   htp.p(v_json);
END;

Затем необходимо извлечь и установить значения, что осуществляется с помощью динамического действия.

Dynamic action details

  • Событие: после обновления
  • Тип выбора: Регион
  • Регион: (регион вашего отчета, мой - Отчет 1)
  • Без условий

код:

   var oDBGet = new htmldb_Get(null, &APP_ID., 'APPLICATION_PROCESS=get_checked_boxes', &APP_PAGE_ID.);
   var arrBoxes = jQuery.parseJSON(oDBGet.get());

   $.each(arrBoxes,
          function( intIndex, objValue ){
             $("input[name='f01'][value='"+objValue+"']").attr("checked","checked");
          });

Этот код просто вызывает обратный вызов ajax и анализирует возвращаемую строку как объект json (который является массивом из-за синтаксиса [value, value, value]). Затем я зацикливаюсь на этом массиве и устанавливаю значения для входных элементов с именем f01 (динамически создаваемые флажки, это основано на идентификаторе, заданном для apex_item.checkbox), и где значение равно значению значения, которое мы сохранили , Через attr флажок проверяется!

Вот надеюсь, что я не переусердствовал :) 1050 *

...