我目前正在学习顶点,但卡住了。 我正在使用Oracle apex 4.2。我的应用包含2个报告。首先,我选择了一些复选框,然后单击按钮,该按钮用一些js代码激活DA,并使用带有AJAX回调的apex.server.process,就像在link中一样。
接下来,“按需”过程启动PL / SQL过程(我知道没有理由这样做,但我是为了学习目的),它处理检查值并将它们连接成一个clob,然后将其添加到集合中。 因此,每次单击按钮时,都会添加1个新clob。
我的第二个报告只是从集合中读取所有clobs,我想在每次单击按钮后不刷新所有页面内容时刷新它。我添加了一个带有True Action:Refresh的DA,但它适用于延迟。当我第一次单击它时 - 没有任何反应,在第二次单击时,先前生成的clob显示在报告区域中,依此类推。我想我需要将集合值提交到会话状态,但我没有任何内容可以添加到报告“要提交的页面项”选项。
答案 0 :(得分:0)
您会看到“过时”数据的唯一原因是您使用ajax调用来更新集合。这是异步的! 类似地,刷新也是异步的。这些行动不会等待彼此完成。
它可以像这样:
要解决此问题,您必须在apex.server.process
调用中添加一些内容:只有在回调完成后才能刷新基于集合的报表。
首先:在基于集合的报告中添加静态报告ID。通过编辑它来做到这一点。提供静态id允许通过选择器更容易地选择区域。
apex.server.process('Process Checked Rows', {f01: arr_f01}).done(function(){
//do something when the callback has finished
//like triggering the refresh event on the report required
apex.jQuery("#your_report_static_id_goes_here").trigger("apexrefresh");
});
现在,只有在您确定已将复选框处理到集合中时,才会刷新报告。
正如我在评论中指出的那样,使用clob将选定的ID保持在一起根本没有意义。除了纯粹的实验之外,没有任何理由可以做到。老实说,如果你想试验CLOB,那么在其他地方花的时间会更好 集合意味着在Apex会话的背景下替换全球临时表。像使用表一样使用它们。只需将所选行的ID插入集合即可。
FOR i IN 1..apex_application.g_f01.count
LOOP
apex_collection.add_member
( p_collection_name => 'CHECKBOX_COLLECTION'
, p_n001 => apex_application.g_f01(i) --NOTE: using N001 here to store a numerical ID
);
END LOOP;
如果您只想要uniques,那么您可以通过在集合上添加select来在此处执行此操作,或者在用于循环或选择集合的查询中添加distinct。
FOR i IN 1..apex_application.g_f01.count
LOOP
DECLARE
l_exists BINARY_INTEGER;
BEGIN
SELECT 1
INTO l_exists
FROM apex_collections
WHERE collection_name = 'CHECKBOX_COLLECTION'
AND n001 = apex_application.g_f01(i);
EXCEPTION WHEN no_data_found THEN
apex_collection.add_member
( p_collection_name => 'CHECKBOX_COLLECTION'
, p_n001 => apex_application.g_f01(i) --NOTE: using N001 here to store a numerical ID
);
END;
END LOOP;
然后,您可以循环遍历此集合中的记录,或使用它来限制其他查询中的行(例如,另一个报告)。
SELECT n001 selected_id
FROM apex_collections
WHERE collection_name = 'CHECKBOX_COLLECTION';