long GetCount(CellSetData cs_descr)
        {
            long result = 0;

            if (cs_descr != null)
            {
                // Сами элементы - по оси 0
                // По оси 1 - св-ва элементов
                if (cs_descr.Axes.Count > 0)
                {
                    result = cs_descr.Axes[0].Positions.Count;
                }
                //// Сами элементы - по оси 0
                //// По оси 1 - св-ва элементов
                //if (cs_descr.Axes.Count == 1 && cs_descr.Axes[0].Positions.Count == 1 && cs_descr.Cells.Count == 1)
                //{
                //    if (cs_descr.Cells[0] != null && cs_descr.Cells[0].Value != null && cs_descr.Cells[0].Value.Value != null)
                //    {
                //        try
                //        {
                //            result = Convert.ToInt64(cs_descr.Cells[0].Value.Value);
                //        }
                //        catch
                //        {
                //        }
                //    }
                //}
            }
            return(result);
        }
 public CellSetDataProvider(CellSetData cs_descr, DataReorganizationTypes reorganizationType)
 {
     m_CellSet_Descr        = cs_descr;
     DataReorganizationType = reorganizationType;
     m_Columns = CreateFields(0);
     m_Rows    = CreateFields(1);
 }
예제 #3
0
        public CellSetData RefreshQuery(Func <MdxObject, MdxObject> objectConsumerPattern)
        {
            CellSetData res = null;

            if (!string.IsNullOrEmpty(Query))
            {
                using (MdxDomProvider provider = MdxDomProvider.CreateProvider())
                {
                    StringBuilder sb = new StringBuilder();
                    provider.GenerateMdxFromDom(this.CreateWrappedStatement(), sb, new MdxGeneratorOptions());

                    String new_Query = sb.ToString();

                    res = ExecuteQuery(new_Query);
                    //if (!String.IsNullOrEmpty(res))
                    //{
                    //    Application[QUERY] = new_Query;
                    //}
                }
            }
            else
            {
                // Пустой запрос
                res = new CellSetData();
            }
            return(res);
        }
        public List <MemberDataWrapper> GetChildrenMembers(String cubeName, String subCube, String memberUniqueName)
        {
            String Set = "{" + String.Format("{0}.Children", memberUniqueName) + "}";

            String from_Set = GenerateFromSet(cubeName, subCube);

            // Запрос для выполнения
            String query = "Select " + Set + " Dimension Properties KEY0, HIERARCHY_UNIQUE_NAME, PARENT_UNIQUE_NAME on 0, {} on 1 from " + from_Set;

            CellSetData cs_descr = GetDescription(query);

            return(GetMembers(cs_descr));
        }
예제 #5
0
        public override String ExportToExcel()
        {
            String result = String.Empty;

            try
            {
                CellSetData       res           = RefreshQuery();
                PivotDataProvider pivotProvider = new PivotDataProvider(new CellSetDataProvider(res));
                result = ExportHelper.ExportToExcel(pivotProvider);
            }
            catch
            {
                result = string.Empty;
            }
            return(result);
        }
        void OlapDataLoader_DataLoaded(object sender, DataLoaderEventArgs e)
        {
            bool stopWaiting = true;

            try
            {
                if (e.Error != null)
                {
                    LogManager.LogError(this, e.Error.ToString());
                    return;
                }

                if (e.Result.ContentType == InvokeContentType.Error)
                {
                    LogManager.LogError(this, e.Result.Content);
                    return;
                }

                MdxQueryArgs mdx_args = e.UserState as MdxQueryArgs;
                if (mdx_args != null)
                {
                    CellSetData cs_descr = CellSetData.Deserialize(e.Result.Content);
                    InitializeTuple(cs_descr);

                    // Зачитываем метаданные куба в целом
                    stopWaiting = false;
                    LogManager.LogInformation(this, this.Name + " - Loading cube metadata.");
                    MetadataQuery args = CommandHelper.CreateGetCubeMetadataArgs(Connection, CubeName, MetadataQueryType.GetCubeMetadata_AllMembers);
                    OlapDataLoader.LoadData(args, args);
                }

                MetadataQuery metadata_args = e.UserState as MetadataQuery;
                if (metadata_args != null)
                {
                    CubeDefInfo cs_descr = XmlSerializationUtility.XmlStr2Obj <CubeDefInfo>(e.Result.Content);
                    m_CopyControl.InitializeMetadata(cs_descr);
                }
            }
            finally
            {
                if (stopWaiting)
                {
                    IsWaiting = false;
                }
            }
        }
