根据集合刷新经典报告

时间:2016-08-17 06:48:40

标签: oracle oracle-apex

我目前正在学习顶点,但卡住了。 我正在使用Oracle apex 4.2。我的应用包含2个报告。首先,我选择了一些复选框,然后单击按钮,该按钮用一些js代码激活DA,并使用带有AJAX回调的apex.server.process,就像在link中一样。

接下来,“按需”过程启动PL / SQL过程(我知道没有理由这样做,但我是为了学习目的),它处理检查值并将它们连接成一个clob,然后将其添加到集合中。 因此,每次单击按钮时,都会添加1个新clob。

我的第二个报告只是从集合中读取所有clobs,我想在每次单击按钮后不刷新所有页面内容时刷新它。我添加了一个带有True Action:Refresh的DA,但它适用于延迟。当我第一次单击它时 - 没有任何反应,在第二次单击时,先前生成的clob显示在报告区域中,依此类推。我想我需要将集合值提交到会话状态,但我没有任何内容可以添加到报告“要提交的页面项”选项。

1 个答案:

答案 0 :(得分:0)

未看到“最新”数据

您会看到“过时”数据的唯一原因是您使用ajax调用来更新集合。这是异步的! 类似地,刷新也是异步的。这些行动不会等待彼此完成。

它可以像这样:

  • 收集复选框并将它们发送到某个进程,该进程的某个位置将返回一些
  • 有时,这取决于,ajax调用足够快,可以在区域刷新发生之前完成
  • 刷新区域
  • 其他时候,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将选定的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';