2012-09-07 116 views
0

作为我的一个项目的一部分,我需要将cellset转换为数据表。如果这个方法的调用者可以指定需要哪些维度作为列,哪些维度是行所需要的,那么这将是非常好的,对于度量也是如此。任何指针? 多维数据集表格行集将CellSet转换为DataTable

回答

0

如果在项目中使用XMLA你可以在2格式之间进行选择。

  • 多维数据集:

    这种格式会给你一个单元集(你已经知道了)。

  • 表格行集:

    这一个应该更容易转换成数据表。

2

我最近需要在我的项目中执行MDX查询,这严重依赖于ADO数据集和数据表。实际上,要求能够看到MDX查询执行时我在SSMS中看到的内容。

例如,当该MDX在AdventureWorks数据库执行

select 
{[Sales Territory].[Sales Territory].[Country].&[France]} on columns, 
[Product].[Category].[All Products] on Rows 
from 
[Adventure Works] 

结果集,我们得到的是:

   |  France 
===================================== 
All Products | $4,607,537.94 

对于这个结果,一个数据表有两列创建包含单个数据行。第二列中的“法国”值是其标题,而不是列名。

我用这个函数将一个网格集转换成一个数据表。未提供函数GetColumnName(num)基于传递的num整数值为列返回一个名称。

Function Cellset2Datatable(ByVal cs As CellSet) As DataTable 

     Dim dt As New DataTable 
     Dim dc As DataColumn 
     Dim dr As DataRow 
     Dim i, j As Integer 

     Dim num As Integer = 0 
     Dim nNumberOfGroupingColumns As Integer = 0 


     If cs.Axes.Count > 1 Then 
      For Each m As Member In cs.Axes(1).Positions(0).Members 
       num += 1 
       dc = New DataColumn 
       dc.ColumnName = GetColumnName(num) 
       dt.Columns.Add(dc) 
       nNumberOfGroupingColumns += 1 
      Next 
     End If 



     Dim sCaption As String 

     For Each p As Position In cs.Axes(0).Positions 
      sCaption = "" 
      For Each m As Member In p.Members 
       If sCaption.Equals("") Then 
        sCaption = String.Format("[{0}]", m.Caption.Trim) 
       Else 
        sCaption = String.Format("{0}/[{1}]", sCaption, m.Caption.Trim) 
       End If 
      Next 

      num += 1 
      dc = New DataColumn 
      dc.ColumnName = GetColumnName(num) 
      dc.Caption = sCaption 
      dt.Columns.Add(dc) 
     Next 


     'import data 

     Dim x As Integer, y As Integer 
     Dim py As Position 

     If nNumberOfGroupingColumns > 0 Then 

      For y = 0 To cs.Axes(1).Positions.Count - 1 
       py = cs.Axes(1).Positions(y) 
       i = 0 

       dr = dt.NewRow 

       For Each m As Member In py.Members 
        dr.Item(i) = m.Caption 
        i += 1 
       Next 

       For x = 0 To cs.Axes(0).Positions.Count - 1 
        dr.Item(i) = cs(x, y).Value 
        i += 1 
       Next 

       dt.Rows.Add(dr) 
      Next 

     Else 

      dr = dt.NewRow 

      For i = 0 To cs.Axes(0).Positions.Count - 1 
       dr.Item(i) = cs(i).Value 
      Next 

      dt.Rows.Add(dr) 

     End If 

     Return dt 

    End Function 

首先,添加列。进行检查,以查看是否在垂直轴存在的任何“分组”列存在并且在这种情况下,相应的列被添加:

If cs.Axes.Count > 1 Then 
     For Each m As Member In cs.Axes(1).Positions(0).Members 
      num += 1 
      dc = New DataColumn 
      dc.ColumnName = GetColumnName(num) 
      dt.Columns.Add(dc) 
      nNumberOfGroupingColumns += 1 
     Next 
    End If 

下一步是添加对应于水平轴的列

For Each p As Position In cs.Axes(0).Positions 
     sCaption = "" 
     For Each m As Member In p.Members 
      If sCaption.Equals("") Then 
       sCaption = String.Format("[{0}]", m.Caption.Trim) 
      Else 
       sCaption = String.Format("{0}/[{1}]", sCaption, m.Caption.Trim) 
      End If 
     Next 

     num += 1 
     dc = New DataColumn 
     dc.ColumnName = GetColumnName(num) 
     dc.Caption = sCaption 
     dt.Columns.Add(dc) 
    Next 

此步骤中的列标题用于存储所有级别值。例如, [附件]。[法国]。[互联网订单计数]变为[附件]/[法国]/[互联网订单计数]。 最后一步是将数据导入到数据表中。这两种情况都在这里处理:是否存在“分组”列。

该函数不处理存在两个以上轴的情况。

我在分析服务和MDX方面的经验有限,我刚刚研究了项目需求,所以我对关于概念的“简单”描述表示歉意。

+0

只是简单地倾销代码而没有解释会鼓励复制和粘贴,并可能导致对OP缺乏真正的理解。建议你在这个帖子附加一些解释代码的每个部分。请记住,OP可能是初学者,因此代码倾销可能会被证明是压倒性的。 – rayryeng

+0

谢谢,我刚刚编辑了我的帖子。 – dbar

+0

Upvoted!感谢您的帮助 – rayryeng