Oracle Essbase入門系列(三)

數據庫計算

Essbase中單元格的數據能夠是外部輸入或計算而得,單元格於是分爲輸入單元格和計算單元格。計算單元格的計算方法能夠經過大綱中維度成員的合併計算符和公式腳本定義,此稱爲大綱計算定義。數據庫

例1張大明家在上海市區和浦東各有一套房,1月5日時張大明收到市區房子的水費和電費帳單,而後繳付;張大明的妻子王翠花同時也收到並繳付了浦東房子的帳單。兩地的水電單價和用量均不同。編輯器

在HomeFinancial應用程序中,對應的單元格錄入數據以下表的數據。表中,灰底的單元格是輸入單元格,其中的數據是手工錄入;而公共事業費,做爲父級成員應由其子代成員做合併計算,因此對應表中黑底的單元格就是計算單元格。函數

 

Essbase中子代成員合併到父級成員的計算能夠經過合併計算符設置。在維庫編輯HomeFinancial應用程序。選中維度結構中任何非1代成員,都有一項【Consolidation】屬性,這就是合併計算符。雙擊此屬性進行編輯,以下圖,在下拉列表中有7種合併計算符供選擇,下表列出了這些計算符的含義。建立成員時,默認的合併計算符是加法「+」。spa

 

在例1中,公共事業費須要按以下公式進行合併:設計

公共事業費 = 電單價 × 電用量 + 水單價 × 水用量3d

那麼是否將公共事業費子成員的合併計算符改爲下圖設置就夠了呢?圖中成員名稱後是合併計算符。日誌

此思路是對的,但作法在Essbase中行不通。緣由是Essbase中同級成員並不是按數學中先乘除後加減的順序計算,而是單純按照成員排序順序計算。若是按圖中那樣,公共事業費的計算就變成了:code

公共事業費 = (電單價 × 電用量 + 水單價) × 水用量orm

要糾正這個錯誤有兩種方法。其一是在維度結構上作文章,按下圖從新設計維度結構,獲得正確的計算順序以下:blog

第二種方法是使用成員公式。經過成員公式能夠編寫腳本定義計算,成員公式會覆蓋子代成員的合併計算。並且Essbase提供了豐富的計算函數和完善的腳本語法,在成員公式中能實現各類複雜的計算。

在維度結構中選擇公共事業費成員,修改它的【Member Formula(BSO)】屬性,在公式編輯器中輸入腳本:

= "水單價" * "水用量" + "電單價" * "電用量";

 

若是要編寫複雜的腳本,推薦使用EAS Console。EAS Console中的公式編輯器更強大,能夠提示計算函數和運算符,能夠幫助驗證腳本語法。Essbase的計算函數和語法可參看官方手冊。

有了成員公式,子代成員的合併計算符就沒有意義了。出於嚴謹性考慮,能夠將子代成員的合併計算符設爲「~」,即子成員不參與合併計算。

回到例1最初的那個表格,橫軸和縱軸分別是兩個維度,仔細觀察表中的計算單元格,會發現存在兩個疑問。

第一個疑問,表中兩個維度,表明了兩種計算方向,這兩種方向的計算結果是不一致的。具體來講,最右下角的單元格,表明的是整個家庭公共事業費的合計。如按箭頭方向①,即沿Account維度計算,根據成員公式,結果是584.5;反之,按箭頭方向②,即沿Home維度計算,根據合併計算符,結果是300.5。

顯然第二種計算方向是正確的,那麼如何讓Essbase按咱們但願的方式計算呢?答案是控制Essbase的計算順序。就是要先計算Account維度,獲得表中最下面一行單元格的數據,而後計算Home維度,獲得表中最右邊一列單元格的數據。後計算的結果會覆蓋前面計算的結果,便是說會以300.5做爲右下角單元格的最終計算結果。Essbase根據以下條件判斷維度間的計算順序。

  • 若是大綱中同時包含Account和Time兩種類型的維度,且Account維中使用到成員公式,計算順序爲:
    1. Account維度
    2. Time維度
    3. 密集維度,根據在大綱中排序計算
    4. 稀疏維度,根據在大綱中排序計算
  • 其餘狀況下,計算順序爲:
    1. 密集維度,根據在大綱中排序計算
    2. 稀疏維度,根據在大綱中排序計算

所以,維度的存儲類型和在大綱中的排序是控制計算順序的兩個重要手段。如HomeFinancial按照Account > Year > Home > Scenario的順序計算,這樣就能保證產生正確的計算結果。若是不清楚數據的計算順序,能夠在執行計算命令後,從Essbase的日誌文件中查看。

此外,若要改變維度中個別成員的計算順序。好比須要公共事業費在Home維度後計算,即須要表格右下角單元格的計算結果是584.5。那麼能夠啓用公共事業費的【Two Pass Calculation】屬性。此屬性代表成員須要二次計算,Essbase會在按正常順序計算一遍後,再用公共事業費的成員公式對相關單元格進行第二次計算。

第二個疑問,是電單價和水單價。按Home維度上的計算方法,使用加分「+」作合併計算,計算結果在父級成員上是無心義的。咱們已經將電單價和水單價的合併計算符置爲「~」,使之不在Account維度上進行合併計算,那麼如何讓它們不在其餘維度上進行合併呢?實際上,這裏想要說明的是合併計算符「~」與「^」的區別,由於這兩個計算符常讓人困惑和混淆。這個例子中,要讓電單價和水單價在Home、Year、Scenario上都不執行合併計算,須要將合併計算符設成「^」,以下圖。

