使用脚本命令定义作用域分配

在本课前面两个主题的任务中,您已经了解了如何将计算成员和命名集计算添加到多维数据集的计算脚本中。除了这两个特定类型的多维表达式 (MDX) 计算以外,还可以使用新建脚本命令在 MDX 支持的多维数据集中执行大多数操作。

在 Microsoft SQL Server 2005 Analysis Services (SSAS) 中,MDX 脚本可以在脚本执行过程中的特定位置应用于整个多维数据集,或应用于多维数据集的特定部分。您已经了解了默认脚本命令,CALCULATE 语句,该命令可基于默认作用域以聚合数据填充多维数据集中的单元。

默认作用域是整个多维数据集,但在上一个主题中提到,您可以使用 SCOPE 语句定义有更多限制的作用域,这称为“子多维数据集”**,然后将 MDX 脚本只应用于特定的多维数据集空间。SCOPE 语句将定义计算脚本中所有后续的 MDX 表达式和语句的作用域,直到当前作用域终止或重新界定作用域。然后,使用 THIS 语句将 MDX 表达式应用于当前作用域。可以使用 BACK_COLOR 语句为当前作用域中的单元指定背景单元颜色,以在调试期间提供帮助。

在此主题的任务中,将使用 SCOPETHIS 语句定义在 2005 会计年度内每个会计季度的销售配额。然后,在多维数据集中将销售配额分配到所有会计年度的月份级别。您还将了解如何使用断点帮助自己调试计算脚本。

按时间和雇员检查销售配额分配

按时间和雇员检查销售配额分配

  1. 打开 Analysis Services Tutorial 多维数据集的多维数据集设计器,然后单击**“浏览器”**选项卡。

  2. 从**“数据”窗格中删除所有层次结构和度量值,然后从“筛选器”**窗格中删除所有维度成员。

  3. 将**“销售配额”度量值从“销售配额”度量值组添加到“数据”窗格的“数据”**区域。

  4. 将用户定义的层次结构**“会计时间”**添加到列。

  5. 将**“雇员姓名”**属性层次结构添加到行区域。

    注意,还没有为 2005 会计年度定义销售配额值。

  6. 在列区域中,删除 FY 2002FY 2003

  7. 在列区域中,依次展开 FY2004H1 FY 2004Q3 FY 2004

    注意,会计季度中的每个会计月份的销售配额与会计季度的销售配额的数量相同。这是因为“销售定额”度量值组中的时间维度的颗粒是季度级别,相关内容将在第 5 课中讨论。

    下图显示了在 2004 会计年度的第四季度中每个月份都有销售配额的每个雇员的销售配额。

    每个会计月的销售配额

定义 2005 会计年度的销售配额计算的作用域

在此任务中,将检查当前作用域,并修改作用域,然后定义用来基于 2004 会计年度的值确定 2005 会计年度销售配额值的计算。

