2016-08-01 166 views
1

我越來越感到困惑的計算點,如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

回答

0

由於您希望該值反映它的相關值,因此應將「使用的源」設置爲「始終」。當設置爲「僅在會話狀態爲空時」時,該值將只在會話狀態爲空時被提取。在第一次提交之後(或者在會話狀態中設置一個值的任何其他方法,例如計算)之後,將不再檢索源。這會給你的印象是價值是舊的。對於文檔:它通常是真正透明的,但通常存在一些混淆的地方是當通過讀取行​​進程檢索值時:此過程獲取相關項目的值(source =數據庫列)並將它們保存在內存中在渲染期間(「內存中會話狀態」)。這些值將始終用於項目的源代碼,儘管之後值不會保留在會話狀態(=渲染完成時)。您可以通過在頁面呈現後檢查會話狀態來驗證這一點:全部爲空!我知道我已經讀過這個地方,但文檔本身沒有詳細說明「獲取行」的工作原理。

計算將永久性地設置會話狀態中項目的值。是的 - 您可以使用它們來設置項目的值,並且具有此附加效果。這在這裏「引發」了問題(組合):只要會話狀態不通過提交保存,只需在項目源中派生值就可以正常工作。由於使用了計算,所以始終忽略源,因爲「僅在會話狀態爲空時」才被使用。

雖然在數據庫列上執行計算確實會設置會話狀態,但內存中會話狀態和源類型已經取消了該值。渲染之後,通過計算設置的會話狀態仍然存在。提交時,提交的值將再次處於會話狀態。所以,這是一個奇怪的情況。這可能真的很奇怪 - 儘量避免這種情況,因爲它會通過這個混亂的邏輯。

這確實賦予不同計算點的含義。您可以在渲染結束後計算一個項目,並設置會話狀態。該項目在計算之前已經具有一個值(如果在渲染之後完成,否則它取決於例如源),然後使該值保持在會話狀態。 我不能拿出一個例子,因爲我從來沒有使用過這種情況。就個人而言,前後區域點對我來說沒有多大意義。 前面的標題和後面的標題通常是最常用的點,並且與所有處理一樣,將是順序的。適當時使用。

在正常情況下,這些項目都是通過源設置派生的:它們將表現正常,並且不會發生會話狀態持久性。進程(「Fetch」!除外)和計算會使值保持會話狀態。