2011-09-20 96 views
0

我使用的Oracle APEX和具有以下apex_item.checkbox调用标准SQL报告,即:维护复选框状态错误后

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 
) 

我的问题是,除了有本报告中的一个内我页面中,我还在页面上有必填字段的其他项目,因此当用户在基于上述SQL的10个复选框中点击3个并提交页面时,用户会看到一个错误,指示页面是必需的。

现在,当用户呈现这个错误,3出10个复选框已检查现在选中。

是否有人可以帮助维修器材复选框持久性/基于上述情况,因为我不希望用户重新检查他们已经查过记录做状态的一种手段。

如果可能的话,从Oracle APEX意味着如果可能的话希望得到援助。如果有jQuery的意思,也会从这个角度欣赏帮助。

谢谢。

回答

2

我发现了一些办法做到这一点,与顶点和jQuery的混合:通过apex_collections

  • 得到复选框的状态(通过apex_application),并将其储存resfresh后: *在提交过程:通过ajax回调获取值,并用一些javascript代码重新设置它们。

我用你的查询(但是省略了where子句)在emp的基础上做了一个报告(报告1)。 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的inputelements设置的值(动态创建的复选框,这是基于被给予apex_item.checkbox的ID),并且其中所述值等于该值的我们已经被存储。通过箱子被检查!

在这里希望我没有过分:)

+0

嘿汤姆,只是首先要说的是,你的反应和非常详细的和有益的反应是非常赞赏,也解决了我的问题。所以谢谢。如果我能让你高分,我会的。希望您能再次帮助我解决其他Apex问题。再次感谢。 – tonyf

+0

谢谢!我自己只在Apex工作了2个月,事情真的开始越来越多。我已经经历了一些看似愚蠢简单的问题的强烈搜索,并会很乐意帮助我可以在任何地方:) – Tom