IBM Planning Analytics(核心为TM1)的规则(Rules)是一种动态计算指令,它不存储计算结果,而是在用户访问单元格时实时执行计算。它主要用于处理无法通过维度层级汇总(Consolidation)直接实现的复杂业务逻辑。
规则是TM1引擎实现强大分析能力的核心机制之一。
⚙️ 核心机制:实时计算,不存储数据
与Excel中每个单元格都需要公式不同,TM1规则是集中定义,全局生效的。规则定义了计算逻辑,但并不存储计算结果。只有当用户查询(如在报表中查看)某个由规则定义的单元格时,TM1才会执行计算并返回结果。这确保了数据的一致性和实时性,同时也节省了存储空间。
✍️ 规则的语法与结构
一个规则语句的基本格式如下:
[Area] = [Qualifier:] Formula;
其组成部分包括:
-
Area(区域) :指定规则影响立方体(Cube)中的哪个部分。例如,
['Sales']表示该规则应用于"Sales"这个度量值。 -
Qualifier(限定符,可选):指定规则在哪个层级生效。
-
N::仅对叶子(Leaf)级别的元素生效。 -
C::仅对汇总(Consolidated)级别的元素生效。 -
若不指定,则对N和C级别都生效。
-
-
Formula(公式):具体的计算逻辑。它可以包含数学运算、函数调用等。
示例:
text
# 规则1:计算销售额(仅叶子级别生效)
['Sales'] = N: ['Price'] * ['Quantity'];
# 规则2:计算毛利率(所有级别生效)
['Gross Margin %'] = (['Sales'] - ['Costs']) \ ['Sales'];
💡 黄金法则 :因TM1自身的汇总引擎已非常高效,建模时应优先使用
N:级别规则 ,让系统自动完成汇总,避免不必要的C:或未限定规则,以提升性能。
🆚 规则 vs. 维度汇总
-
维度汇总(Consolidation) :维度中父元素的值是其所有子元素值的简单加总。这是TM1内置、最高效的计算方式。
-
规则(Rules) :用于处理非简单加总的计算。例如:
-
乘除运算(如销售额 = 价格 × 数量)
-
条件判断
-
跨立方体引用
-
比率计算(如利润率)
-
因此,能用维度汇总实现的,就 不要使用规则。
⛓️ 规则的"伙伴":Feeder
Feeder(馈送器)是规则体系中的关键部分。为了优化性能,TM1在聚合数据时会默认跳过空单元格。但由规则计算出的单元格在计算前是"空"的,可能会被跳过,导致结果为空。
Feeder的作用就是主动标记那些可能被规则计算出值的单元格,告诉TM1的聚合引擎"这些单元格未来会有值,请不要跳过"。
-
示例 :对于规则
['Sales'] = N: ['Price'] * ['Quantity'];,你需要编写Feeder:text
FEEDERS; ['Price'] => ['Sales']; ['Quantity'] => ['Sales'];这意味着,当
Price或Quantity任一有值时,就为对应的Sales单元格做一个"需要计算"的标记。
🚀 创建与管理规则
在 Planning Analytics Workspace (PAW) 中,你可以在建模工作台(Modeling Workbench)上创建和管理规则。
-
在数据库树中,右键点击 你想要创建规则的立方体(Cube)。
-
选择 "创建业务规则"(Create business rules) 新建,或 "编辑业务规则"(Edit business rules) 修改现有规则。
-
在规则编辑器(Rules Editor) 中编写和保存规则。
🎯 主要应用场景
规则是处理复杂财务和业务逻辑的利器,常见应用包括:
-
财务计算:计算收入、成本、毛利、利润率等。
-
跨立方体数据引用:从一个立方体引用数据到另一个立方体进行计算,例如引用汇率立方体进行货币换算。
-
预算与预测:基于历史数据和假设(如增长率)自动生成预测值。
-
驱动分配:根据业务动因(如人数、面积)将费用从总部分配到各个成本中心。
-
单元格级安全控制:通过规则动态控制用户对特定数据的读写权限。
💎 最佳实践与性能优化
-
宁少勿多:只对必要的计算使用规则,能用汇总(Consolidation)实现的绝不用规则。
-
精准Feeder:Feeder的编写要精确,避免"过度馈送"(Overfeeding),否则会消耗大量内存并拖慢性能。条件馈送器(Conditional Feeders)有助于实现这一点。
-
开启稀疏优化 :在规则文件开头加入
SKIPCHECK;声明,以启用稀疏聚合优化,跳过空单元格,大幅提升性能。 -
避免不必要的
IF语句 :IF语句是开销较大的操作,应尽可能用数学方式替代。 -
使用
STET函数 :STET函数可以"跳过"规则对特定区域的影响,用于处理规则覆盖的例外情况。 -
善用规则区域(Rule Regions):通过注释将规则文件分区,提升大型规则文件的可读性和可维护性。