2012-09-07 162 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