定义 2005 会计年度的销售配额计算的作用域

  1. 选择**“计算”选项卡,然后在工具栏上选择“窗体视图”**。

  2. 在**“脚本组织程序”窗格中,选择“大型分销商”,然后在“计算”选项卡的工具栏上,单击“新建脚本命令”**。

    注意,**“计算表达式”窗格中将出现空脚本,并且显示此脚本命令时,将在“脚本组织程序”**窗格中同时显示空白标题。

  3. 在**“计算表达式”**窗格中,键入下列语句:

    /* Changing Scope to All or Default Member */
    SCOPE (ROOT())
    

    SCOPE 语句会将多维数据集作用域更改为“全部”,或默认值(即多维数据集中所有属性的成员)。

  4. 在**“计算”选项卡的工具栏上,单击“新建脚本命令”,然后在“计算表达式”**窗格中键入以下语句:

    /* Defining the cube scope for the sales amount quotas for FY2005 */
    SCOPE ()
    

    注意,在右括号下面出现了红色波浪线,这说明必须在 SCOPE 语句的括号中定义一组成员。这需要将**“销售配额”**度量值添加到 SCOPE 语句中,以便在作用域中包括此度量值。

  5. 在**“计算工具”窗格中的“元数据”选项卡上,依次展开“度量值”“销售配额”,然后将“销售配额”度量值拖至“计算表达式”**窗格内的 SCOPE 语句的括号中。

    注意,红色波浪线将消失。下一步,将 FY 2005 维度成员添加到 SCOPE 语句中,以将此时间维度成员添加到当前作用域。

  6. 在**“计算工具”窗格的“元数据”选项卡上,依次展开“日期”“会计”“会计时间”“会计年度”,再将 FY 2005 成员拖至“计算表达式”窗格中紧靠正在定义集合的“[销售配额]”**成员之后的 SCOPE 语句中。

    注意,此集合的该新成员的**[日期]**部分下面将出现红色波浪线。此波浪线说明,紧靠此维度成员之前存在语法错误,因为在 SCOPE 语句中,集合的每个成员之间必须有逗号分隔。

  7. 在**“日期”维度中 FY 2005 成员的“[日期]”**部分之前添加必需的逗号。

    注意,最初的红色曲线将会消失。下一步,将**“雇员”维度中“雇员”**用户定义的层次结构的成员添加到 SCOPE 语句中,以将这些成员添加到当前作用域内。

  8. 在**“计算工具”窗格的“元数据”选项卡中,展开“雇员”,再将“雇员”用户定义的层次结构拖至“计算表达式”**窗格内紧靠正在定义集合的 [日期].[会计时间].[会计年度].&[2005] 成员后面的 SCOPE 语句中。

    注意,在此集合的该新成员的**[雇员]**部分下面将出现红色波浪线,这表示在 SCOPE 语句中,集合的每个成员之间必须有逗号分隔。

  9. 在新成员的**[雇员]**部分之前添加必需的逗号。

    注意,最初的红色曲线将会消失。

  10. SCOPE 语句中,在此集合的**“[雇员].[多个雇员]”**成员末尾添加以下子句,以完成集合的该第三个成员的定义:

    .Members
    

    此子句指定“雇员”维度中“雇员”层次结构的所有成员都应当包括在当前多维数据集作用域内。

  11. 验证已完成的 SCOPE 语句是否与以下脚本匹配:

    SCOPE ([Measures].[Sales Amount Quota],[Date].[Fiscal Time].[Fiscal Year].&[2005], [Employee].[Employees].Members)
    

    现在,对于将向其应用 MDX 表达式以计算 2005 会计年度销售配额数量的子多维数据集,您已完成了用来定义该子多维数据集的作用域定义。

  12. 在**“计算”选项卡的工具栏上,单击“脚本视图”**,再检查新添加的脚本命令。

    注意,在**“计算表达式”**窗格中键入每个脚本命令时它都会出现,但会在每个脚本命令的末尾添加分号。另外,每个脚本命令前面的注释有助于您理解每个单独的命令,如下图所示。

    “计算表达式”窗格

定义和测试 2005 会计年度新销售配额计算

在此过程中,您将向计算脚本添加新的脚本命令,以为**“雇员”维度的所有成员计算其 2005 会计年度的销售配额。但是,您不用在“窗体”视图中添加脚本命令,而是在“脚本”视图中直接添加脚本命令。在“脚本”**视图中,必须确保在每个脚本命令之间添加分号。