예제 #7
0
 void OnDatesLoaded(CellSetData cs_descr)
 {
     m_LoadedMembers.Clear();
     if (cs_descr.Axes.Count > 0)
     {
         foreach (PositionData position in cs_descr.Axes[0].Positions)
         {
             if (position.Members.Count > 0)
             {
                 if (!m_LoadedMembers.ContainsKey(cs_descr.Axes[0].Members[position.Members[0].Id].UniqueName))
                 {
                     m_LoadedMembers.Add(cs_descr.Axes[0].Members[position.Members[0].Id].UniqueName, cs_descr.Axes[0].Members[position.Members[0].Id]);
                 }
             }
         }
     }
 }
 void InitializeTuple(CellSetData cs_descr)
 {
     if (cs_descr != null)
     {
         CellSetDataProvider cellSetProvider = new CellSetDataProvider(cs_descr);
         CellInfo            cell            = cellSetProvider.GetCellInfo(0, 0);
         if (cell != null)
         {
             IDictionary <String, MemberWrap> slice = new Dictionary <String, MemberWrap>();
             IDictionary <String, MemberInfo> tuple = cell.GetTuple();
             foreach (String hierarchyUniqueName in tuple.Keys)
             {
                 slice.Add(hierarchyUniqueName, new MemberWrap(tuple[hierarchyUniqueName]));
             }
             m_CopyControl.Initialize(slice);
         }
     }
 }
        public List <MemberDataWrapper> GetMembers(String cubeName, String subCube, String set)
        {
            List <MemberDataWrapper> list = new List <MemberDataWrapper>();

            if (String.IsNullOrEmpty(set))
            {
                return(list);
            }

            String from_Set = GenerateFromSet(cubeName, subCube);

            // Запрос для выполнения
            String query = "Select " + set + " Dimension Properties KEY0, HIERARCHY_UNIQUE_NAME, PARENT_UNIQUE_NAME on 0, {} on 1 from " + from_Set;

            CellSetData cs_descr = GetDescription(query);

            return(GetMembers(cs_descr));
        }
        public MemberDataWrapper GetMember(String cubeName, String memberUniqueName, List <LevelPropertyInfo> memberProperties)
        {
            StringBuilder builder = new StringBuilder();
            StringBuilder members = new StringBuilder();

            members.Append("{");
            if (memberProperties != null && memberProperties.Count > 0)
            {
                // Формируем строку WITH MEMBER
                builder.Append("WITH ");
                int           i = 0;
                List <String> used_properties = new List <String>();
                foreach (LevelPropertyInfo prop in memberProperties)
                {
                    if (!used_properties.Contains(prop.Name))
                    {
                        String memberName = String.Format("[Measures].[-{0}-]", prop.Name);
                        if (i > 0)
                        {
                            members.Append(", ");
                        }
                        members.Append(memberName);

                        builder.AppendFormat("MEMBER {0} AS {1} ", memberName, String.Format("'{0}.Level.Hierarchy.CurrentMember.Properties(\"{1}\", TYPED)'", memberUniqueName, prop.Name));
                        i++;
                        used_properties.Add(prop.Name);
                    }
                }
            }
            members.Append("}");

            // Select
            builder.AppendFormat("Select {0} on 0, {1} on 1 from {2}", memberUniqueName, members, OlapHelper.ConvertToQueryStyle(cubeName));

            CellSetData cs_descr          = GetDescription(builder.ToString());
            List <MemberDataWrapper> list = GetMembers(cs_descr);

            if (list != null && list.Count > 0)
            {
                return(list[0]);
            }
            return(null);
        }
