IBM Planning Analytics 的规则(Rules)

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'];

    这意味着,当PriceQuantity任一有值时,就为对应的Sales单元格做一个"需要计算"的标记。

🚀 创建与管理规则

在 Planning Analytics Workspace (PAW) 中,你可以在建模工作台(Modeling Workbench)上创建和管理规则。

  1. 在数据库树中,右键点击 你想要创建规则的立方体(Cube)

  2. 选择 "创建业务规则"(Create business rules) 新建,或 "编辑业务规则"(Edit business rules) 修改现有规则。

  3. 规则编辑器(Rules Editor) 中编写和保存规则。

🎯 主要应用场景

规则是处理复杂财务和业务逻辑的利器,常见应用包括:

  • 财务计算:计算收入、成本、毛利、利润率等。

  • 跨立方体数据引用:从一个立方体引用数据到另一个立方体进行计算,例如引用汇率立方体进行货币换算。

  • 预算与预测:基于历史数据和假设(如增长率)自动生成预测值。

  • 驱动分配:根据业务动因(如人数、面积)将费用从总部分配到各个成本中心。

  • 单元格级安全控制:通过规则动态控制用户对特定数据的读写权限。

💎 最佳实践与性能优化

  • 宁少勿多:只对必要的计算使用规则,能用汇总(Consolidation)实现的绝不用规则。

  • 精准Feeder:Feeder的编写要精确,避免"过度馈送"(Overfeeding),否则会消耗大量内存并拖慢性能。条件馈送器(Conditional Feeders)有助于实现这一点。

  • 开启稀疏优化 :在规则文件开头加入 SKIPCHECK; 声明,以启用稀疏聚合优化,跳过空单元格,大幅提升性能。

  • 避免不必要的IF语句IF语句是开销较大的操作,应尽可能用数学方式替代。

  • 使用STET函数STET函数可以"跳过"规则对特定区域的影响,用于处理规则覆盖的例外情况。

  • 善用规则区域(Rule Regions):通过注释将规则文件分区,提升大型规则文件的可读性和可维护性。