Oracle apex 离开APEX页面时触发进程(SQL更新)

Oracle apex 离开APEX页面时触发进程(SQL更新),oracle-apex,Oracle Apex,这是一个非常奇怪的问题,但我想知道,当用户离开这个特定页面时,是否可以通过单击面包屑、选项卡或后退按钮触发运行SQL更新的进程 我确实设置了在“后退”按钮上运行的进程;然而,我遇到了一个问题:如果他/她点击面包屑或标签怎么办 我已经在网上搜索过了,发布这个问题是最后的选择。我想知道是否有人能给我指出正确的方向 更新帖子 第1页: 包括一个文本字段和一个按钮。用户在文本字段中输入类别,然后单击按钮进入下一页。按钮将文本字段中的值传递给第2页的文本字段 第2页: 页面上有两个区域。其中一个区域包含上

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

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

我已经在网上搜索过了,发布这个问题是最后的选择。我想知道是否有人能给我指出正确的方向

更新帖子

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

第2页: 页面上有两个区域。其中一个区域包含上一页中的category-category名称、category description和category revision number的相关信息,这正是我试图使用的。第二个区域是一个报告,用于提取类别文本字段中类别下列出的项目名称和编号。报告上使用“查看”链接加载所选特定项目的编辑页面。“查看”链接将类别文本字段中的“类别名称”和报告中的“项目编号”传递到第3页

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


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

一种方法是更新页面项目的会话状态,而不通过ajax正常提交页面,并调用更新表的应用程序进程,由javascript onbeforeunload调用时

创建一个名为UpdatePageXOnExit或其他的应用程序进程来按需启动。在该应用程序进程的PL/SQL块中,使用SQL update命令来更新页面上每个项目的项目状态;如下所示:

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 ;
window.onbeforeunload = updateOnExit; 
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?';
}
转到该特定页面的页面设置,在JavaScript:Execute On page Load部分,编写如下内容:

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 ;
window.onbeforeunload = updateOnExit; 
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?';
}
在JavaScript函数和全局变量声明中,编写如下内容:

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 ;
window.onbeforeunload = updateOnExit; 
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也会执行页面过程。

如果这是数据输入表单,如果检查是否进行了更改并提示用户,而不是启动更新,不是更好吗?@Tom我确实找到了一篇关于使用Javascript检查更改的博客文章;但是,该页面仅显示信息,未完成对该页面的编辑。事实上,我认为这可能是你的博客。当用户以任何方式留下页面时,为什么你真的要启动更新?访问页面是否需要触发一些特殊的事件?他们需要以某种方式互动吗?如果没有条目,为什么需要运行某个进程?@Tom对回复的延迟表示抱歉。这是因为产品是按组组织的。用户搜索类别页面1,该页面返回组页面2中的产品列表。我想知道一个类别改变的频率。报告用于列出链接到编辑页面第3页的产品。一个类别中的许多产品可以在一次会议中编辑,这意味着类别修订只应增加1,如果编辑了3个产品,则不会增加3。希望这是有意义的。关于如何解释这个问题,这改变了很多:我想你会想在编辑页面上启动一个更新过程,即使用户不会按下APPLY_changes按钮或诸如此类的按钮;这正是“马修·莫森”的目标。你的评论 似乎表明您希望跟踪某些内容:类别更改。但这仍然不容易回答。您能否提供更多关于第2页和第3页设置的信息,最好是使用表/数据结构?