0

私は mdx クエリを初めて使用し、C# を使用した mdx クエリの生成に非常に興味があるので、デモやオープン ソースを検索したところ、必要なものを提供している Ranet.olap ( https://ranetulibraryolap.codeplex.com/ ) を見つけました。 . dll を取得した後、それらをコードに組み込んでみました。mdx クエリを生成する必要がある完全なコンソール コードを貼り付けていますが、そうではありません。何か問題がありますか?

using System;
using System.Collections.Generic;
using Microsoft.AnalysisServices.AdomdClient;
using Ranet.Olap.Core.Managers;
using Ranet.Olap.Core.Metadata;
using Ranet.Olap.Core.Types;

namespace MDX
{
    class Program
    {
        static void Main(string[] args)
        {
            startWork();
        }

        public static void startWork()
        {
            string connString = "Provider=MSOLAP.3; Data Source=localhost;Initial Catalog=AdventureWorkDW2008R2;Integrated Security=SSPI;";
            CubeDef cubes;
            AdomdConnection conn = new AdomdConnection(connString);
            conn.Open();
            cubes = conn.Cubes.Find("AdventureWorkCube");

            Ranet.Olap.Core.Managers.MdxQueryBuilder mdx = new Ranet.Olap.Core.Managers.MdxQueryBuilder();
            mdx.Cube = cubes.Caption;
            List<Ranet.Olap.Core.Wrappers.AreaItemWrapper> listColumn = new List<Ranet.Olap.Core.Wrappers.AreaItemWrapper>();
            List<Ranet.Olap.Core.Wrappers.AreaItemWrapper> listRow = new List<Ranet.Olap.Core.Wrappers.AreaItemWrapper>();
            List<Ranet.Olap.Core.Wrappers.AreaItemWrapper> listData = new List<Ranet.Olap.Core.Wrappers.AreaItemWrapper>();

            //Column area
            Dimension dmColumn = cubes.Dimensions.Find("Dim Product");
            Microsoft.AnalysisServices.AdomdClient.Hierarchy hColumn = dmColumn.Hierarchies["English Product Name"];
            //hierarchy properties
            List<PropertyInfo> lPropInfo = new List<PropertyInfo>();
            foreach (var prop in hColumn.Properties)
            {
                PropertyInfo p = new PropertyInfo();
                p.Name = prop.Name;
                p.Value = prop.Value;
                lPropInfo.Add(p);
            }
            Ranet.Olap.Core.Wrappers.AreaItemWrapper areaIColumn = new Ranet.Olap.Core.Wrappers.AreaItemWrapper();
            areaIColumn.AreaItemType = AreaItemWrapperType.Hierarchy_AreaItemWrapper;
            areaIColumn.Caption = hColumn.Caption;
            areaIColumn.CustomProperties = lPropInfo;
            listColumn.Add(areaIColumn);

            //Rows Area
            Dimension dmRow = cubes.Dimensions.Find("Due Date");
            Microsoft.AnalysisServices.AdomdClient.Hierarchy hRow = dmRow.Hierarchies["English Month Name"];
            List<PropertyInfo> lRowPropInfo = new List<PropertyInfo>();
            foreach (var prop in hRow.Properties)
            {
                PropertyInfo p = new PropertyInfo(prop.Name,prop.Value);
                lRowPropInfo.Add(p);
            }
            Ranet.Olap.Core.Wrappers.AreaItemWrapper areaIRow = new Ranet.Olap.Core.Wrappers.AreaItemWrapper();
            areaIRow.AreaItemType = AreaItemWrapperType.Hierarchy_AreaItemWrapper;
            areaIRow.Caption = hRow.Caption;
            areaIRow.CustomProperties = lRowPropInfo;
            listRow.Add(areaIRow);


            //Measure Area or Data Area
            Measure ms = cubes.Measures.Find("Order Quantity");
            Ranet.Olap.Core.Wrappers.AreaItemWrapper areaIData = new Ranet.Olap.Core.Wrappers.AreaItemWrapper();
            areaIData.AreaItemType = AreaItemWrapperType.Measure_AreaItemWrapper;
            areaIData.Caption = ms.Caption;

            List<PropertyInfo> lmpropInfo = new List<PropertyInfo>();

            foreach (var prop in ms.Properties)
            {
                PropertyInfo p = new PropertyInfo(prop.Name, prop.Value);
                lmpropInfo.Add(p);
            }
            areaIData.CustomProperties = lmpropInfo;
            listData.Add(areaIData);

            mdx.AreaWrappersColumns = listColumn;
            mdx.AreaWrappersRows = listRow;
            mdx.AreaWrappersData = listData;
            string mdxQuery = mdx.GenerateMdxQuery();
            conn.Close();
        }
    }
}
4

2 に答える 2

0

このエンジンのコードはまだ修正中ですが、いくつかの提案があります。

  • キューブのメタデータ (ディム、メジャーなど) を取得してジェネレーターに渡すだけのようです。これは、MDX を生成する方法とは思えません。MDX ステートメントは次のようになります。

    select 
    { 
      // measures, calculated members
    } on 0,
    {
      // dimension data - sets
    } on 1 // probably more axis
    from **Cube**
    

他のすべてのパラメータはオプションです

于 2015-02-06T11:35:56.637 に答える