定义和测试 2005 会计年度的新销售配额计算

  1. 在**“脚本”**视图中,在计算脚本末尾的新行中键入以下语句:

    /* Applying a calculation to the subcube */
    THIS = [Date].[Fiscal Time].[Fiscal Year].&[2004] * 1.25;
    

    THIS 语句将新值分配给位于子多维数据集的**“雇员”成员和 FY 2005 成员的交集处的“销售配额”度量值。新值基于在 2004 会计年度“雇员”成员和“销售配额”**度量值的交集所产生的值乘以 1.25。

  2. 在**“计算表达式”**窗格中,单击 THIS 语句的左侧空白处,以设置断点。

    注意,此空白处会出现一个红点,并且该语句将以红色突出显示,如下图所示。在调试模式中执行此项目时,对项目的更改将部署到 Analysis Services 实例,多维数据集将会处理并执行计算脚本,直到遇到断点。然后可以逐个地单步执行其余脚本。如果不设置断点而在调试模式中运行项目,则计算脚本将在第一个计算脚本(CALCULATE 语句)处停止。

    “计算表达式”窗格中的断点集

  3. 在**“调试”菜单中,单击“启动调试”**(或按键盘上的 F5)。

    将部署和处理项目并执行计算脚本,直到遇到断点。

  4. 隐藏所有停靠窗口,以提供更多区域来查看出现在**“计算”选项卡底部的“透视表”**窗格。

    如下图所示的**“透视表”**窗格将有助于您进行调试。

    用于协助调试的数据窗格

  5. 在**“透视表”窗格中,将“销售配额”度量值添加到数据区域,再将“日期.会计时间”用户定义的层次结构添加到列区域,然后将“雇员姓名”属性层次结构从“雇员”**维度添加到行区域。

    请注意,在**“销售配额”度量值的数据区域中,每个雇员的“销售配额”度量值的“会计年度”级别的 FY 2005 成员都不包含值,如下图所示。默认情况下,在调试模式中时,“透视表”**窗格中将显示空单元。

    在调试期间数据窗格中的空单元

  6. F10 可以执行 THIS 语句,并计算 2005 会计年度的销售配额。

    请注意,现在将计算在**“透视表”窗格中位于“销售配额”度量值、FY 2005 维度成员和“雇员姓名”**成员的交集处的单元。另注意,THIS 语句所影响的单元突出显示为黄色。有个工具栏图标可用于启用或禁用已更改的单元的突出显示。默认情况下,将突出显示已更改的单元。

  7. 在**“透视表”**窗格中,从列区域中删除 FY 2002FY 2003FY 2004

  8. 右键单击数据区域中的任意位置,然后单击**“显示空单元”,以删除此选项旁边的选中标记,并隐藏所有空单元(“计算”**选项卡工具栏中也提供此选项)。这将使您更容易查看有销售配额值的所有雇员,如下图所示。

    显示“销售配额”值的数据窗格

  9. 在**“透视表”**窗格中,尝试展开列区域中的 FY 2005

    注意,由于位于**“销售配额”度量值和“雇员姓名”**属性层次结构的交集处的 H1 FY 2005 成员的值尚未计算(因为它们在当前作用域之外),因此无法展开 FY 2005

  10. 若要查看 H1 FY 2005 成员的值的空单元,请单击**“透视表”窗格中的任意位置,然后单击“计算”选项卡工具栏上的“显示空单元”**,即可显示所有空单元,如下图所示。

    显示 2005 会计年度的数据窗格

  11. 在**“调试”菜单中,单击“停止调试”**(或在键盘上按 Shift-F5)。

  12. 通过单击左边空白处中的断点,删除计算脚本中的断点。

为 2005 会计年度的上下半期和各季度分配销售配额

在此过程中,需要修改作用域,以包括 2005 会计年度的会计半期成员,而不是 2005 会计年度成员,然后将 2005 会计年度的销售配额值的一半分配给 2005 会计年度的每个半期。之后,修改作用域,以包括 2005 会计年度的会计季度成员,而不是 2005 会计年度成员,然后将 2005 会计年度的销售配额值的四分之一分配给 2005 会计年度的每个季度。最后,测试这些分配。