예제 #11
0
        void Loader_DataLoaded(object sender, DataLoaderEventArgs e)
        {
            if (e.Error != null)
            {
                LogManager.LogError(this, e.Error.ToString());
                this.m_Clear.Visibility = System.Windows.Visibility.Collapsed;
                this.viewer.Content     = e.Error.ToString();
                this.IsWaiting          = false;
                return;
            }

            if (e.Result.ContentType == InvokeContentType.Error)
            {
                LogManager.LogError(this, e.Result.Content);
                this.m_Clear.Visibility = System.Windows.Visibility.Collapsed;
                this.viewer.Content     = e.Result.Content;
                this.IsWaiting          = false;
                return;
            }

            try
            {
                CellSetData cs_descr = CellSetData.Deserialize(e.Result.Content);
                OnDatesLoaded(cs_descr);
                UpdateGridCells();
                this.IsWaiting = false;
            }
            catch (Exception exc)
            {
                this.IsWaiting          = false;
                this.m_Clear.Visibility = System.Windows.Visibility.Collapsed;
                LogManager.LogError(this, exc.Message);
                throw new Exception(exc.Message);
                //this.viewer.Content = exc.Message;
                //throw exc;
            }
            //CellSetData cs_descr = XmlSerializationUtility.XmlStr2Obj<CellSetData>(e.Result);
        }
