【问题标题】:Apex session state issueApex 会话状态问题
【发布时间】:2016-07-28 21:10:18
【问题描述】:

背景信息:

我有一个链接到两个表格的表单页面和报告页面:

REASON_CODES

ID|NAME|PARENT_ID

这是问题条目的可用原因代码列表。 PARENT_ID 字段允许用户在代码之间分配父/子关系。

条目

ID|RC1|RC2|DESCRIPTION|DATE

此表包含问题条目的所有信息(这是表单和报告的主表)。 “RC”列分别指父原因代码 ID 和子原因代码 ID。

在 Apex 表单上,RC 字段都是具有自动完成功能的文本字段。由于这些字段没有原生级联能力,我们不得不在 LOV 定义中强制建立这样的关系:

RC1:

SELECT ID
FROM REASON_CODES
WHERE PARENT_ID = 0

RC2:

SELECT   ID
FROM REASON_CODES
WHERE PARENT_ID = :p67_RC1

填充 RC2 LOV 时出现问题,因为它取决于 RC1 中的值。为了解决这个问题,在 RC1 旁边添加了一个“更新”按钮,用于提交页面而不在其表中记录条目。单击“更新”后,RC2 的 LOV 会正确显示。

问题:

用户从报告页面中选择一个现有条目进行编辑和更改 RC1,然后按照他们的说明按“更新”。如果他们保存所做的更改,则效果很好。然而,如果他们意识到他们做错了,他们会改为按“取消”。如果他们随后从报告中返回此条目(或者如果他们进入完全不同的条目),则表单字段将显示上次输入的内容,而不是数据库条目中的内容。仅当我保存条目或注销并重新开始时才会重置。

有什么可能导致这种情况的想法吗?

【问题讨论】:

    标签: oracle oracle-apex


    【解决方案1】:

    您已经通过本机界面设置了级联 LOV?您想在 RC2 的查询中引用 RC1 刷新时的状态吗?在 RC2 的定义中将P67_RC1 添加到“要提交的页面项目”。
    这将让 apex 获取 RC1 的当前值,并在 RC1 更改后刷新 RC2 的值时在查询 RC2 中使用该值。

    【讨论】:

      【解决方案2】:

      说明

      如果Page Item(可以采用输入字段、下拉菜单等形式)的源值来自 SQL 查询,则其输出仅在没有会话时用作显示值- 该页面项的状态值。

      因此,如果用户在会话期间输入或修改该值,APEX 现在引用用户的那个值,而不是数据库值(来自 SQl 查询)。

      示例

      假设您有一个名为Annual Salary 的页面项目,它是一个数字字段。让我们假设它的值是一个基于登录用户的数据库查询:

      1. 在页面加载时,SQL 查询运行,并在数据库中输出与该用户的年薪相对应的数字。假设它是200,000;
      2. 现在,用户单击数字字段并输入 500,000,而不保存输入。
      3. 如果您重新加载页面,Annual Salary 中的值仍将显示为 500,000。

      那么为什么会这样呢?因为当用户输入 500,000 时,该数字成为该页面项的会话状态值。即使您向后移动或重新加载页面,用户仍处于同一会话中(因此称为“会话状态值”),因此 500,000——即会话状态值——将持续存在。

      现在,当您退出应用程序时,会话结束。这就是为什么如果您注销并重新登录,Annual Salary 将显示数据库值 (200,000),因为页面项的会话值恢复为 NULL

      解决问题

      要克服 APEX 中的此默认设置,请执行以下操作:

      1. 在页面的开发者视图中,点击Page Item;

      2. 然后在其属性中,转到Source

      3. 在“已使用”下,有一个下拉列表,其中包含两个选项:

        • "仅当会话状态的当前值为空时";和
        • “总是,替换会话状态中的任何现有值”
      4. 正如我所提到的,APEX 默认为第一个选项。

      5. 将此值更改为第二个。

      6. 点击“保存”

      执行此操作后,APEX 现在将始终引用源(即 SQL 查询中的数据库值)作为显示值。它也可以是 NULL、0、一些默认文本或您将页面项目的源设置为的任何其他值。唯一会更改值的时间是用户保存更改(因为在这种情况下,数据库值已更改)。

      希望这会有所帮助!

      【讨论】:

      • 我实际上已经考虑过更改此选项,但它会导致不同的问题。在这种情况下,当用户为 RC1 输入新值并点击“更新”时,它会将刚刚输入 RC1 的内容恢复为数据库中的内容。此值需要更改和设置,然后才能保存并将更改提交到数据库。也许有更好的方法可以在不提交页面的情况下使用这些自动完成字段(用户需要)实现级联效果,但不幸的是,这种解决方案不适用于我的特定情况。
      【解决方案3】:

      我找到了解决此问题的方法。我在报告页面上添加了一个进程,以在加载时清除表单页面的缓存:

      APEX_UTIL.CLEAR_PAGE_CACHE (67);
      

      现在条目的数据在每次被选中时都能正确显示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-17
        • 2023-03-10
        • 1970-01-01
        • 2012-02-01
        • 2011-04-07
        • 2011-02-07
        • 1970-01-01
        • 2022-01-07
        相关资源
        最近更新 更多