为 2005 会计年度的上下半期和各季度分配销售配额

  1. 在**“计算表达式”窗格的“脚本”**视图中,在计算脚本末尾的新行中键入以下语句:

    /* Allocation of Sales Amount Quota to the 2005 Fiscal Semesters */
    SCOPE ( [Date].[Fiscal Semester].[Fiscal Semester].Members ); 
    

    SCOPE 语句是嵌套的 SCOPE 语句,因为此 SCOPE 语句和上一个 SCOPE 语句之间没有出现 END SCOPE 语句。当 SCOPE 语句被嵌套时,所嵌套的 SCOPE 语句将继承没有重新界定作用域的那些属性的父作用域。上一个 SCOPE 语句不直接修改**“销售配额”度量值、“雇员”用户定义的层次结构或“会计时间”用户定义的层次结构。它会转而将“会计半期”属性层次结构的每个成员添加到子多维数据集定义中(通过使用 Members 函数)。有关详细信息,请参阅Members(集)(MDX)。由于嵌套 SCOPE 语句,多维数据集空间现在包括了在 2005 会计年度中的任何会计半期内位于“雇员”成员和“销售配额”**度量值的交集处的所有成员(在该多维数据集的 2005 会计年度中,当前只有一个会计半期)。

  2. 在**“计算表达式”**窗格中,在计算脚本末尾的新行中键入以下语句:

    THIS = [Date].[Fiscal Time].CurrentMember.Parent / 2;
    

    此语句将会计季度的计算值分配给在所定义的多维数据集空间中的每个会计半期。CurrentMember.Parent 函数用来将其父级的值的四分之一分配给每个成员。有关详细信息,请参阅 CurrentMember (MDX)Parent (MDX)

  3. 在**“计算表达式”**窗格中,在计算脚本末尾的新行中键入以下语句:

    /* Allocation of Sales Amount Quota to the 2005 Fiscal Quarters */
    SCOPE ( [Date].[Fiscal Quarter].[Fiscal Quarter].Members ); 
    

    SCOPE 语句也是嵌套的 SCOPE 语句,因为此 SCOPE 语句和上一个 SCOPE 语句之间没有出现 END SCOPE 语句。上一个 SCOPE 语句不直接修改**“销售配额”度量值、“雇员”用户定义的层次结构或“会计时间”用户定义的层次结构。它会转而将“会计季度”属性层次结构的每个成员添加到子多维数据集定义中(通过使用 Members 函数)。因此,多维数据集空间现在包括了在 2005 会计年度的任何会计季度内位于“雇员”成员和“销售配额”**度量值的交集处的所有成员(在该多维数据集的 2005 会计年度中,当前只有一个会计季度)。

  4. 在**“计算表达式”**窗格中,在计算脚本末尾的新行中键入以下语句:

    THIS = [Date].[Fiscal Time].CurrentMember.Parent / 2;
    

    此语句将会计季度的计算值分配给在所定义的多维数据集空间中的每个会计季度。CurrentMember.Parent 函数用来将其父级的值的一半分配给每个成员。

  5. 在**“计算表达式”**窗格中,单击最后一个 SCOPE 语句旁边的空白处,以设置断点,再按键盘上的 F5

    计算脚本将执行,直到遇到断点。

  6. 单击**“透视表”窗格的数据区域中的任意位置,然后单击“计算”选项卡工具栏上的“显示空单元”**,即可隐藏空单元。

    请注意,将以与上一次执行调试器时所用的同一度量值和层次结构来填充数据窗格,并且 H1 FY 2005 成员的值已经计算出来,即其父级的值的一半,如下图所示。

    最后注意,每个 FY 2005 成员的值将基于其成员的聚合进行重新计算,在这里,该成员是会计年度的第一个会计半期。2005 会计年度成员的值受“2005 会计半期”成员的计算所影响,因为每个脚本都将作为单独的过程执行。若要固定现有值,以使它不受计算脚本中随后语句的影响,请使用 FREEZE 语句。有关详细信息,请参阅 FREEZE 语句 (MDX)

    使用 FREEZE 固定的现有值

  7. 在列区域中,展开 H1 FY 2005

    注意,尚未计算 Q1 FY 2005 成员的值。

  8. 单击**“透视表”窗格的数据区域中的任意位置,然后单击“计算”选项卡工具栏上的“显示空单元”**。

  9. 在列区域中,展开 Q1 FY 2005

    注意,没有为 2005 会计年度中第一个季度的两个月分配值,这是因为这些成员还不在当前子多维数据集的作用域中(直到执行脚本中最后两个语句)。Analysis Services Tutorial 多维数据集中的时间维度只包含 2005 会计年度的前两个月。因此,没有 2005 会计年度第二季度成员。

  10. F10 执行 SCOPE 语句,再次按 F10 执行计算脚本中的最后一个语句,该语句将计算应用于当前的子多维数据集。

    注意,将计算 Q1 FY 2005 成员的值,并重新计算 Q1 FY 2005 的值和 FY2005 成员值(作为其子级成员的聚合),如下图所示。还要注意,将不计算 2005 会计年度中每个会计月份的值(2005 年的 7 月和 8 月)。在下一个过程中,将为每个季度分配合适的值。

    计算出的 Q1 FY 2005 成员的值

  11. 在**“调试”菜单中,单击“停止调试”**(或在键盘上按 Shift-F5)。

  12. 删除计算脚本中的断点。