改爲「^」後,電單價和水單價相關單元格在計算過程當中不會產生任何合併計算值。只有使用公式腳本或輸入值才能向這些單元格寫入數據。

除了記錄平常收支流水外,咱們還要爲HomeFinancial加入計算現餘額的功能。所以在Account維度的現金流層次下加入了4個成員。

  • 期初現金:某一時期開始的現金量;
  • 淨收入:總收入減總支出;
  • 調整:當發現收支跟現金餘額對不上時,用於調整;
  • 期末現金:某一時期最後的現金量;

例2:下表記錄的是張大明在2013年Q1季度的現金流。

在1月1日時張大明有現金500000元,整個1月份他花了10000元,賺了30000元,則淨收入有20000元。1月31日結束時他應該有現金520000元,但因爲漏記,或者銀行交易產生的手續費,張大明發現實際的金額是519980元,因而補錄了20元的調整項。因此有以下等式:

淨收入 = 收入 – 支出

期末現金 = 期初現金 + 淨收入 + 調整

要在Essbase中實現淨收入和期末現金的計算,可使用成員公式。在維庫中編輯淨收入的成員公式屬性,輸入腳本:

= "收入" - "支出";

編輯期末現金的成員公式屬性,輸入腳本:

= "期初現金" + "淨收入" + "調整";

到1月結束時張大明所擁有的現金,同時也就是2月最初所擁有的現金。因而又有以下等式:

期初現金 = 上期的期末現金

將期初現金的成員公式修改成:

IF(NOT @ISMBR("1月1日"))
    "期初現金"=@PRIOR("期末現金",1);
ENDIF;

此腳本要求咱們在1月1日輸入期初現金,以後每一時期的期初現金都等於上一時期的期末現金。

定義了3個成員的公式後,接着要討論一下這3個成員的計算順序問題。前面咱們使用例1來講明維度間的計算順序,即同一類型的維度,計算順序是由它們在大綱中的排序順序決定的。這一規則也一樣適用於同一維度中成員間的計算順序。在同一維度的成員間,Essbase按照由低級到高級,由前到後的順序計算。因此現金流這部分紅員的計算順序以下圖。

下表用箭頭標示了單元格的計算路徑。

 

按照這樣的計算路徑,期初現金的成員公式會引用到晚於它計算的期末現金,從而產生錯誤的計算結果。例如當計算2月的期初現金時,1月的期末現金還未計算,結果獲得空值。

將引用成員置於被引用成員以前,形成計算順序錯誤的現象稱爲「前置引用」。要解決此問題,方法是讓期末現金和期初現金一塊兒計算,修改期初現金的公式腳本爲:

IF(NOT @ISMBR("1月1日"))
    "期初現金"=@PRIOR("期末現金",1);
ENDIF;
"淨收入" = "收入" - "支出";
"期末現金" = "期初現金" + "淨收入" + "調整";

而後移除淨收入和期末現金的成員公式。依此計算公式,當1月期初現金計算時,1月的淨收入和期末現金同時被計算。那麼在計算2月期初現金時,就能夠獲得正確的計算結果。

接着計算2月和3月的現金流。在Q1季度,期初現金應該是1月的期初現金,期末現金應該是3月份的期末現金,淨收入和調整是3個月的合計。同理,整個2013年,期初現金是Q1的期初現金,期末現金是Q4的期末現金,淨收入和調整是4個季度的合計。

可見,期初現金和期末現金在Year維度上採用了一種特殊的合併方式——分別取第一個子成員值和最後一個子成員值。在現實應用場景中,經常會碰到與時間相關的計算,如同比、環比、累計等。Essbase提供了大量有關Time類型維的計算函數和方法。本例中,除了使用成員公式,可使用時間平衡(Time Balance)計算實現期初和期末計算。時間平衡計算要求數據庫中必須含有Time類型維度,且僅能用在Account類型維度上使用。時間平衡計算不會影響Time類型外其餘維度的合併方式。時間平衡有3種計算,含義以下表。

在維庫中,將期初現金的【Time Balance】屬性設爲First;將期末現金的【Time Balance】屬性設爲Last。

時間平衡計算還有一個屬性【Skip Value】,此屬性控制是否要忽略空值Missing或零值。好比現金流是從2月開始,1月的期初現金是空值。若是期初現金的【Skip Value】屬性是None,不忽略空值和零值,則Q1的期初現金會是1月的空值;若是是Missing,則計算Q1的期初現金時會忽略1月的空值,取2月的值。

在有了大綱計算後,每次錄入和修改數據,Essbase是不會自動按合併計算符和成員公式進行計算的。必須執行計算命令,Essbase纔會計算相關單元格。計算命令可寫在計算腳本中,計算腳本可精確控制計算範圍和順序,還可覆蓋大綱計算。能夠爲數據庫建立多個計算腳本,執行不一樣的計算腳本以實現不一樣的計算。每一個數據庫都有一個默認計算腳本。

在EAS Console中,右擊HomeFinancial下的y2013數據庫,菜單中選擇【設置】>【默認計算】。可看到在默認計算腳本中,使用了CALC ALL語句計算整個數據庫,根據須要咱們能夠修改默認計算腳本。要建立新的計算腳本,在y2013數據庫的右鍵菜單中選【建立】>【計算腳本】。

 

執行計算腳本的途徑有多種,如經過MaxL Shell,Smart View,EAS Console等。要在EAS Console中執行計算腳本,經過右鍵菜單選【執行計算】,而後選須要執行的腳本。

 

相關文章
相關標籤/搜索