使用脚本命令定义作用域分配
在 Analysis Services 中,多维表达式 (MDX) 脚本可以在脚本执行中的特定点应用于整个多维数据集或多维数据集的特定部分。您已经了解了默认脚本命令,CALCULATE 语句,该命令可基于默认作用域以聚合数据填充多维数据集中的单元。
默认作用域是整个多维数据集,但在上一个主题中提到,您可以使用 SCOPE 语句定义有更多限制的作用域,这称为“子多维数据集”,然后将 MDX 脚本只应用于特定的多维数据集空间。SCOPE 语句将定义计算脚本中所有后续的 MDX 表达式和语句的作用域,直到当前作用域终止或重新界定作用域。然后,使用 THIS 语句将 MDX 表达式应用于当前作用域。可以使用 BACK_COLOR 语句为当前作用域中的单元指定背景单元颜色,以在调试期间提供帮助。
在此主题的任务中,将使用 SCOPE 和 THIS 语句定义在 2005 会计年度内每个会计季度的销售配额。然后,在多维数据集中将销售配额分配到所有会计年度的月份级别。您还将了解如何使用断点帮助自己调试计算脚本。
按日期和雇员检查销售配额分配
按日期和雇员检查销售配额分配
打开 Analysis Services Tutorial 多维数据集的多维数据集设计器,然后单击**“浏览器”**选项卡。
从**“数据”窗格中删除所有层次结构和度量值,然后从“筛选器”**窗格中删除所有维度成员。
将**“销售配额”度量值从“销售配额”度量值组添加到“数据”窗格的“数据”**区域。
将**“日期”维度中的“会计日期”**用户定义层次结构添加到列区域。
将**“雇员”维度中的“雇员姓名”**属性层次结构添加到行区域。
注意,还没有为 2005 会计年度定义销售配额值。
在列区域中,单击**“会计年度”旁边的箭头按钮,清除“FY 2002”和“FY 2003”旁边的复选框,然后单击“确定”**。
在列区域中,依次展开 FY2004、H2 FY 2004 和 Q4 FY 2004。
注意,会计季度中的每个会计月份的销售配额与会计季度的销售配额的数量相同。这是因为“销售定额”度量值组中的时间维度的颗粒是季度级别,相关内容将在第 5 课中讨论。
下图显示了在 2004 会计年度的第四季度中每个月份都有销售配额的每个雇员的销售配额。
定义 2005 会计年度的销售配额计算的作用域
在此任务中,将检查当前作用域,并修改作用域,然后定义用来基于 2004 会计年度的值确定 2005 会计年度销售配额值的计算。
定义 2005 会计年度的销售配额计算的作用域
选择**“计算”选项卡,然后在工具栏上选择“窗体视图”**。
在**“脚本组织程序”窗格中,选择“大型分销商”,然后在“计算”选项卡的工具栏上,单击“新建脚本命令”**按钮。
注意,**“计算表达式”窗格中将出现空脚本,并且显示此脚本命令时,将在“脚本组织程序”**窗格中同时显示空白标题。
在**“计算表达式”**窗格中,键入下列语句:
/* Changing Scope to All or Default Member */ SCOPE (ROOT())
此 SCOPE 语句会将多维数据集作用域更改为“全部”,或默认值(即多维数据集中所有属性的成员)。
在**“计算”选项卡的工具栏上,单击“新建脚本命令”,然后在“计算表达式”**窗格中键入以下语句:
/* Defining the cube scope for the sales amount quotas for FY2005 */ SCOPE ()
注意,在右括号下面出现了红色波浪线,这说明必须在 SCOPE 语句的括号中定义一组成员。接着,将**“销售配额”**度量值添加到 SCOPE 语句中,以便在作用域中包括此度量值。
在**“计算工具”窗格中的“元数据”选项卡上,依次展开“度量值”、“销售配额”,然后将“销售配额”度量值拖至“计算表达式”**窗格内的 SCOPE 语句的括号中。
注意,红色波浪线将消失。下一步,将 FY 2005 维度成员添加到 SCOPE 语句中,以将此时间维度成员添加到当前作用域。
在**“计算工具”窗格的“元数据”选项卡上,依次展开“日期”维度、“会计”、“会计日期”和“会计年度”,再将 FY 2005 成员拖至“计算表达式”窗格中紧靠正在定义集合的“[销售配额]”**成员之后的 SCOPE 语句中。
注意,此集合的该新成员的**“[日期]”**部分下面将出现红色波浪线。此波浪线说明,紧靠此维度成员之前存在语法错误,因为在 SCOPE 语句中,集合的每个成员之间必须有逗号分隔。
在**“日期”维度中 FY 2005 成员的“[日期]”**部分之前添加必需的逗号。
注意,最初的红色曲线将会消失。下一步,将**“雇员”维度中“雇员”**用户定义的层次结构的成员添加到 SCOPE 语句中,以将这些成员添加到当前作用域内。
在**“计算工具”窗格的“元数据”选项卡中,展开“雇员”维度,再将“雇员”用户定义层次结构拖至“计算表达式”**窗格内紧靠正在定义集合的 [日期].[会计日期].[会计年度].&[2005] 成员后面的 SCOPE 语句中。
注意,在此集合的该新成员的**[雇员]**部分下面将出现红色波浪线,这表示在 SCOPE 语句中,集合的每个成员之间必须有逗号分隔。
在新成员的**“[雇员]”**部分之前添加必需的逗号。
请注意,红色波浪线已经消失。
在 SCOPE 语句中,在此集合的**“[雇员].[雇员]”**成员末尾添加以下子句,以完成集合的该第三个成员的定义:
.Members
此子句指定“雇员”维度中“雇员”层次结构的所有成员都应当包括在当前多维数据集作用域内。
验证已完成的 SCOPE 语句是否与以下脚本匹配:
SCOPE ([Measures].[Sales Amount Quota],[Date].[Fiscal Date].[Fiscal Year].&[2005], [Employee].[Employees].Members)
现在,对于将向其应用 MDX 表达式以计算 2005 会计年度销售配额数量的子多维数据集,您已完成了用来定义该子多维数据集的作用域定义。
在**“计算”选项卡的工具栏上,单击“脚本视图”**,再检查新添加的脚本命令。
注意,在**“计算表达式”**窗格中键入每个脚本命令时它都会出现,但会在每个脚本命令的末尾添加分号。另请注意,Analysis Services 已经在每个脚本命令前面插入了注释,以帮助您理解每个单独命令。
定义和测试 2005 会计年度新销售配额计算
在此任务中,您将向计算脚本添加新的脚本命令,以便计算**“雇员”维度的所有成员在 2005 会计年度的销售配额。但是,您不用在“窗体”视图中添加脚本命令,而是在“脚本”视图中直接添加脚本命令。在“脚本”**视图中,必须确保在每个脚本命令之间添加分号。
定义和测试 2005 会计年度的新销售配额计算
在**“脚本”**视图中,在计算脚本末尾的新行中键入以下语句:
/* Applying a calculation to the subcube */ THIS = [Date].[Fiscal Date].[Fiscal Year].&[2004] * 1.25;
THIS 语句将新值分配给位于子多维数据集的**“雇员”成员和 FY 2005 成员的交集处的“销售配额”度量值。新值基于在 2004 会计年度“雇员”成员和“销售配额”**度量值的交集所产生的值乘以 1.25。
在**“计算表达式”**窗格中,单击 THIS 语句的左侧空白处,以设置断点。
注意,此空白处会出现一个红点,并且该语句将以红色突出显示。在调试模式中执行此项目时,对项目的更改将部署到 Analysis Services 实例,多维数据集将会处理并执行计算脚本,直到遇到断点。然后可以逐个地单步执行其余脚本。如果不设置断点而在调试模式中运行项目,则计算脚本将在第一个脚本语句(CALCULATE 语句)处停止。
在**“调试”菜单上,单击“启动调试”**。也可以在键盘上按 F5。
将部署和处理项目并执行计算脚本,直到遇到断点。
隐藏所有停靠窗口,以提供更多区域来查看出现在**“计算”选项卡底部的“透视表”**窗格。
**“透视表”**窗格将有助于您进行调试。
在**“透视表”窗格中,将“销售配额”度量值添加到数据区域,再将“会计日期”用户定义层次结构添加到列区域,然后将“雇员”维度中的“雇员姓名”**属性层次结构添加到行区域。向下滚动到透视表的底部,然后检查已经为其分配了销售配额的雇员。
请注意,在**“销售配额”度量值的数据区域中,每个雇员的“销售配额”度量值的“会计年度”级别的 FY 2005 成员都不包含值。默认情况下,在调试模式中时,“透视表”**窗格中将显示空单元。
按 F10 可以执行 THIS 语句,并计算 2005 会计年度的销售配额。
请注意,现在将计算在**“透视表”窗格中位于“销售配额”度量值、FY 2005 维度成员和“雇员姓名”**成员的交集处的单元。另注意,THIS 语句所影响的单元突出显示为黄色。有个工具栏图标可用于启用或禁用已更改的单元的突出显示。默认情况下,将突出显示已更改的单元。
在**“透视表”**窗格中,清除与 FY 2002、FY 2003 和 FY 2004 相对应的复选框以将它们从列区域中删除。
右键单击数据区域中的任意位置,然后单击**“显示空单元”,以删除此选项旁边的选中标记,并隐藏所有空单元(“计算”**选项卡工具栏中也提供此选项)。这样,您可以更方便地查看有销售配额值的所有雇员。
在**“透视表”**窗格中,尝试展开列区域中的 FY 2005。
注意,由于位于**“销售配额”度量值和“雇员姓名”**属性层次结构的交集处的 H1 FY 2005 成员的值尚未计算(因为它们在当前作用域之外),因此无法展开 FY 2005。
若要查看 H1 FY 2005 成员的值的空单元,请单击**“透视表”窗格中的任意位置,然后单击“计算”选项卡工具栏上的“显示空单元”**,即可显示所有空单元。
在**“调试”菜单中,单击“停止调试”**,或在键盘上按 Shift-F5。
通过单击左边空白处中的红点来删除计算脚本中的断点。
为 2005 会计年度的上下半期和各季度分配销售配额
在此任务中,需要修改作用域,以包括 2005 会计年度的会计半期成员(而不是 2005 会计年度成员),然后将 2005 会计年度的销售配额值的一半分配给 2005 会计年度的每个半期。之后,修改作用域,以包括 2005 会计年度的会计季度成员(而不是 2005 会计年度成员),然后将 2005 会计年度的销售配额值的四分之一分配给 2005 会计年度的每个季度。最后,测试这些分配以完成此任务。
为 2005 会计年度的上下半期和各季度分配销售配额
在**“计算表达式”窗格的“脚本”**视图中,在计算脚本末尾的新行中键入以下语句:
/* Allocation of Sales Amount Quota to the 2005 Fiscal Semesters */ SCOPE ( [Date].[Fiscal Semester].[Fiscal Semester].Members );
因为该 SCOPE 语句和上一个 SCOPE 语句之间没有出现 END SCOPE 语句,所以该 SCOPE 语句是嵌套的 SCOPE 语句。当 SCOPE 语句被嵌套时,所嵌套的 SCOPE 语句将继承没有重新界定作用域的那些属性的父作用域。上一个 SCOPE 语句不直接修改**“销售配额”度量值、“雇员”用户定义层次结构或“会计日期”用户定义层次结构。它会转而通过使用 Members 函数来将“会计半期”属性层次结构的每个成员添加到子多维数据集定义中。有关详细信息,请参阅Members(集)(MDX)。由于嵌套 SCOPE 语句,多维数据集空间现在包括了在 2005 会计年度中的任何会计半期内位于“雇员”成员和“销售配额”**度量值的交集处的所有成员。请注意,在该多维数据集的 2005 会计年度中,当前只有一个会计半期。
在**“计算表达式”**窗格中,在计算脚本末尾的新行中键入以下语句:
THIS = [Date].[Fiscal Date].CurrentMember.Parent / 2;
此语句将会计季度的计算值分配给在所定义的多维数据集空间中的每个会计半期。CurrentMember.Parent 函数用于将其父级的值的一半分配给每个成员。有关详细信息,请参阅 CurrentMember (MDX) 和 Parent (MDX)。
在**“计算表达式”**窗格中,在计算脚本末尾的新行中键入以下语句:
/* Allocation of Sales Amount Quota to the 2005 Fiscal Quarters */ SCOPE ( [Date].[Fiscal Quarter].[Fiscal Quarter].Members );
因为该 SCOPE 语句和上一个 SCOPE 语句之间没有出现 END SCOPE 语句,所以该 SCOPE 语句也是嵌套的 SCOPE 语句。上一个 SCOPE 语句不直接修改**“销售配额”度量值、“雇员”用户定义层次结构或“会计日期”用户定义层次结构。它会转而通过使用 Members 函数来将“会计季度”属性层次结构的每个成员添加到子多维数据集定义中。因此,多维数据集空间现在包括了在 2005 会计年度的任何会计季度内位于“雇员”成员和“销售配额”**度量值的交集处的所有成员。请注意,在该多维数据集的 2005 会计年度中,当前只有一个会计季度。
在**“计算表达式”**窗格中,在计算脚本末尾的新行中键入以下语句:
THIS = [Date].[Fiscal Date].CurrentMember.Parent / 2;
此语句将会计季度的计算值分配给在所定义的多维数据集空间中的每个会计季度。CurrentMember.Parent 函数用来将其父级的值的一半分配给每个成员。
在**“计算表达式”**窗格中,单击最后一个 SCOPE 语句旁边的空白处,以设置断点,再按键盘上的 F5。
计算脚本将执行,直到遇到断点。
单击**“透视表”窗格的数据区域中的任意位置,然后单击“计算”选项卡工具栏上的“显示空单元”**,即可隐藏空单元。
请注意,将以与上一次执行调试器时所用的同一度量值和层次结构来填充数据窗格,并且 H1 FY 2005 成员的值已经计算出来,即其父级的值的一半,如下图所示。
最后注意,每个 FY 2005 成员的值将基于其成员的聚合进行重新计算,在这里,该成员是会计年度的第一个会计半期。2005 会计年度成员的值受“2005 会计半期”成员的计算所影响,因为每个脚本都将作为单独的过程执行。若要固定现有值,以使它不受计算脚本中随后语句的影响,请使用 FREEZE 语句。有关详细信息,请参阅 FREEZE 语句 (MDX)。
在列区域中,展开 H1 FY 2005。
注意,尚未计算 Q1 FY 2005 成员的值。
单击**“透视表”窗格的数据区域中的任意位置,然后单击“计算”选项卡工具栏上的“显示空单元”**。
在列区域中,展开 Q1 FY 2005。
请注意,没有为 2005 会计年度中第一个季度的两个月分配值,这是因为这些成员还不在当前子多维数据集的作用域中(直到执行脚本中的最后两个语句)。Analysis Services Tutorial 多维数据集中的时间维度只包含 2005 会计年度的前两个月。因此,没有 2005 会计年度第二季度成员。
按 F10 执行 SCOPE 语句,再次按 F10 执行计算脚本中的最后一个语句,该语句将计算应用于当前的子多维数据集。
注意,将计算 Q1 FY 2005 成员的值,并重新计算 Q1 FY 2005 的值和 FY2005 成员值(作为其子级成员的聚合),如下图所示。还要注意,将不计算 2005 会计年度中每个会计月份的值(2005 年的 7 月和 8 月)。在下一个过程中,将为每个季度分配合适的值。
在**“调试”菜单中,单击“停止调试”**,或在键盘上按 Shift-F5。
删除计算脚本中的断点。
为月份分配销售配额
在此过程中,将修改作用域,以在所有会计年度中包括会计月份级别(以前的作用域语句将计算限制为仅 2005 会计年度)。然后,将每个雇员的销售配额的会计季度值的三分之一分配给每个会计月份。
为月份分配销售配额
在**“计算表达式”**窗格中,在计算脚本末尾的新行中添加以下语句:
/* Allocate Quotas to Months */ SCOPE ( [Date].[Fiscal Date].[Month Name].Members );
此 SCOPE 语句是另一个嵌套的作用域语句,它修改了将对其应用 MDX 表达式的多维数据集空间,以便基于每个会计季度的值将销售配额分配给每个会计月份。此 SCOPE 语句与前面的嵌套 SCOPE 语句相似,但注意,**“会计日期”用户定义层次结构本身重新界定了作用域。因此,多维数据集空间的成员现在将包括“日期”**维度的所有会计月份成员,而不只是 2005 会计年度的会计月份成员。
注意 将多维数据集作用域的该修改与前面过程中的多维数据集作用域的修改进行比较,以确保您理解两个作用域更改语句之间的差异。
在**“计算表达式”**窗格中,在计算脚本末尾的新行中添加以下语句:
THIS = [Date].[Fiscal Date].CurrentMember.Parent / 3;
此语句将其父级(季度级别)的值的三分之一分配给会计日期层次结构的每个月份成员。此计算将应用于多维数据集中的所有会计月份。
在**“计算表达式”**窗格中,单击最后一个 THIS 语句的左边空白处,以设置断点,然后在键盘上按 F5。
检查 2004 年 7 月和 2004 年 8 月的值。
注意,当前没有计算 2004 年 7 月和 8 月的值。
右键单击**“数据”窗格中的任何位置,再单击“显示空单元”**,以只显示有值的单元。
这将让您更容易看到计算脚本中的最后一个语句是如何应用的。
按 F10 执行最后一个语句。
注意,每个雇员在每个会计月份的“销售配额”值的计算结果值等于其父级值的三分之一。
在列区域中,删除 FY 2005,再添加 Q4 FY 2004。
依次展开 FY 2004、H2 FY 2004 以及 Q4 FY 2004。
注意,每个会计月份的值等于会计季度的总计值。
在**“调试”菜单中,单击“停止调试”**。
删除计算脚本中的断点。
在工具栏上单击**“全部保存”**。