在财务模型的计算中,参与计算的数是被限定了一个范围,因此经常会遇到参与计算的数值为空的情况,如下例:
from deepcube.cube.cube import deepcube
def main():
    # 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
	cube1 = deepcube('cube1', path='/Consolidation_App/Consolidation/Main_Model')
	# 为了后续计算写法简单,在这里将cube的维度赋值给同名变量(注意这里cube1.year中的year是字段名)
    year = cube1.year
    period = cube1.period
    scenario = cube1.scenario
    version = cube1.version
    entity = cube1.entity
    account = cube1.account
	# 从cube加载数据
    cube1.init_data([year["2022"],
        scenario["Budget"],
        version["V1"]])
	# 确定一个背景scope范围
    cube1.scope(year["2022"],
        scenario["Budget"],
        version["V1"],
        period["Q1"].Base(),
        entity["TotalEntity"].Base()
    )
    cube1.loc[account['Total_Sales']] = cube1.loc[account['Volume']] * cube1.loc[
        account['Price'], Period['BegBalance']] + cube1.loc[account['Sales_Adjs']]
    # 将计算结果写入Cube
    cube1.submit_calc()
当前脚本计算的Entity范围是所有的叶子节点,但并不代表所有的叶子节点都会参与计算。比如,Entity维度中有3个叶子节点 E1,E2,E3,E4。计算前财务模型中的数据如下:
| Entity | Year | Period | Scenario | Version | Account | Product | data | 
|---|---|---|---|---|---|---|---|
| E1 | 2022 | 1 | Budget | V1 | Volume | Hamburg | 100 | 
| E1 | 2022 | 2 | Budget | V1 | Volume | Hamburg | 110 | 
| E1 | 2022 | 3 | Budget | V1 | Volume | Hamburg | 120 | 
| E1 | 2022 | BegBalance | Budget | V1 | Price | Hamburg | 3 | 
| E1 | 2022 | 1 | Budget | V1 | Volume | Sandwich | 20 | 
| E1 | 2022 | 2 | Budget | V1 | Volume | Sandwich | 25 | 
| E1 | 2022 | 3 | Budget | V1 | Volume | Sandwich | 30 | 
| E1 | 2022 | BegBalance | Budget | V1 | Price | Sandwich | 5 | 
| E2 | 2022 | 1 | Budget | V1 | Volume | Hamburg | 100 | 
| E2 | 2022 | 2 | Budget | V1 | Volume | Hamburg | 110 | 
| E2 | 2022 | 3 | Budget | V1 | Volume | Hamburg | 120 | 
| E3 | 2022 | 1 | Budget | V1 | Sales_Adjs | Hamburg | 50 | 
| E3 | 2022 | 2 | Budget | V1 | Sales_Adjs | Hamburg | 80 | 
| E3 | 2022 | 3 | Budget | V1 | Sales_Adjs | Hamburg | -110 | 
当Entity等于E1时,等号右侧获取了 account[‘Volume’]和[account[‘Price’], Period[‘BegBalance’]]上的值,但account[‘Sales_Adjs’]为空,因此计算的结果就是 cube1.loc[account[‘Volume’]] * cube1.loc[ account[‘Price’], Period[‘BegBalance’];
当Entity等于E2时,等号右侧首先查询到 account[‘Volume’] 的值,而并没有查询到[account[‘Price’], Period[‘BegBalance’]],因此不需要执行cube1.loc[account[‘Volume’]] * cube1.loc[ account[‘Price’], Period[‘BegBalance’]的计算;同时也没有查询到account[‘Sales_Adjs’],因此也不需要做 + cube1.loc[account[‘Sales_Adjs’]]的计算,即在E2上不产生任何计算结果。
当Entity等于E3时,等号右侧首先没有查询到 account[‘Volume’]和[account[‘Price’], Period[‘BegBalance’]],因此不需要执行 cube1.loc[account[‘Volume’]] * cube1.loc[ account[‘Price’], Period[‘BegBalance’]的计算;但查询到account[‘Sales_Adjs’]的值,因此需要执行 + cube1.loc[account[‘Sales_Adjs’]]的计算,因此E3上会产生计算结果。
当Entity等于E4时,等号右侧没有查询到任何值,因此对E4来说也不需要执行任何计算。
计算后的结果如下:
| Entity | Year | Period | Scenario | Version | Account | Product | data | 
|---|---|---|---|---|---|---|---|
| E1 | 2022 | 1 | Budget | V1 | Volume | Hamburg | 100 | 
| E1 | 2022 | 2 | Budget | V1 | Volume | Hamburg | 110 | 
| E1 | 2022 | 3 | Budget | V1 | Volume | Hamburg | 120 | 
| E1 | 2022 | BegBalance | Budget | V1 | Price | Hamburg | 3 | 
| E1 | 2022 | 1 | Budget | V1 | Volume | Sandwich | 20 | 
| E1 | 2022 | 2 | Budget | V1 | Volume | Sandwich | 25 | 
| E1 | 2022 | 3 | Budget | V1 | Volume | Sandwich | 30 | 
| E1 | 2022 | BegBalance | Budget | V1 | Price | Sandwich | 5 | 
| E2 | 2022 | 1 | Budget | V1 | Volume | Hamburg | 100 | 
| E2 | 2022 | 2 | Budget | V1 | Volume | Hamburg | 110 | 
| E2 | 2022 | 3 | Budget | V1 | Volume | Hamburg | 120 | 
| E3 | 2022 | 1 | Budget | V1 | Sales_Adjs | Hamburg | 50 | 
| E3 | 2022 | 2 | Budget | V1 | Sales_Adjs | Hamburg | 80 | 
| E3 | 2022 | 3 | Budget | V1 | Sales_Adjs | Hamburg | -110 | 
| E1 | 2022 | 1 | Budget | V1 | Total_Sales | Hamburg | 300 | 
| E1 | 2022 | 2 | Budget | V1 | Total_Sales | Hamburg | 330 | 
| E1 | 2022 | 3 | Budget | V1 | Total_Sales | Hamburg | 360 | 
| E1 | 2022 | 1 | Budget | V1 | Total_Sales | Sandwich | 100 | 
| E1 | 2022 | 2 | Budget | V1 | Total_Sales | Sandwich | 125 | 
| E1 | 2022 | 3 | Budget | V1 | Total_Sales | Sandwich | 150 | 
| E3 | 2022 | 1 | Budget | V1 | Total_Sales | Hamburg | 50 | 
| E3 | 2022 | 2 | Budget | V1 | Total_Sales | Hamburg | 80 | 
| E3 | 2022 | 3 | Budget | V1 | Total_Sales | Hamburg | -110 | 
由于一次计算,通常情况下NULL值是占绝大多数的,因此NULL值不会回写进系统!
NULL值不回写的逻辑会带来一个问题,比如,仍然使用上例中的MDX语句,但计算前财务模型的数据如下:
| Entity | Year | Period | Scenario | Version | Account | Product | data | 
|---|---|---|---|---|---|---|---|
| E1 | 2022 | 1 | Budget | V1 | Volume | Hamburg | 100 | 
| E1 | 2022 | 2 | Budget | V1 | Volume | Hamburg | 110 | 
| E1 | 2022 | 3 | Budget | V1 | Volume | Hamburg | 120 | 
| E1 | 2022 | BegBalance | Budget | V1 | Price | Hamburg | 3 | 
| E1 | 2022 | 1 | Budget | V1 | Volume | Sandwich | 20 | 
| E1 | 2022 | 2 | Budget | V1 | Volume | Sandwich | 25 | 
| E1 | 2022 | 3 | Budget | V1 | Volume | Sandwich | 30 | 
| E1 | 2022 | BegBalance | Budget | V1 | Price | Sandwich | 5 | 
| E2 | 2022 | 1 | Budget | V1 | Volume | Hamburg | 100 | 
| E2 | 2022 | 2 | Budget | V1 | Volume | Hamburg | 110 | 
| E2 | 2022 | 3 | Budget | V1 | Volume | Hamburg | 120 | 
| E3 | 2022 | 1 | Budget | V1 | Sales_Adjs | Hamburg | 50 | 
| E3 | 2022 | 2 | Budget | V1 | Sales_Adjs | Hamburg | 80 | 
| E3 | 2022 | 3 | Budget | V1 | Sales_Adjs | Hamburg | -110 | 
| E2 | 2022 | 1 | Budget | V1 | Total_Sales | Hamburg | 500 | 
| E2 | 2022 | 2 | Budget | V1 | Total_Sales | Hamburg | 650 | 
| E2 | 2022 | 3 | Budget | V1 | Total_Sales | Hamburg | 600 | 
在财务模型中,由于各种原因(比如第一次计算是其实是有E2上的Price数据,但随后Price数据被用户删除了),已经存在了E2的account[“Total_Sales”]数据,这时再进行计算,会发现由于E2上不会产生任何计算结果,因此也不会写入任何E2的数据,因此计算后的财务模型的数据如下:
| Entity | Year | Period | Scenario | Version | Account | Product | data | 
|---|---|---|---|---|---|---|---|
| E1 | 2022 | 1 | Budget | V1 | Volume | Hamburg | 100 | 
| E1 | 2022 | 2 | Budget | V1 | Volume | Hamburg | 110 | 
| E1 | 2022 | 3 | Budget | V1 | Volume | Hamburg | 120 | 
| E1 | 2022 | BegBalance | Budget | V1 | Price | Hamburg | 3 | 
| E1 | 2022 | 1 | Budget | V1 | Volume | Sandwich | 20 | 
| E1 | 2022 | 2 | Budget | V1 | Volume | Sandwich | 25 | 
| E1 | 2022 | 3 | Budget | V1 | Volume | Sandwich | 30 | 
| E1 | 2022 | BegBalance | Budget | V1 | Price | Sandwich | 5 | 
| E2 | 2022 | 1 | Budget | V1 | Volume | Hamburg | 100 | 
| E2 | 2022 | 2 | Budget | V1 | Volume | Hamburg | 110 | 
| E2 | 2022 | 3 | Budget | V1 | Volume | Hamburg | 120 | 
| E3 | 2022 | 1 | Budget | V1 | Sales_Adjs | Hamburg | 50 | 
| E3 | 2022 | 2 | Budget | V1 | Sales_Adjs | Hamburg | 80 | 
| E3 | 2022 | 3 | Budget | V1 | Sales_Adjs | Hamburg | -110 | 
| E2 | 2022 | 1 | Budget | V1 | Total_Sales | Hamburg | 500 | 
| E2 | 2022 | 2 | Budget | V1 | Total_Sales | Hamburg | 650 | 
| E2 | 2022 | 3 | Budget | V1 | Total_Sales | Hamburg | 600 | 
| E1 | 2022 | 1 | Budget | V1 | Total_Sales | Hamburg | 300 | 
| E1 | 2022 | 2 | Budget | V1 | Total_Sales | Hamburg | 330 | 
| E1 | 2022 | 3 | Budget | V1 | Total_Sales | Hamburg | 360 | 
| E1 | 2022 | 1 | Budget | V1 | Total_Sales | Sandwich | 100 | 
| E1 | 2022 | 2 | Budget | V1 | Total_Sales | Sandwich | 125 | 
| E1 | 2022 | 3 | Budget | V1 | Total_Sales | Sandwich | 150 | 
| E3 | 2022 | 1 | Budget | V1 | Total_Sales | Hamburg | 50 | 
| E3 | 2022 | 2 | Budget | V1 | Total_Sales | Hamburg | 80 | 
| E3 | 2022 | 3 | Budget | V1 | Total_Sales | Hamburg | -110 | 
这种情况其实并不是我们希望的结果,因此,在计算前,我们推荐首先将可能的结果数据做清除,随后再进行计算。具体可以参考清数。
回到顶部
咨询热线