为月份分配销售配额

在此过程中,将修改作用域,以在所有会计年度中包括会计月份级别(以前的作用域语句将计算限制为仅 2005 会计年度)。然后,将每个雇员的销售配额的会计季度值的三分之一分配给每个会计月份。

为月份分配销售配额

  1. 在**“计算表达式”**窗格中,在计算脚本末尾的新行中添加以下语句:

    /* Allocate Quotas to Months */
    SCOPE ( [Date].[Fiscal Time].[Fiscal Month].Members );
    

    SCOPE 语句是另一个嵌套的作用域语句,它修改了将对其应用 MDX 表达式的多维数据集空间,以便基于每个会计季度的值将销售配额分配给每个会计月份。此 SCOPE 语句与前面的嵌套 SCOPE 语句相似,但注意,**“会计时间”用户定义的层次结构本身重新界定了作用域。因此,多维数据集空间的成员现在将包括“日期”**维度的所有会计月份成员,而不只是 2005 会计年度的会计月份成员。

    ms169878.note(zh-cn,SQL.90).gif注意:
    将多维数据集作用域的该修改与前面过程中的多维数据集作用域的修改进行比较,以确保您理解两个作用域更改语句之间的差异。
  2. 在**“计算表达式”**窗格中,在计算脚本末尾的新行中添加以下语句:

    THIS = [Date].[Fiscal Time].CurrentMember.Parent / 3; 
    

    此语句将其父级(季度级别)的值的三分之一分配给会计时间层次结构的每个月份成员。此计算将应用于多维数据集中的所有会计月份。

  3. 在**“计算表达式”**窗格中,单击最后一个 THIS 语句的左边空白处,以设置断点,然后在键盘上按 F5

  4. 检查 2004 年 7 月和 2004 年 8 月的值。

    注意,当前没有计算 2004 年 7 月和 8 月的值。

  5. 右键单击**“数据”窗格中的任何位置,再单击“显示空单元”**,以只显示有值的单元。

    这将让您更容易看到计算脚本中的最后一个语句是如何应用的。

  6. F10 执行最后一个语句。

    注意,每个雇员在每个会计月份的“销售配额”值的计算结果值等于其父级值的三分之一,如下图所示。

    计算出的“销售配额”值

  7. 在列区域中,删除 FY 2005,再添加 Q4 FY 2004

  8. 依次展开 FY 2004、H2 FY 2004 以及 Q4 FY 2004

    注意,每个会计月份的值等于会计季度的总计值,如下图所示。

    计算出的每个会计月的值

  9. 在**“调试”菜单中,单击“停止调试”**。

  10. 删除计算脚本中的断点。

  11. 在工具栏上单击**“全部保存”**。

ms169878.note(zh-cn,SQL.90).gif注意:
通过下载并安装已更新的示例,可以获得第 6 课中使用的完整项目。有关详细信息,请参阅安装示例中的“获取已更新的示例”。

下一课

第 7 课:定义关键性能指标 (KPI)

请参阅

其他资源

创建和编辑 MDX 脚本
SCOPE 语句 (MDX)
FORE_COLOR 和 BACK_COLOR 内容 (MDX)
This (MDX)
FREEZE 语句 (MDX)
CurrentMember (MDX)
Parent (MDX)
Members(集)(MDX)

帮助和信息

获取 SQL Server 2005 帮助