Warning: file_put_contents(/datas/wwwroot/jiajiahui/core/caches/caches_template/2/default/show.php): failed to open stream: Permission denied in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 55

Warning: chmod(): Operation not permitted in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 56
计算未返回预期的结果 - 源码之家

计算未返回预期的结果

计算未返回预期的结果

问题描述:

我越来越感到困惑的计算点,如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上运行。

我不太确定计算点与此有什么关系,但是如果我通过在Header上执行的Fetch Row过程返回数据,然后填充区域中的字段(例如P4_RENEWAL_NOT_REQUIRED)和那么P4_RENEWAL_REQUIRED正在计算....如何获得一个计算来填充另一个区域中的一个字段,该字段对现有页面项目有依赖性?

我已经尝试使我的计算在页脚之前,区域之前,页脚之后执行,但没有任何工作。

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

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

如果我需要在我的计算中计算一个值以在区域中使用它并使用“Before Region”计算点,则需要使用该页面项目与该页面项目相关联的基础查询或者我太早了。

任何帮助表示赞赏。

+0

不完全清楚:P4_RENEWAL_NOT_REQUIRED的来源是什么?设置为“始终”或“仅在会话状态为空时”? – Tom

+0

它始终设置为 – smackenzie

+0

对不起,可能尚未明确声明:此项目的来源类型,它设置了什么? SQL查询? – Tom

由于您希望该值反映它的相关值,因此应将“使用的源”设置为“始终”。当设置为“仅在会话状态为空时”时,该值将只在会话状态为空时被提取。在第一次提交之后(或者在会话状态中设置一个值的任何其他方法,例如计算)之后,将不再检索源。这会给你的印象是价值是旧的。对于文档:它通常是真正透明的,但通常存在一些混淆的地方是当通过读取行​​进程检索值时:此过程获取相关项目的值(source =数据库列)并将它们保存在内存中在渲染期间(“内存中会话状态”)。这些值将始终用于项目的源代码,尽管之后值不会保留在会话状态(=渲染完成时)。您可以通过在页面呈现后检查会话状态来验证这一点:全部为空!我知道我已经读过这个地方,但文档本身没有详细说明“获取行”的工作原理。

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

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

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

在正常情况下,这些项目都是通过源设置派生的:它们将表现正常,并且不会发生会话状态持久性。进程(“Fetch”!除外)和计算会使值保持会话状态。