针对聚合存储多维数据集的定制计算
自定义计算支持对聚合存储 (ASO) 多维数据集执行重复计算,从而扩展了 Essbase 的分析功能。您可以将特定多维数据集区域作为目标,以便计算、提供借项、贷项和抵销信息以进行会计处理。
您可以为更新目标级别 0 单元格的聚合存储多维数据集编写定制计算。定制计算脚本以 MDX 表示。
使用自定义计算,您可以对总账中的账户余额执行基本数学计算,并将结果写入 Essbase 聚合存储多维数据集的目标级别 0 成员。您可以对账户余额或固定金额执行计算,并且可以安排在每个会计期间重复计算。
当多维数据集用于总账报告时,自定义计算很有用,其中重复输入会计有效。借项(如资产和费用)必须与贷项(如权益和收入)平衡。
使用以下工作流创建并执行自定义计算:
-
创建以 MDX 表示的计算脚本。
-
选择将在其中执行计算的多维数据集区域。使用目标和 POV(视点)参数在执行时提供区域。
-
如果使用借记和贷记处理,请在大纲中选择借记和贷记成员以写入正值和负值。可在执行时提供这些参数。
-
如果使用偏移条目,请选择应进行偏移条目的区域。您使用 MDX 元组在执行时提供此参数。如果未指定偏移量或该偏移量为空,则不会执行偏移量计算。
注意:
在总账簿记中,抵销分录是分类账相反侧的平衡度量;例如,1 月的 $100 贷项可能将 $100 抵销添加到分类账的借方,因此可以平衡分类账,为即将发生的该金额费用做准备。
-
执行定制计算脚本。
自定义计算标准列表
为 Essbase 聚合存储 (ASO) 多维数据集设计定制计算时,要考虑的标准包括:POV(上下文区域)、MDX 计算脚本、目标(写入结果的位置)、源区域(由公式引用)、可选偏移值以及可选的贷项和借项成员。
自定义计算功能取决于各种指定的标准。请先检查这些术语,然后再继续。
表 38-1:自定义计算标准的说明
| 标准 | 说明 |
|---|---|
|
POV |
数据库中的对称区域,用于描述在其中执行自定义计算的上下文。 属性成员不能用于此参数。 |
|
计算程序 |
以 MDX 表示的计算脚本。 属性成员不能在等式左侧使用。 |
|
目标 |
以 MDX 表示的元组参数,用于定义写入计算结果的多维数据集中的区域。此参数与每个公式的左侧和偏移相结合,以确定结果和偏移值的写入位置。 属性成员不能用于此参数。 |
|
(可选)抵销 |
数据库中为每个来源金额写入偏移值的位置。 属性成员不能用于此参数。 |
|
(可选)贷记和借记成员 |
在双重输入会计中,平衡一个事务处理的日记账分录。两者都是 MDX 成员表达式。借方成员指明写入正结果值的成员,贷方成员指明写入负结果值的成员。 属性成员不能用于此参数。 |
|
源区域 |
一个 MDX 设置表达式,用于指定脚本中的公式所引用的多维数据集的区域。 |
编写和运行 ASO 自定义计算
为 Essbase 聚合存储多维数据集编写和执行定制计算,以更新目标级别 0 单元格。定制计算脚本以 MDX 表示。要运行脚本,请使用 MaxL 执行计算。
编写定制计算
定制计算脚本是您使用 .csc 扩展名创建和存储的文件。在 MDX 中使用一个或多个元组表达式对(以分号结尾)创建定制计算脚本。语法:
tuple := numeric_value_expression;元组是指定一个或多个成员的 MDX,其中每个成员都需要来自不同的维。元组必须位于方程式的左侧,并且是确定编写自定义计算结果的主要因素。
元组表达式中只允许使用成员名称。自定义计算脚本不支持使用 MDX 函数。
注意:
确定结果目标的次要因素是 target 参数,第三个因素是 POV 参数。在计算执行时指定第二个和第三个参数,而不是作为计算脚本的一部分。
numeric_value_expression 是一个简单的 MDX 数值表达式,例如数字或算术运算。表达式必须位于等式的右侧。仅允许使用算术运算符。如果使用非算术运算符(例如 AND、OR 或 IF 语句),则会返回错误。
成员名称可以用在数值表达式中,但是自定义计算脚本不支持使用成员函数。
属性成员不能在自定义计算脚本中的方程式左侧使用。
您还必须定义源区域,该区域用作 Essbase 的性能提示。Essbase 会预取源区域中指定的数据,并使用该数据执行脚本中指定的计算。
执行定制计算
您可以使用 MaxL 执行计算(聚合存储)语句运行定制计算。
您还可以通过调用 Java API 方法 IEssPerformCustomCalc.performCustomCalc 或 C API 函数 EssPerformCustomCalcASO 来使用 API 运行定制计算脚本。
您还可以使用 Oracle Hyperion Calculation Manager 设计定制计算并将其部署到 Enterprise Scheduling Services 中执行。
自定义计算的示例用例
此示例用例用于在 Essbase 聚合存储 (ASO) 多维数据集上进行自定义计算,它使用信用成员、借项成员和抵消来执行业务租赁费用分配。
考虑具有以下维的大纲:
-
公司,包含 CompanyA、CompanyB 和其他子项。
-
部门,包含编号的部门,例如 101、102 和 103。
-
帐户,其中帐户 5740 是租金费用帐户,SQFT 是用于记录每个部门的平方英尺数的统计帐户。
-
方案:实际成员在其中发布数据,分配成员在其中存储分配和自定义计算。方案成员是汇总子成员“实际”和“分配”的父代。
-
年,按月和季度组织的时间维。
-
地理位置,按州和城市组织的维。
-
AmountType ,其中借项是目标,贷项是抵销。
-
项目,包含项目(如 Proj1、Proj2)的维。
POV 是 MDX 集表达式,指示应执行定制计算的位置。它按如下方式指定:
CrossJoin( { ( [Company], [101], [Jan], [Scenario] ) },
Descendants( Geography, Geography.Levels(0)) )
DebitMember 是 MDX 成员表达式,指示应将正结果值写入到的借项成员。它指定为 [BeginningBalance_Debit]。
CreditMember 是一个 MDX 成员表达式,指示应将负值和抵销结果值写入到的信用成员。它指定为 [BeginningBalance_Credit]。
注意:
如果所有结果值的总和为负,则会将抵销写入借项成员。
offset 是一个 MDX 元组表达式,用于指示应当在何处进行 offsetting 项。它指定为 ([Account_NA], [Project_NA])。
偏移表达式与目标和 POV 组合,以确定创建偏移条目的位置。如果维重叠,则按该顺序解析偏移位置的顺序是偏移、目标和 POV。
目标是一个 MDX 元组表达式,指示在何处写入定制计算的结果。它指定为 (Allocation)。
目标表达式与 POV 以及定制计算脚本中每行的左侧组合,以确定写入结果的位置。如果维重叠,则按该顺序解析目标位置的顺序是方程式、目标和 POV 的左侧。在此示例中,结果将写入到分配成员,因为目标将覆盖在 POV 中指定的方案成员。
以下是定制计算脚本的示例:
(AccountA,Proj1) := 100;
([AccountB], [Proj1]) := ([AccountB], [Proj1]) * 1.1;
(AccountC,Proj1) :=
((AccountB,Proj1,2007) + (AccountB, Proj1)) / 2;
(AccountA,Proj2) :=
((AccountD,Proj1) +
(AccountB,Proj2)) / 2;对于 POV 中的每个组合,
-
计算脚本在当前 POV 组合的上下文中执行。
-
将一个偏移值写入目标位置。
注意:
每个公式(计算脚本中的行)同时执行,而不是按顺序执行。因此,不能在后续公式中使用一个公式的结果。
要定义源区域,请检查自定义计算脚本,并确定在方程式的右侧引用哪些成员。源区域至少应在自定义计算脚本中包括分配语句右侧的所有成员。
将源区域定义为单个 MDX 集。如果方程式右侧的成员来自多个维,则可以使用 CrossJoin 从两个集合创建集合。CrossJoin 只接受两个集合,因此您可能必须使用嵌套的 CrossJoin。
上述自定义计算脚本的源区域为:
Crossjoin(
{[AccountB], [AccountD]},
Crossjoin(
{[Proj1], [Proj2]}, {[2007]}
)
)
没有必要在源区域中包括脚本中未分配的任何成员。例如,如果将脚本中未使用的 [AccountC] 添加到源区域,则会将其忽略,并可能对性能造成轻微损害。
无需考虑源区域中的数字。例如,自定义计算脚本中的以下分配不需要添加到源区域:([Bud Var]):=10。
使用非模板优化自定义计算
使用 NONEMPTYTUPLE 属性,可以优化 Essbase 聚合存储 (ASO) 自定义计算脚本,以便在计算较大的稀疏数据集时跳过空元组以节省内存资源。
由于大型数据集可能非常稀疏,因此在定制计算脚本中使用 NONEMPTYTUPLE 属性可以优化脚本以节省内存资源。
在 MDX 中创建具有一个或多个元组表达式对的定制计算脚本,以分号终止。您可以选择通过在自定义计算脚本中包括 NONEMPTYTUPLE 属性子句来筛选出要计算的空结果集。
在定制计算脚本中使用 NONEMPTYTUPLE 属性子句时,向 Essbase 指示每次给定 nonempty_member_list 为空时为元组计算的单元格值为空。
语法
use_optimized_way;
tuple := [NONEMPTYTUPLE (nonempty_member_list)] numeric_value_expression;WHERE
-
use_optimized_way - 一个文字关键字,用于在计算脚本中使用 NONEMPTYTUPLE 属性。如果省略,将忽略 NONEMPTYTUPLE 指令。
-
tuple - 指定一个或多个成员的 MDX,其中每个成员都需要来自不同的维。
-
NONEMPTYTUPLE - 一个可选属性,可以用来优化计算性能。如果使用,则必须在此文字属性后面加上 nonempty_member_list。
-
nonempty_member_list - 来自不同维的一种或多个成员的名称(用逗号分隔)。
-
numeric_value_expression:一个简单的 MDX 数值表达式,例如数字或算术运算。表达式必须位于等式的右侧。仅允许使用算术运算符。如果使用非算术运算符(例如 AND、OR 或 IF 语句),则会返回错误。
示例
以下定制计算脚本示例包括 NONEMPTYTUPLE 属性子句,用于筛选出计算传递中不包括的空元组。
use_optimized_way;
([Balance].[Net Balance].[Net Change].[Allocation Out]):= NONEMPTYTUPLE ([Balance].[Remainder],[Rule]) -(([Balance].[Remainder],[Rule])*(20.24000/100));([2014], [August], [Actual]):= NONEMPTYTUPLE ([2014], [January], [Actual]) ([2014], [January], [Actual]);详细信息