全部文档
文档中心财务模型deepcubedeepcube语法手动上卷汇总

手动上卷汇总

rollup()函数用于计算

成员的上卷汇总。可将指定成员按照维度树形结构从下层开始进行逐层上卷汇总,通常用于手动汇总一些非自动汇总的场景,如列作用实体类,未开启累计数自动计算时的期间类,科目成员勾选了父级节点可写等。

rollup示例

例如:某项目实体维度如下,第一级为总部TotalEntity,总部下设三个大区Region,每个大区下有数量不同的部门,某些部门下设置了几个小组,但另一些部门已经是最末级。

因为财务模型配置了Entity列作用为实体类,所以在Entity维度上所有父级节点都是非自动汇总并且可以写数的。在某些场景需要按照Entity做手动的上卷汇总,将Entity的成员TotalEntity下的所有节点按照树形结构和比重层层上卷汇总,并将汇总结果写入到对应父级成员。

为此,我们提供rollup()函数实现此需求。

Copy
from deepcube.cube.cube import deepcube

def main():
    # 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
	cube1 = deepcube('cube1')
    
    # 为了后续计算写法简单,在这里将cube的维度赋值给同名变量(注意这里cube1.year中的year是字段名)
    year = cube1.year
    period = cube1.period
    scenario = cube1.scenario
    version = cube1.version
    product = cube1.product
    account = cube1.account
    entity = cube1.entity

    # 从系统的财务模型中加载数据。
    cube1.init_data([year["2021"],
        scenario["Actual"],
        version["Working"]])

    # 确定一个背景scope范围
    cube1.scope(year["2021"],
        scenario["Actual"],
        version["Working"],
        period["YearTotal"].Base(),
        product["TotalProduct"].Base(),
        account["Total_Sales"].Base()
    )

	# 上卷计算
    cube1.rollup(entity['TotalEntity'])

	# 将计算结果写入系统的财务模型中
    cube1.submit_calc()

这是rollup()函数最常见的用法,从维度树形结构的叶子节点开始,逐层向上汇总。此过程中会计算TotalEntity及其下面所有的父级节点的汇总值,具体计算过程是:

  1. 将GroupA和GroupB按照比重汇总至Dep0102,将GroupC和GroupD按照比重汇总至Dep0301。

  2. 将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。

  3. 将Region01,Region02和Region03按照比重汇总至TotalEntity。

在上面的计算过程中,如果中间层级的非叶子节点本身存在数据,也会被下层的汇总值覆写。但对于某些特定的科目或场景,父级节点的数值不等于其子集成员的汇总。比如在某个特殊口径下,部门级别的数据不等于其下小组的汇总值,而是独立填报的数值。此时就需要用到distance参数,指定上卷计算开始的层级。

Copy
from deepcube.cube.cube import deepcube

def main():
    # 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
	cube1 = deepcube('cube1')
    
    # 为了后续计算写法简单,在这里将cube的维度赋值给同名变量(注意这里cube1.year中的year是字段名)
    year = cube1.year
    period = cube1.period
    scenario = cube1.scenario
    version = cube1.version
    product = cube1.product
    account = cube1.account
    entity = cube1.entity

    # 从系统的财务模型中加载数据。
    cube1.init_data([year["2021"],
        scenario["Actual"],
        version["Working"]])

    # 确定一个背景scope范围
    cube1.scope(year["2021"],
        scenario["Actual"],
        version["Working"],
        period["YearTotal"].Base(),
        product["TotalProduct"].Base(),
        account["Total_Sales"].Base()
    )

	# 上卷计算
    cube1.rollup(entity['TotalEntity'], 2)

	# 将计算结果写入系统的财务模型中
    cube1.submit_calc()

distance=2表示从TotalEntity往下2级开始,向上汇总,此时计算过程是这样的:

  1. 将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。

  2. 将Region01,Region02和Region03按照比重汇总至TotalEntity。

需要注意,距离0代表着成员本身,由本身汇总至本身的计算是没有意义的,因此cube1.rollup(entity[‘TotalEntity’], 0)的写法是不合法的。

关于rollup共享节点的处理

在rollup()计算过程中,不会特意区分维度成员是否是共享成员。

如下例,如果将Region03节点共享至Dep0101下。

如果此时财务模型中只有所有的末级节点有数据,即GroupA,GroupB,GroupC,GroupD有数据,其他节点均为空值。

现使用rollup()函数,并且不传入distance参数,则计算顺序如下:

  1. 将GroupC和GroupD按照比重汇总至Dep0301。

  2. 将Dep0301按照比重汇总至Region03。

  3. 将Region03按照比重汇总至Dep0101,将GroupA和GroupB按照比重汇总至Dep0102,将GroupC和GroupD按照比重汇总至Dep0301。

  4. 将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。

  5. 将Region01,Region02和Region03按照比重汇总至TotalEntity。

可以看到,在这个过程中,Dep0301和Region03因为共享节点而被多次计算,与财务模型自动汇总的逻辑一致。

rollup计算范围

rollup()的计算范围是scope范围+rollup()入参范围,如果scope中出现了rollup()入参中的同维度,以rollup()为准。

计算过程中,要写入的范围规则与普通计算等号左边一样,只能写可录入单元格。

目前rollup()中可传入的字段只有非自动汇总字段,如果传入自动汇总字段,则scope中要有accout父级可写成员,或version中有自上而下成员。

rollup多版本实体维逻辑

如果要做上卷汇总的维度是一个多版本实体维,业务需求常常会要求上卷汇总的维度树过滤实体激活表,按照对应的管控维度有效的实体树形结构汇总。

rollup函数支持多版本实体维的有效性过滤,使用时,需要在函数中传入参数with_parent=True。

with_parent默认为False,即不过滤实体激活表。

Copy
from deepcube.cube.cube import deepcube


def main(p1, p2):
    # invalidate_cache()
    # 获取表单传参的year,赋值到变量中
    # cur_year = p2['Year_wb1']

    # 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
    cube1 = deepcube('cube1', path='/cube')

    # 为了后续计算写法简单,在这里将cube的维度赋值给同名变量(注意这里cube1.year中的year是字段名)
    year = cube1.Year
    period = cube1.Period
    scenario = cube1.Scenario
    account = cube1.Account
    Value = cube1.Value
    entity = cube1.Entity
    View = cube1.View
    Movement = cube1.Movement

    # 从cube加载数据,需要指定取数的范围。
    cube1.init_data([year['2022'],
                     period['1', '2'],
                     scenario["Actual"],
                     account["A01"],
                     Value['CNY'],
                     entity['A'].IDescendant(),
                     Movement['OPN']
                     ])
    cube1.scope(year['2022'],
                period['1', '2'],
                scenario["Actual"],
                account["A01"],
                Value['CNY'],
                Movement['OPN']
                )
    # 计算上卷汇总,entity维度需要过滤实体激活表,只汇总有效成员
    cube1.rollup(entity['A'], with_parent=True)

    # 将计算结果写入Cube
    cube1.submit_calc()

回到顶部

咨询热线

400-821-9199

我们使用 ChatGPT,基于文档中心的内容以及对话上下文回答您的问题。

ctrl+Enter to send