Apex 会话状态问题

Apex session state issue

背景资料:

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

REASON_CODES

ID|NAME|PARENT_ID

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

条目

ID|RC1|RC2|DESCRIPTION|DATE

此 table 包含问题条目的所有信息(这是表单和报告的主要 table)。 '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 旁边添加了一个 'Update' 按钮,用于提交页面而不记录其 table 上的条目。单击 'Update' 后,RC2 的 LOV 正确显示。

问题:

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

对可能导致此问题的原因有任何想法吗?

说明

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

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

例子

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

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

那么为什么会这样呢?因为当用户输入 500,000 时,该数字成为该页面项的会话状态值。即使您后退或重新加载页面,用户仍处于同一会话中(因此术语 "session-state value"),因此 500,000 是会话状态值--会坚持下去。

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

解决问题

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

  1. 在页面的开发者视图中,单击页面项目;

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

  3. "Used" 下有一个下拉列表,其中有两个选项:

    • "Only when current value in session state is null";和
    • "Always, replacing any existing value in session state"
  4. 正如我提到的,APEX 默认为第一个选项。

  5. 把这个值改成第二个。

  6. 命中"Save"

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

希望对您有所帮助!

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

APEX_UTIL.CLEAR_PAGE_CACHE (67);

现在每次选择时条目的数据都会正确显示。

您是否通过本机界面设置了级联 LOV?你想在RC2的查询中刷新时引用RC1的状态?在 RC2 的定义中将 P67_RC1 添加到 "Page items to submit"。
这将使 apex 获取 RC1 的当前值,并在 RC1 更改后刷新 RC2 的值时在 RC2 的查询中使用此值。