刷新基于集合的经典报表

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';