예제 #12
0
        void Loader_DataLoaded(object sender, DataLoaderEventArgs e)
        {
            IsBusy = false;

            if (e.Error != null)
            {
                LogManager.LogError(this, e.Error.ToString());
                return;
            }

            if (e.Result.ContentType == InvokeContentType.Error)
            {
                LogManager.LogError(this, e.Result.Content);
                return;
            }

            //CellSetData cs_descr = XmlSerializationUtility.XmlStr2Obj<CellSetData>(e.Result);
            CellSetData cs_descr = CellSetData.Deserialize(e.Result.Content);

            OnDatesLoaded(cs_descr);

            UpdateDates();
        }
        static CellConditionsDescriptor Deserialize(XmlReader reader)
        {
            if (reader != null)
            {
                try
                {
                    CellConditionsDescriptor target = null;

                    if (!(reader.NodeType == XmlNodeType.Element &&
                          reader.Name == XML_CellConditionsDescriptor))
                    {
                        reader.ReadToFollowing(XML_CellConditionsDescriptor);
                    }

                    if (reader.NodeType == XmlNodeType.Element &&
                        reader.Name == XML_CellConditionsDescriptor)
                    {
                        target = new CellConditionsDescriptor();
                        reader.Read();

                        var data = Jayrock.Json.Conversion.JsonConvert.Import(reader.Value) as JsonArray;
                        target.MemberUniqueName = data[0] != null?CellSetData.ConvertFromJson(data[0]).ToString() : String.Empty;

                        var conditions = data.GetArray(1);
                        for (int i = 0; i < conditions.Length; i++)
                        {
                            var cond_data = conditions.GetArray(i);

                            CellCondition cond = new CellCondition();
                            String        type = cond_data.GetValue(0) != null?cond_data.GetValue(0).ToString() : CellConditionType.None.ToString();

                            cond.ConditionType = (CellConditionType)(CellConditionType.Parse(typeof(CellConditionType), type, true));
                            cond.Value1        = Convert.ToDouble(cond_data.GetValue(1));
                            cond.Value2        = Convert.ToDouble(cond_data.GetValue(2));

                            var cellAppearance = cond_data.GetArray(3);
                            cond.Appearance.BackColor      = FromJsonColor(cellAppearance.GetArray(0));
                            cond.Appearance.BorderColor    = FromJsonColor(cellAppearance.GetArray(1));
                            cond.Appearance.ForeColor      = FromJsonColor(cellAppearance.GetArray(2));
                            cond.Appearance.CustomImageUri = Convert.ToString(cellAppearance.GetValue(3));

                            var options = cellAppearance.GetArray(4);
                            cond.Appearance.Options.IgnoreAllOptions = Convert.ToBoolean(options[0]);
                            cond.Appearance.Options.ShowValue        = Convert.ToBoolean(options[1]);
                            cond.Appearance.Options.UseAllOptions    = Convert.ToBoolean(options[2]);
                            cond.Appearance.Options.UseBackColor     = Convert.ToBoolean(options[3]);
                            cond.Appearance.Options.UseBorderColor   = Convert.ToBoolean(options[4]);
                            cond.Appearance.Options.UseForeColor     = Convert.ToBoolean(options[5]);
                            cond.Appearance.Options.UseImage         = Convert.ToBoolean(options[6]);
                            cond.Appearance.Options.UseProgressBar   = Convert.ToBoolean(options[7]);

                            var progressBarOptions = cellAppearance.GetArray(5);
                            cond.Appearance.ProgressBarOptions.StartColor      = FromJsonColor(progressBarOptions.GetArray(0));
                            cond.Appearance.ProgressBarOptions.EndColor        = FromJsonColor(progressBarOptions.GetArray(1));
                            cond.Appearance.ProgressBarOptions.MinValue        = Convert.ToDouble(progressBarOptions.GetValue(2));
                            cond.Appearance.ProgressBarOptions.MaxValue        = Convert.ToDouble(progressBarOptions.GetValue(3));
                            cond.Appearance.ProgressBarOptions.IsIndeterminate = Convert.ToBoolean(progressBarOptions.GetValue(4));

                            target.Conditions.Add(cond);
                        }

                        if (reader.NodeType == XmlNodeType.EndElement &&
                            reader.Name == XML_CellConditionsDescriptor)
                        {
                            reader.ReadEndElement();
                        }
                    }
                    return(target);
                }
                catch (XmlException ex)
                {
                    throw ex;
                    //return null;
                }
            }
            return(null);
        }
        public long GetMembersCount(String cubeName, String subCube, String hierarchyUniqueName, int levelIndex)
        {
            String from_Set = GenerateFromSet(cubeName, subCube);

            StringBuilder builder = new StringBuilder();

            // В случае, если в выражении FROM используется подкуб то вычисление количества дочерних методом:
            //  WITH MEMBER [Measures].[-Special_ChildrenCount-]
            //  AS 'Count(AddCalculatedMembers([Product].[Product Categories].CurrentMember.Children))'
            //  срабатывает некорректно.
            // В данном случае чтобы получить число дочерних с учетом подкуба правильно делать так:
            //  WITH SET [-SpecialSet-] as [Product].[Product Categories].Members
            //  MEMBER [Measures].[-Special_ChildrenCount-]
            //  AS Intersect([-SpecialSet-],[Product].[Product Categories].CurrentMember.Children).Count

            String SPECIAL_SET    = "[-SpecialSet-]";
            String set_expression = String.Empty;

            if (UseCalculatedMembers)
            {
                set_expression = String.Format("AddCalculatedMembers({0}.Members)", hierarchyUniqueName);
            }
            else
            {
                set_expression = "{" + String.Format("{0}.Members", hierarchyUniqueName) + "}";
            }
            String children_expression = String.Empty;

            if (UseCalculatedMembers)
            {
                children_expression = String.Format("AddCalculatedMembers({0}.CurrentMember.Children)", hierarchyUniqueName);
            }
            else
            {
                children_expression = "{" + String.Format("{0}.CurrentMember.Children", hierarchyUniqueName) + "}";
            }

            builder.AppendFormat("WITH SET {0} as {1} ", SPECIAL_SET, set_expression);
            String countStr = String.Format("'Intersect({0}, {1}).Count'", SPECIAL_SET, children_expression);

            builder.AppendFormat(" MEMBER {0} AS {1} ", CHILDREN_COUNT_MEMBER, countStr);

            // СТАРЫЙ ВАРИАНТ - НЕ УЧИТЫВАЕТ ПОДКУБ
            //String countStr = String.Format("Count(AddCalculatedMembers({0}.Levels({1}).Members))", hierarchyUniqueName, levelIndex);
            //builder.AppendFormat("WITH MEMBER {0} AS '{1}' ", CHILDREN_COUNT_MEMBER, countStr);

            String members_expression = String.Empty;

            if (UseCalculatedMembers)
            {
                members_expression = String.Format("AddCalculatedMembers({0}.Levels({1}).Members)", hierarchyUniqueName, levelIndex);
            }
            else
            {
                members_expression = "{" + String.Format("{0}.Levels({1}).Members", hierarchyUniqueName, levelIndex) + "}";
            }

            builder.AppendFormat("Select {0} on 0, {1} on 1 from {2}", members_expression, CHILDREN_COUNT_MEMBER, from_Set);

            CellSetData cs_descr = GetDescription(builder.ToString());
            long        count    = GetCount(cs_descr);

            return(count);
        }
 public CellSetDataProvider(CellSetData cs_descr)
     : this(cs_descr, DataReorganizationTypes.MergeNeighbors)
 {
 }
