Oracle Apex 中的计算未返回预期结果

Computation in Oracle Apex not returning expected result

我对计算点感到困惑,例如before_header和after_header等

我有一个计算,需要取一个页面项值,然后 return 作为结果。

计算是一个PL/SQL函数体如下:

DECLARE
   v_response varchar2(1500);
BEGIN
  IF :P4_RENEWAL_REQUIRED = 'Yes' THEN
        v_response := 'According to Register, a license renewal WILL BE required to maintain this registration. Please choose whether you agree or disagree with this statement.';
 ELSE
       v_response:='Forget about it...';
 END IF;
  return v_response;
END;

页面项目 :P4_RENEWAL_REQUIRED 是一个计算字段,它是一个 SQL 值,它依赖于数据库填充的页面项目 P4_RENEWAL_NOT_REQUIRED。它只是将“是”变为“否”,将“否”变为“是”。

SELECT (CASE WHEN V('P4_RENEWAL_NOT_REQUIRED')='Yes' Then 'No' ELSE 
CASE WHEN  V('P4_RENEWAL_NOT_REQUIRED')='No' Then 'Yes' ELSE '??' END END) FROM DUAL

我的计算不会return结果。 P4_RENEWAL_REQUIRED 值显然是 'Yes',但计算结果将是 return 'Forget about it'。如果我进入页面编辑视图,然后再次 运行 页面 - 该值显示

的正确值

'According to Register, a license renewal WILL BE required to maintain this registration. Please choose whether you agree or disagree with this statement.'

这对我来说意味着计算是在 P4_RENEWAL_REQUIRED 的旧会话值上运行的。

我不太确定计算点与此有什么关系,但是如果我有数据通过在 After Header 上执行的获取行进程进行 returned,然后填充字段P4_RENEWAL_NOT_REQUIRED 等区域,然后 P4_RENEWAL_REQUIRED 正在计算....我如何进行计算以填充另一个依赖于现有页面项目的区域中的字段?

我已经尝试让我的计算在页脚之前、区域之前、页脚之后等执行,但没有任何效果。

我不确定页脚之前的所有内容是如何工作的,或者当所有这些都呈现在服务器端时页面项目是如何填充的。

例如,如果我将我的计算设置为计算 "After Region",那么在某个区域中使用该值是否为时已晚,因为这些区域已经被渲染了?

如果我需要在我的计算中计算一个值以在区域中使用它并使用 "Before Region" 计算点,请通过底层查询将我需要使用的页面项目绑定到页面项目那一点还是我太早了。

感谢任何帮助。

"Source Used" 应设置为 "Always",因为您希望该值反映其依赖值。当设置为 "Only when session state is null" 时,只有当 session 状态为空时才会获取该值。在第一次提交(或任何其他在 session 状态中设置值的方法,例如计算)之后,将不再每次都检索源。这会给您留下旧值的印象。

至于文档:它通常非常透明,但通常存在一些混淆的地方是通过提取行过程检索值时:此过程提取相关项目(源=数据库列)的值并将它们保存在渲染期间的内存("in-memory session state")。这些值将始终用于项目的来源,尽管这些值之后不会保持 session 状态(=当渲染完成时)。您可以在页面呈现后通过检查 session 状态来验证这一点:全部为空!我知道我在某个地方读过这个,但文档本身没有详细说明 "fetch row" 是如何工作的。

计算将持续设置处于 session 状态的项目的值。是的 - 您可以使用它们来设置项目的值并且它具有这种附加效果。 "caused" 这里的问题(组合):只要不通过提交保留 session 状态,只需从项目源中导出值就可以正常工作。由于使用了计算,因此始终忽略源,因为使用了 "only when session state is null"。

虽然对数据库列执行计算确实设置了 session 状态,但是 in-memory session 状态和源类型已经否决了该值。渲染后,通过计算设置的 session 状态仍然存在。提交时,提交的值将再次置于 session 状态。所以,这是一个奇怪的情况。不过,这可能真的很奇怪 - 尽量避免这种情况,因为它会在逻辑上解决这个问题。

这确实赋予了不同的计算点意义。您可以在渲染结束后计算一个项目,并且 session 状态将被设置。该项目将在计算之前用一个值渲染(如果在渲染之后完成,否则,它取决于例如源),然后将值保持在 session 状态。 我无法举出一个例子,因为我从来没有使用过那种情况。就个人而言,之前和之后的区域点对我来说意义不大。 headers 之前和 headers 之后通常是最常用的点,并且与所有处理一样,将是连续的。在适当的地方使用。

再一次,在项目全部通过其源设置派生的正常情况下:它们将表现正常并且不会持续到 session 状态。进程("Fetch"! 除外)和计算将使值保持在 session 状态。