刷新基于集合的经典报表
Refresh a Classic Report based on a collection
我目前正在学习 apex,但卡住了。
我正在使用 Oracle apex 4.2。我的应用程序包含 2 份报告。首先,我选择了一些复选框并单击按钮,该按钮使用一些 js 代码触发 DA,并使用 apex.server.process 和 AJAX 回调,就像在这个 link.
中一样
接下来 "On Demand" 进程启动 PL/SQL 过程(我知道没有理由这样做,但我这样做是为了学习目的)处理检查的值并将它们连接成一个 clob,这是然后被添加到集合中。
所以每次我点击按钮时,都会添加 1 个新的 clob。
我的第二份报告只是从集合中读取所有 clob,我想在每次单击按钮后刷新它而不提交所有页面内容。我添加了带有 True Action: Refresh 的 DA,但它会延迟工作。当我第一次单击它时 - 没有任何反应,第二次单击之前生成的 clob 出现在报告区域中,依此类推。我想我需要将集合值提交到会话状态,但我没有要添加到报告 "Page Items to Submit" 选项的内容。
没有看到“最新”数据
您会看到“过时”数据的唯一原因是您使用 ajax 调用来更新集合。它是异步的!
类似的,刷新也是异步的。这些动作不会等待彼此完成。
它可以像这样:
- 收集复选框并将它们发送到某个进程,该进程会在某个地方return给我一些东西
- 有时,这取决于,ajax 调用足够快,可以在区域刷新发生之前完成
- 刷新区域
- 其他时候,ajax调用时间稍长,刷新已经发生
要解决此问题,您必须在 apex.server.process
调用中添加一些内容:基于集合的报告的刷新应该仅在回调完成时发生。
首先:将静态报告 ID 添加到基于集合的报告中。通过编辑它来做到这一点。提供静态 ID 可以通过 selector.
更轻松地 selection 区域
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 将 selected ID 放在一起毫无意义。除了纯粹的实验之外,没有任何理由支持它。老实说,如果您想尝试 CLOB,最好把时间花在其他地方。
集合旨在成为 Apex 会话上下文中的全局临时 Table 替换。像使用 table 一样使用它们。只需将 selected 行的 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;
如果您只想拥有唯一性,那么您可以在此处通过在集合上添加 select 来实现,或者在用于循环的查询中添加一个 distinct 或 select 在集合上。
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';
我目前正在学习 apex,但卡住了。 我正在使用 Oracle apex 4.2。我的应用程序包含 2 份报告。首先,我选择了一些复选框并单击按钮,该按钮使用一些 js 代码触发 DA,并使用 apex.server.process 和 AJAX 回调,就像在这个 link.
中一样接下来 "On Demand" 进程启动 PL/SQL 过程(我知道没有理由这样做,但我这样做是为了学习目的)处理检查的值并将它们连接成一个 clob,这是然后被添加到集合中。 所以每次我点击按钮时,都会添加 1 个新的 clob。
我的第二份报告只是从集合中读取所有 clob,我想在每次单击按钮后刷新它而不提交所有页面内容。我添加了带有 True Action: Refresh 的 DA,但它会延迟工作。当我第一次单击它时 - 没有任何反应,第二次单击之前生成的 clob 出现在报告区域中,依此类推。我想我需要将集合值提交到会话状态,但我没有要添加到报告 "Page Items to Submit" 选项的内容。
没有看到“最新”数据
您会看到“过时”数据的唯一原因是您使用 ajax 调用来更新集合。它是异步的! 类似的,刷新也是异步的。这些动作不会等待彼此完成。
它可以像这样:
- 收集复选框并将它们发送到某个进程,该进程会在某个地方return给我一些东西
- 有时,这取决于,ajax 调用足够快,可以在区域刷新发生之前完成
- 刷新区域
- 其他时候,ajax调用时间稍长,刷新已经发生
要解决此问题,您必须在 apex.server.process
调用中添加一些内容:基于集合的报告的刷新应该仅在回调完成时发生。
首先:将静态报告 ID 添加到基于集合的报告中。通过编辑它来做到这一点。提供静态 ID 可以通过 selector.
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 将 selected ID 放在一起毫无意义。除了纯粹的实验之外,没有任何理由支持它。老实说,如果您想尝试 CLOB,最好把时间花在其他地方。
集合旨在成为 Apex 会话上下文中的全局临时 Table 替换。像使用 table 一样使用它们。只需将 selected 行的 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;
如果您只想拥有唯一性,那么您可以在此处通过在集合上添加 select 来实现,或者在用于循环的查询中添加一个 distinct 或 select 在集合上。
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';