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

时间:2016-08-01 16:43:21

标签: oracle oracle-apex

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

我有一个计算,需要取一个页面项值,然后返回结果。

计算是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

我的计算不会返回结果。 P4_RENEWAL_REQUIRED值显然是“是”'但计算将返回'忘记它'。如果我进入页面编辑视图,然后再次运行该页面 - 该值显示

的正确值

'根据注册表,将需要续订许可证以维持此注册。请选择您是同意还是不同意本声明。'

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

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

我试过让我的计算在页脚之前,区域之前,页脚之后执行但是没有任何作用。

我不确定所有Before Footer是如何工作的,或者当所有这些都呈现在服务器端时,页面项如何填充在哪一点。

例如,如果我将计算设置为" After Region"因为区域已经被渲染,所以在区域中使用该值是否为时已晚?

如果我需要在计算中计算一个值以在区域中使用它并使用"在区域之前"计算点,让我需要使用的页面项目在那时由基础查询绑定到页面项目,或者我太早。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

“使用的来源”应设置为“始终”,因为您希望该值反映其依赖值。设置为“仅当会话状态为空”时,仅在会话状态为空时才提取该值。在第一次提交(或在会话状态中设置值的任何其他方法,例如计算)之后,将不再每次检索源。这会让你觉得价值已经过时。

至于docs:它通常是非常透明的,但通常存在一些混淆的情况是通过获取行进程检索值时:此进程获取相关项的值(source = database列)并将它们保存在内存中渲染的持续时间(“内存中会话状态”)。这些值将始终用于项目的源,但之后的值不会保持在会话状态(=渲染完成时)。您可以通过在呈现页面后检查会话状态来验证这一点:全部为空!我知道我已经在某个地方读过这个内容了,但是文档本身没有详细说明“获取行”是如何工作的。

计算将持久地设置会话状态中项目的值。是 - 您可以使用它们来设置项目的值,它具有此附加效果。这会“引起”这里的问题(组合):只要通过提交保持会话状态,只需派生项目源中的值就可以正常工作。由于使用了计算,因此始终忽略源,因为“仅当会话状态为空时”才使用。

对数据库列执行计算会确实设置会话状态,但内存中会话状态和源类型已取代该值。渲染后,通过计算设置的会话状态仍然存在。提交提交的值时,将再次进入会话状态。所以,这是一个奇怪的情况。这可能是非常奇怪的 - 尽量避免这种情况,因为它将通过这个混乱的逻辑。

这确实为不同的计算点赋予了意义。您可以在渲染结束后计算项目,并设置会话状态。项目将在计算之前使用值进行渲染(如果在渲染之后完成,否则,它取决于例如源),然后将值保持在会话状态中。 我无法想出一个例子,因为我从来没有使用过这种情况。就个人而言,区域之前和之后的点对我来说并不重要。 before标头和标头之后通常是最常用的点,并且与所有处理一样,将是顺序的。适当时使用。

再一次,在正常情况下,这些项目都是通过源设置得出的:它们的行为正常,并且不会出现会话状态。进程(“获取”除外!)和计算将使值在会话状态中持续存在。