rollup()函数用于计算
成员的上卷汇总。可将指定成员按照维度树形结构从下层开始进行逐层上卷汇总,通常用于手动汇总一些非自动汇总的场景,如列作用实体类,未开启累计数自动计算时的期间类,科目成员勾选了父级节点可写等。因为财务模型配置了Entity列作用为实体类,所以在Entity维度上所有父级节点都是非自动汇总并且可以写数的。在某些场景需要按照Entity做手动的上卷汇总,将Entity的成员TotalEntity下的所有节点按照树形结构和比重层层上卷汇总,并将汇总结果写入到对应父级成员。
为此,我们提供rollup()函数实现此需求。
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及其下面所有的父级节点的汇总值,具体计算过程是:
将GroupA和GroupB按照比重汇总至Dep0102,将GroupC和GroupD按照比重汇总至Dep0301。
将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。
将Region01,Region02和Region03按照比重汇总至TotalEntity。
在上面的计算过程中,如果中间层级的非叶子节点本身存在数据,也会被下层的汇总值覆写。但对于某些特定的科目或场景,父级节点的数值不等于其子集成员的汇总。比如在某个特殊口径下,部门级别的数据不等于其下小组的汇总值,而是独立填报的数值。此时就需要用到distance参数,指定上卷计算开始的层级。
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级开始,向上汇总,此时计算过程是这样的:
将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。
将Region01,Region02和Region03按照比重汇总至TotalEntity。
需要注意,距离0代表着成员本身,由本身汇总至本身的计算是没有意义的,因此cube1.rollup(entity[‘TotalEntity’], 0)的写法是不合法的。
如下例,如果将Region03节点共享至Dep0101下。
如果此时财务模型中只有所有的末级节点有数据,即GroupA,GroupB,GroupC,GroupD有数据,其他节点均为空值。
现使用rollup()函数,并且不传入distance参数,则计算顺序如下:
将GroupC和GroupD按照比重汇总至Dep0301。
将Dep0301按照比重汇总至Region03。
将Region03按照比重汇总至Dep0101,将GroupA和GroupB按照比重汇总至Dep0102,将GroupC和GroupD按照比重汇总至Dep0301。
将Dep0101和Dep0102按照比重汇总至Region01,将Dep0201按照比重汇总至Region02,将Dep0301按照比重汇总至Region03。
将Region01,Region02和Region03按照比重汇总至TotalEntity。
可以看到,在这个过程中,Dep0301和Region03因为共享节点而被多次计算,与财务模型自动汇总的逻辑一致。
计算过程中,要写入的范围规则与普通计算等号左边一样,只能写可录入单元格。
目前rollup()中可传入的字段只有非自动汇总字段,如果传入自动汇总字段,则scope中要有accout父级可写成员,或version中有自上而下成员。
rollup函数支持多版本实体维的有效性过滤,使用时,需要在函数中传入参数with_parent=True。
with_parent默认为False,即不过滤实体激活表。
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()
回到顶部
咨询热线