【问题标题】:Trigger a process (SQL update) when leaving an APEX page离开 APEX 页面时触发进程(SQL 更新)
【发布时间】:2013-01-15 15:46:30
【问题描述】:

这是一个非常奇怪的问题,但我想知道当用户离开此特定页面时,是否可以通过单击面包屑、选项卡或返回按钮来触发运行 SQL UPDATE 的进程?

我确实设置了在“返回”按钮上运行的进程;但是我遇到了一个问题:如果她/他点击面包屑或标签怎么办。

我已经在网上搜索并发布这个问题是最后的手段。我想知道是否有人能指出我正确的方向?

更新后的帖子

第 1 页:
包括一个文本字段和一个按钮。用户在文本字段中输入类别并单击按钮进入下一页。该按钮将文本字段中的值传递到第 2 页上的文本字段。

第 2 页:
页面上的两个区域。一个区域包含有关类别的信息 - 上一页中的类别名称、类别描述和类别修订号(这是我想要工作的内容)。第二个区域是一个报告,它提取在类别文本字段中的类别下列出的项目名称和编号。报告上使用“查看”链接来加载所选特定项目的编辑页面。 “查看”链接将“类别名称”(来自类别文本字段)和“项目编号”从报告传递到第 3 页。

第 3 页
使用了两个区域,第一个区域:列出来自第 2 页的项目编号和项目名称(我使用一个简单的查询来检索)。在第二个区域中:报表使用两列:第 1 列中的项目属性列表,以及第 2 列中每个项目属性旁边的文本字段,用于保存可更新的值。 “应用更改”按钮后面有一些 PlSql,可在需要时查找更改和更新。它更新已更改的相关字段,然后将用户带回第 2 页(向用户显示为最初输入的类别列出的项目的页面)。

我无法在第 3 页上的“应用更改”按钮上增加类别修订,因为用户可能会完成对同一类别下的项目的编辑。所以我不知道在哪里可以将每个类别的类别修订增加 1 个。 P.s 如果使用第 3 页上的“应用更改”按钮更改了信息,我已经将每个项目的修订号加 1。

【问题讨论】:

  • 如果这是一个数据输入表单,最好检查一下是否进行了更改并提示用户而不是触发更新?
  • @Tom 我确实找到了一篇关于使用 Javascript 检查更改的博客文章;但是页面只显示信息,页面上没有完成任何编辑。实际上我认为它可能是你的博客。
  • 当用户离开页面(以任何方式)时,为什么您实际上想要触发更新?访问页面是否必须触发一些特别的事情?他们需要以某种方式进行交互吗?为什么,如果没有入口,是否需要运行一些进程?
  • @Tom 抱歉回复延迟。这是因为产品被分类成组。用户搜索返回组中产品列表的类别(第 1 页)(第 2 页)。我想知道一个类别多久更改一次。报告用于列出链接到编辑页面(第 3 页)的产品。一个类别中的许多产品可以一次编辑,这意味着类别修订应该只增加 1,而不是 3(如果编辑了 3 个产品)。希望这是有道理的。
  • 这对如何解释问题有很大的改变:我认为即使用户没有按下 APPLY_CHANGES 按钮(或喜欢);这是@Matthew Moisen 的目标。您的评论似乎表明您想要跟踪某些内容:类别更改。不过,这仍然不容易回答。您能否提供更多关于第 2 页和第 3 页是如何设置的信息,最好使用使用的表/数据结构?

标签: oracle-apex


【解决方案1】:

执行此操作的一种方法是通过 ajax 更新页面项目的会话状态(不正常提交页面),并在由 javascript onbeforeunload 调用时调用更新表的应用程序进程。

创建一个应用程序进程以按需触发,命名为 UpdatePageXOnExit 或其他名称。在该应用程序进程的 PL/SQL 块中,使用 SQL 更新命令以及您希望更新的页面上每个项目的项目状态;类似于以下内容:

BEGIN
    UPDATE table_name SET col1 = :PX_ITEM_1, col2 = :PX_ITEM_2, col3 = :PX_ITEM3, col4 = :PX_ITEM_4, col5 = PX_ITEM_5 
WHERE (condition... I would suggest ROWIDs to simplify changes to the 
       fields of the PK; otherwise you will have to create additional
       page items for each field of the PK, then set those items to
       the values of the PK when the page loads using a before
       header page process, and then use those values in this where
       clause like this: where col1 = :PX_ORIGINAL_PK_FIELD_1 AND col2 =
       :PX_ORIGINAL_PK_FIELD_2 );
END ;

转到该特定页面的页面设置,然后在 JavaScript:在页面加载时执行部分,编写如下内容:

window.onbeforeunload = updateOnExit; 

在 JavaScript 函数和全局变量声明中,编写如下内容:

function updateOnExit() {
    var get = new htmldb_Get(null,&APP_ID.,'APPLICATION_PROCESS=UpdatePageXOnExit',&APP_PAGE_ID.);
    get.add('PX_ITEM_1',$x('PX_ITEM_1').value)
    get.add('PX_ITEM_2',$x('PX_ITEM_2').value)
    get.add('PX_ITEM_3',$x('PX_ITEM_3').value)
    get.add('PX_ITEM_4',$x('PX_ITEM_4').value)
    get.add('PX_ITEM_5',$x('PX_ITEM_5').value)
    gReturn = get.get();
    get = null;
    // Comment out the following line or not, as per the note in the following paragraph
    return 'Are you sure you would like to leave the page?';
}

最后一部分是 AJAX,它更新页面上页面项目的会话状态,这些页面项目在用户端已更改但尚未上传到服务器端,这通常发生在页面提交期间。注意:如果您注释掉 return 语句,则不会有允许用户留在页面上的警告框。如果这是你喜欢的,那就去吧。如果您选择使用警告框,即使用户选择留在页面上,ajax 也会执行页面进程。

【讨论】:

    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多