在Excel中使用VBA,如何获取服务器上所有OLAP多维数据集的名称?

时间:2015-03-04 20:28:00

标签: excel vba olap olap-cube

我工作的公司为每个客户创建了一个OLAP多维数据集数据库。我使用立方体中的值每天跟上很多事情。每当设置新的客户端多维数据集时,我都会向我使用的工作簿添加一个工作表,并使用该多维数据集创建一个数据透视表。我想创建一个宏来检查服务器是否有任何可能已添加的多维数据集。我想在下面做这样的事情,这将是最好的方式

For Each Cube in Server.Cubes MsgBox Cube.Name Next Cube

,但我找不到任何类似的东西。我已经搜索了几天的答案而没有运气。几乎任何通过服务器解析可用多维数据集的方法都会对我有所帮助。有任何想法吗?

1 个答案:

答案 0 :(得分:3)

SSAS服务器具有DMVs,您可以查询该服务器以确定服务器上的多维数据集数量。然后,您可以使用VBA将其与之前表中的行数进行比较。按照these instructions进行连接,或参见下文。

  1. 在Excel中创建新连接:在“获取外部数据”部分中,选择“来自其他来源” - > SQL Server(非Analysis Services)。
  2. 输入您可以连接的任何SQL Server的连接信息(我们将在稍后的步骤中更改此信息)。
  3. 选择您有权访问的任何数据库和表。在向导中移动并选择“仅保存连接”。
  4. 单击“连接”。找到您的连接,然后单击“属性”按钮。
  5. 在“定义”选项卡上,将连接字符串更新为

    Provider = MSOLAP.5; Integrated Security = SSPI; Persist Security Info = True; Initial Catalog = SSASDB; Data Source = MyServer \ MyInstance; MDX Compatibility = 1; Safety Options = 2; MDX Missing Member Mode = Error

  6. 将命令类型更改为默认

  7. 将命令文本更改为以下内容:

    SELECT [CATALOG_NAME] AS SSAS_Database_Name, [CUBE_NAME] AS Cube_or_Perspective_Name, [CUBE_CAPTION] AS Cube_or_Perspective_Caption, [CUBE_TYPE] AS Cube_Type, [BASE_CUBE_NAME] AS Base_Cube FROM $SYSTEM.MDSCHEMA_CUBES WHERE CUBE_SOURCE=1 AND [BASE_CUBE_NAME] < ''

  8. 单击“确定”,然后单击“关闭”。

  9. 单击“现有连接”。选择你的连接。

  10. 在“导入数据”窗口中选择“表”。选择将表放在新工作表上。

  11. 您的表格应位于A到E列。在单元格G2中放置Prior Row Count:

  12. 在单元格G3中放置Current Row Count:

  13. 在单元格H2中放入0.

  14. 在单元格H3中,输入以下公式:=COUNTA(Table_ExternalData_1[SSAS_Database_Name])

  15. 编写一个宏,将值从单元格H3复制到H2,然后刷新表格的数据连接。我看起来像这样: Sub UpdateCubeCount() Range("H3").Select Selection.Copy Range("H2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("B2").Select Application.CutCopyMode = False Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False End Sub

  16. 作为奖励,将条件格式添加到单元格H3。将其格式化为具有粉红色背景和红色文本的规则Cell Value&gt; $ H $ 2
  17. 你最终得到的东西看起来像这样: enter image description here

    更新:如果您正在寻找SSAS数据库而不是立方体本身,您可以使用此查询而不是步骤7中的查询:

    SELECT [catalog_name] AS SSAS_Database_Name, [date_modified] 
    FROM $system.DBSCHEMA_CATALOGS
    

    如果您可以假设每个数据库只有一个多维数据集,这将非常有用,这很常见。