私のプロジェクトの一部として、セルセットをデータテーブルに変換する必要があります。このメソッドの呼び出し元が、どのディメンションが列として必要で、どのディメンションが行に必要かを指定できれば素晴らしいでしょう。メジャーについても同様です。ポインタはありますか?
2 に答える
最近、ADO データセットとデータテーブルに大きく依存するプロジェクトで MDX クエリを実行する必要がありました。実際の要件は、MDX クエリが実行されたときに SSMS で表示されるものを多かれ少なかれ表示できるようにすることでした。
たとえば、AdventureWorks データベースでこの mdx を実行すると、
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
この結果のために、1 つのデータ行を含む 2 つの列を持つデータテーブルが作成されます。2 列目の "France" の値は、列名ではなくキャプションです。
この関数を使用して、セルセットをデータテーブルに変換しました。提供されない関数 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
このステップの列のキャプションは、すべてのレベル値を格納するために使用されます。たとえば、[アクセサリー].[フランス].[インターネット注文数] は、[アクセサリー] / [フランス] / [インターネット注文数] になります。最後のステップは、データをデータテーブルにインポートすることです。ここでは、「グループ化」列が存在するかどうかに関係なく、両方のケースが処理されます。
この関数は、2 つ以上の軸が存在する場合を処理しません。
分析サービスと MDX に関する私の経験は限られています。プロジェクトの要件に必要なものを調べただけなので、概念に関する「単純な」説明で申し訳ありません。
プロジェクトでXMLAを使用する場合は、多次元データセットまたは表形式の行セットの 2 つの形式から選択できます。
多次元データセット:
この形式は、セルセットを提供します (既にご存じでしょう)。
表形式の行セット:
これは、データテーブルに変換する方が簡単なはずです。