예제 #16
0
 public CellSetDataProvider(CellSetData cs_descr)
 {
     m_CellSet_Descr = cs_descr;
 }
예제 #17
0
        private String ExportToExcel(String schema)
        {
            InvokeResultDescriptor result = new InvokeResultDescriptor();
            String res = String.Empty;

            try
            {
                String sessionId  = String.Empty;
                String connection = String.Empty;
                try
                {
                    MdxQueryArgs args = XmlSerializationUtility.XmlStr2Obj <MdxQueryArgs>(schema);
                    if (args != null)
                    {
                        sessionId  = args.SessionId;
                        connection = args.Connection;
                        DefaultQueryExecuter queryExecuter = new DefaultQueryExecuter(GetConnection(args.Connection));
                        if (args.Queries.Count > 0)
                        {
                            res = queryExecuter.GetCellSetDescription(args.Queries[0], ref sessionId);
                        }
                    }
                }
                catch (AdomdConnectionException connection_ex)
                {
                    result.Content     = connection_ex.Message;
                    result.ContentType = InvokeContentType.Error;
                }
                catch (AdomdErrorResponseException response_ex)
                {
                    result.Content     = response_ex.Message;
                    result.ContentType = InvokeContentType.Error;
                }
                catch (AdomdUnknownResponseException unknown_ex)
                {
                    result.Content     = unknown_ex.Message;
                    result.ContentType = InvokeContentType.Error;
                }
                catch (InvalidOperationException invalid_ex)
                {
                    result.Content     = invalid_ex.Message;
                    result.ContentType = InvokeContentType.Error;
                }

                if (!String.IsNullOrEmpty(res))
                {
                    CellSetData       cs            = CellSetData.Deserialize(res);
                    PivotDataProvider pivotProvider = new PivotDataProvider(new CellSetDataProvider(cs));
                    res = ExportHelper.ExportToExcel(pivotProvider);
                }

                result.Content = res;
                if (UseCompress)
                {
                    // Архивация строки
                    String compesed = ZipCompressor.CompressAndConvertToBase64String(res);
                    result.Content   = compesed;
                    result.IsArchive = true;
                }
                result.ContentType = InvokeContentType.MultidimData;
                result.Headers.Add(new Header(InvokeResultDescriptor.SESSION_ID, sessionId));
                result.Headers.Add(new Header(InvokeResultDescriptor.CONNECTION_ID, connection));
            }
            catch (Exception)
            {
                throw;
            }
            return(InvokeResultDescriptor.Serialize(result));
        }
        ///// <summary>
        ///// ворзвращает всех предков элементов Set
        ///// </summary>
        ///// <param name="set"></param>
        ///// <param name="cubeName"></param>
        ///// <param name="hierarchyUniqueName"></param>
        ///// <param name="ancestorUniqueName"></param>
        ///// <param name="UseHierarchize"></param>
        ///// <returns></returns>
        //public List<MemberDataWrapper> LoadAscendantsToSet(String set, String cubeName, String hierarchyUniqueName, String ancestorUniqueName)
        //{
        //    if (String.IsNullOrEmpty(set))
        //        throw new ArgumentNullException("set");

        //    String tmp = "{" + set + "}";

        //    //Запрос - который ворзвращает всех предков элементов Set, и сам Set
        //    string NewSet =
        //        "Except(" +
        //        "Generate(" +
        //        tmp + "," +
        //        "Ascendants(" + hierarchyUniqueName + ".CurrentMember" + ")" +
        //        ")" +
        //        ", " + tmp + ")";

        //    return LoadSet(NewSet, cubeName, hierarchyUniqueName, ancestorUniqueName, true);
        //}

        /// <summary>
        /// Выполняет запрос к кубу для получения данных указанного Set
        /// </summary>
        /// <param name="set">Set который нужно получить</param>
        /// <param name="useHierarchize">Использовать Hierarchize</param>
        /// <returns>CellSetData с результатом запроса</returns>
        internal List <MemberDataWrapper> LoadSet(String set, String cubeName, String subCube, String hierarchyUniqueName, bool useHierarchize)
        {
            if (String.IsNullOrEmpty(set))
            {
                throw new ArgumentNullException("set");
            }
            if (String.IsNullOrEmpty(hierarchyUniqueName))
            {
                throw new ArgumentNullException("hierarchyUniqueName");
            }
            if (String.IsNullOrEmpty(cubeName))
            {
                throw new ArgumentNullException("cubeName");
            }

            // Запрос для выполнения
            StringBuilder builder = new StringBuilder();

            String from_Set = GenerateFromSet(cubeName, subCube);

            String members = "{" + CHILDREN_COUNT_MEMBER;

            // В случае, если в выражении FROM используется подкуб то вычисление количества дочерних методом:
            //  WITH MEMBER [Measures].[-Special_ChildrenCount-]
            //  AS 'Count(AddCalculatedMembers([Product].[Product Categories].CurrentMember.Children))'
            //  срабатывает некорректно.
            // В данном случае чтобы получить число дочерних с учетом подкуба правильно делать так:
            //  WITH SET [-SpecialSet-] as [Product].[Product Categories].Members
            //  MEMBER [Measures].[-Special_ChildrenCount-]
            //  AS Intersect([-SpecialSet-],[Product].[Product Categories].CurrentMember.Children).Count

            String SPECIAL_SET    = "[-SpecialSet-]";
            String set_expression = String.Empty;

            if (UseCalculatedMembers)
            {
                set_expression = String.Format("AddCalculatedMembers({0}.Members)", hierarchyUniqueName);
            }
            else
            {
                set_expression = "{" + String.Format("{0}.Members", hierarchyUniqueName) + "}";
            }
            String children_expression = String.Empty;

            if (UseCalculatedMembers)
            {
                children_expression = String.Format("AddCalculatedMembers({0}.CurrentMember.Children)", hierarchyUniqueName);
            }
            else
            {
                children_expression = "{" + String.Format("{0}.CurrentMember.Children", hierarchyUniqueName) + "}";
            }

            builder.AppendFormat("WITH SET {0} as {1} ", SPECIAL_SET, set_expression);
            String countStr = String.Format("'Intersect({0}, {1}).Count'", SPECIAL_SET, children_expression);

            builder.AppendFormat(" MEMBER {0} AS {1} ", CHILDREN_COUNT_MEMBER, countStr);

            // СТАРЫЙ ВАРИАНТ - НЕ УЧИТЫВАЕТ ПОДКУБ
            //String countStr = String.Format("'Count(AddCalculatedMembers({0}.CurrentMember.Children))' ", hierarchyUniqueName);
            //builder.AppendFormat("WITH MEMBER {0} AS {1} ", CHILDREN_COUNT_MEMBER, countStr);

            // Список свойств, которые будем получать дополнительно
            IList <String> memberProperties = new List <String>();

            memberProperties.Add("KEY0");
            memberProperties.Add("HIERARCHY_UNIQUE_NAME");
            memberProperties.Add("PARENT_UNIQUE_NAME");

            foreach (String propName in memberProperties)
            {
                String memberName = String.Format("[Measures].[-{0}-]", propName);
                members = members + "," + memberName;
                builder.AppendFormat("MEMBER {0} AS {1} ", memberName,
                                     String.Format("'{0}.CurrentMember.Properties(\"{1}\", TYPED)'", hierarchyUniqueName,
                                                   propName));
            }
            members = members + "}";

            // Select
            if (useHierarchize)
            {
                builder.AppendFormat("Select Hierarchize({0}) on 0, {1} on 1 from {2}", set, members, from_Set);
            }
            else
            {
                builder.AppendFormat("Select {0} on 0, {1} on 1 from {2}", set, members, from_Set);
            }

            CellSetData cs_descr = GetDescription(builder.ToString());

            return(GetMembers(cs_descr));
        }
        private List <MemberDataWrapper> GetMembers(CellSetData cs_descr)
        {
            List <MemberDataWrapper> result = new List <MemberDataWrapper>();

            if (cs_descr != null)
            {
                // Сами элементы - по оси 0
                // По оси 1 - св-ва элементов
                if (cs_descr.Axes.Count > 0)
                {
                    int colIndex = 0;
                    foreach (PositionData posColumn in cs_descr.Axes[0].Positions)
                    {
                        if (posColumn.Members.Count > 0)
                        {
                            MemberDataWrapper wrapper = new MemberDataWrapper(cs_descr.Axes[0].Members[posColumn.Members[0].Id]);

                            if (cs_descr.Axes.Count > 1)
                            {
                                int rowIndex = 0;
                                foreach (PositionData posRow in cs_descr.Axes[1].Positions)
                                {
                                    if (posRow.Members.Count > 0)
                                    {
                                        PropertyData prop = new PropertyData();
                                        prop.Name = cs_descr.Axes[1].Members[posRow.Members[0].Id].Caption;

                                        // Название свойства имеет специальный вид -IsDataMember-
                                        // В качестве названия будем использовать подстроку между символами "-"
                                        //String caption = posRow.Members[0].Caption;
                                        //if (caption.StartsWith("-") && caption.EndsWith("-"))
                                        //    caption = caption.Trim('-');

                                        // Если такого атрибута нет, то будет исключение
                                        CellData cell_descr = null;
                                        try
                                        {
                                            cell_descr = cs_descr.GetCellDescription(colIndex, rowIndex);
                                        }
                                        catch (AdomdErrorResponseException)
                                        {
                                        }

                                        if (cell_descr != null && cell_descr.Value != CellValueData.Empty && !cell_descr.Value.IsError)
                                        {
                                            prop.Value = cell_descr.Value.Value;
                                            wrapper.Member.MemberProperties.Add(prop);
                                        }
                                    }
                                    rowIndex++;
                                }
                            }

                            result.Add(wrapper);
                        }
                        colIndex++;
                    }
                }
            }
            return(result);
        }