ssasolap-cube

SSAS Cube Metadata using SSIS script component with C# program


I am using script component in ssis with C# code using Microsoft.Analysisservices namespace to fetch the cube metadata. The code looks somewhat like this

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using Microsoft.AnalysisServices;
using System.Windows.Forms;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{

//IDTSConnectionManager100 connMgr;
Server OLAPServer = new Server();    

public override void AcquireConnections(object Transaction)
{
    OLAPServer.Connect(this.Connections.OLAPConnection.ConnectionString);
}


public override void PreExecute()
{
    base.PreExecute();
    /*
      Add your code here for preprocessing or remove if not needed
    */
}

public override void PostExecute()
{
    base.PostExecute();
    /*
      Add your code here for postprocessing or remove if not needed
      You can set read/write variables here, for example:
      Variables.MyIntVar = 100
    */
}

public override void CreateNewOutputRows()
{
    IDTSVariables100 vars = null;
    string OLAPDBName;
    VariableDispenser.LockOneForRead("OLAPDBName", ref vars);
    Database OLAPDB;

    OLAPDBName = vars[0].Value.ToString();
    try
    {
        OLAPDB = OLAPServer.Databases.GetByName(OLAPDBName);
    }
    catch
    {
        return;
    }

    // loop through cubes
        CubeCollection Cubes = OLAPDB.Cubes;
        MeasureGroupCollection Mgroups;
        CubeDimensionCollection Dimensions;
        MeasureGroupDimensionCollection MgroupDims;
        DimensionAttributeCollection Attributes;



      foreach (Cube cb in Cubes)
      { 
        //Test for one Measure Group
        //MeasureGroup mgroup = Mgroups.GetByName("Inward Exposure");

          Mgroups = cb.MeasureGroups;
        // all dimensions associated with that Measure Group

          // loop through Measure Groups
          foreach (MeasureGroup mg in Mgroups)
          {
              // loop though all cube dimensions
              Dimensions = cb.Dimensions;**strong text**
              foreach (CubeDimension dim in Dimensions)
              {
                   bool CanBeAnalysed = false;**strong text**
                  // loop through dimensions and see if dimension exists in mgroupDims (ie check if it can be analysed)

                  MgroupDims = mg.Dimensions;
                  foreach (MeasureGroupDimension mgd in MgroupDims)
                  {
                      if (mgd.CubeDimension == dim)
                      {
                          CanBeAnalysed = true;

                          break;
                      }

                  }


                 // loop through each Measure and Attribute a
                  String DimName = dim.Name;
                  bool DimVisible = dim.Visible;
                  String MgroupName = mg.Name;
                  String CubeName = cb.Name;
                  String MeasureExpression;
                  String Description;




                  // for every attribute in dimension
                  Attributes = dim.Dimension.Attributes;                          

                  foreach (DimensionAttribute Attr in Attributes)
                  {
                      String AttrName = Attr.Name;
                      bool AttrVisible = Attr.AttributeHierarchyVisible;
                      String AttrNameColumn = Attr.NameColumn.ToString();
                      String AttributeRelationship = Attr.AttributeRelationships.ToString();

                      // get every measure in measuregroup

                      foreach (Measure m in mg.Measures)
                      {
                          String MeasureName = m.Name.ToString();
                          bool MeasureVisible = m.Visible;
                          String MeasureNameColumn = m.Source.ToString();


                          if (m.MeasureExpression != null)
                          {
                             // MessageBox.Show(m.MeasureExpression.ToString());
                              MeasureExpression = m.MeasureExpression.ToString();

                          }
                          else 
                          {
                             // MessageBox.Show(m.MeasureExpression.ToString());
                              MeasureExpression = " " ;
                          }

                          if (m.Description != null)
                          {
                              // MessageBox.Show(m.MeasureExpression.ToString());
                              Description = m.Description.ToString();

                          }
                          else
                          {
                              // MessageBox.Show(m.MeasureExpression.ToString());
                              Description = " ";
                          }



                          Output0Buffer.AddRow();
                          Output0Buffer.OLAPDBName = OLAPDBName;
                          Output0Buffer.CubeName = CubeName;
                          Output0Buffer.DimensionName = DimName;
                          Output0Buffer.DimensionVisible = DimVisible;
                          Output0Buffer.AttrDDSColumn = AttrNameColumn;
                          Output0Buffer.AttrName = AttrName;
                          Output0Buffer.AttrVisible = AttrVisible;
                          Output0Buffer.MeasureGroupName = MgroupName;
                          Output0Buffer.MeasureName = MeasureName;
                          Output0Buffer.MeasureVisible = MeasureVisible;
                          Output0Buffer.MeasureDDSColumn = MeasureNameColumn;
                          Output0Buffer.IsAnalysable = CanBeAnalysed;
                          Output0Buffer.MeasureExpression = MeasureExpression;
                          Output0Buffer.Description = Description;
                          Output0Buffer.AttributeRelationship = AttributeRelationship;

                      }
                  }   




              } // end of Cube Dim Loop

          } // end of Measure Group loop

      } // end of cube loop


}


}

I was successful in getting the cube metadata with the above code.However, i am stuck at getting the metadata of the perspective cube and the Relationships of the measure groups i.e whether the measure groups are many-many. Any help is very much appreciated.


Solution

  • Here is some code for detecting dimension relationships including many-to-many. See the GetDimensionUsage function: https://raw.githubusercontent.com/BIDeveloperExtensions/bideveloperextensions/master/SSAS/PrinterFriendlyDimensionUsage.cs

    Here is some code around navigating perspectives: https://raw.githubusercontent.com/BIDeveloperExtensions/bideveloperextensions/master/SSAS/TriStatePerspectivesPlugin.cs

    Start reading around the following line:

    if (perspective.MeasureGroups.Contains(mg.Name))