0

私のプロジェクトの一部として、セルセットをデータテーブルに変換する必要があります。このメソッドの呼び出し元が、どのディメンションが列として必要で、どのディメンションが行に必要かを指定できれば素晴らしいでしょう。メジャーについても同様です。ポインタはありますか?

4

2 に答える 2

3

最近、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 に関する私の経験は限られています。プロジェクトの要件に必要なものを調べただけなので、概念に関する「単純な」説明で申し訳ありません。

于 2014-05-12T14:24:50.237 に答える
0

プロジェクトでXMLAを使用する場合は、多次元データセットまたは表形式の行セットの 2 つの形式から選択できます。

  • 多次元データセット:

    この形式は、セルセットを提供します (既にご存じでしょう)。

  • 表形式の行セット:

    これは、データテーブルに変換する方が簡単なはずです。

于 2012-09-08T09:21:45.000 に答える