Ejemplo n.º 1
0
 /// <summary>
 /// Конструктор для вспомогательной колонки StormJoinedMasterKey,
 /// котороя необходима для проставления ссылок на мастера
 /// (не только те мастера, которые указаны в представлении)
 /// </summary>
 public ColumnInfo(string columnName, StorageStructForView.PropSource propSource)
 {
     ColumnName   = columnName;
     _propSources = new List <StorageStructForView.PropSource> {
         propSource
     };
 }
        /// <summary>
        /// Этот метод переопределён, чтобы создать словарь соответствия длинных и коротких имён для псевдонимов.
        /// </summary>
        /// <param name="storageStruct">
        /// The storage Struct.
        /// </param>
        /// <param name="addNotMainKeys">
        /// The add Not Main Keys.
        /// </param>
        /// <param name="addMasterFieldsCustomizer">
        /// The add Master Fields Customizer.
        /// </param>
        /// <param name="AddingAdvansedField">
        /// The Adding Advansed Field.
        /// </param>
        /// <param name="AddingKeysCount">
        /// The Adding Keys Count.
        /// </param>
        /// <param name="SelectTypesIds">
        /// The Select Types Ids.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        public override string GenerateSQLSelectByStorageStruct(
            StorageStructForView storageStruct,
            bool addNotMainKeys,
            bool addMasterFieldsCustomizer,
            string AddingAdvansedField,
            int AddingKeysCount,
            bool SelectTypesIds)
        {
            StorageStructForView.PropSource source = storageStruct.sources;
            foreach (StorageStructForView.PropSource subSource in source.LinckedStorages)
            {
                for (int j = 0; j < subSource.storage.Length; j++)
                {
                    string curAlias = subSource.Name + j;
                    GenerateShortName(curAlias);
                }
            }

            for (int i = 0; i < storageStruct.props.Length; i++)
            {
                StorageStructForView.PropStorage prop = storageStruct.props[i];
                if (prop.MultipleProp)
                {
                    continue;
                }

                bool propStored = prop.Stored;
                if (propStored && (string.IsNullOrEmpty(prop.Expression) || this.IsExpressionContainAttrubuteCheckOnly(prop.Expression)))
                {
                    if (prop.MastersTypesCount > 0)
                    {
                        string deniedAccessValue = string.Empty;
                        bool   isAccessDenied    = SecurityManager.UseRightsOnAttribute &&
                                                   !SecurityManager.CheckAccessToAttribute(
                            prop.Expression,
                            out deniedAccessValue);

                        for (int j = 0; j < prop.storage.Length; j++)
                        {
                            for (int k = 0; k < prop.MastersTypes[j].Length; k++)
                            {
                                string curName = isAccessDenied ? deniedAccessValue : prop.source.Name + j;
                                GenerateShortName(curName);
                            }
                        }
                    }
                    else
                    {
                        for (int j = 0; j < prop.storage.Length; j++)
                        {
                            GenerateShortName(prop.source.Name + j);
                        }
                    }
                }
            }

            return(base.GenerateSQLSelectByStorageStruct(storageStruct, addNotMainKeys, addMasterFieldsCustomizer, AddingAdvansedField, AddingKeysCount, SelectTypesIds));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Возвращает все таблицы мастеров после соединения.
        /// </summary>
        /// <param name="propSource">Базовый источник данных в котором будут искаться мастера</param>
        /// <param name="mainTable">Таблица основного объекта данных.</param>
        /// <param name="result">Результат выполнения метода. Необходим для выполнения рекурсии.</param>
        /// <returns>Таблицы мастеров после соединения</returns>
        private void SetAllMasterTables(StorageStructForView.PropSource propSource, DataTable mainTable,
                                        Dictionary <StorageStructForView.PropSource, DataTable> result)
        {
            if (propSource.LinckedStorages == null || propSource.LinckedStorages.Length == 0)
            {
                return;
            }

            foreach (var source in propSource.LinckedStorages)
            {
                string currentTableName = source.storage[0].Storage;

                DataTable dt1 = mainTable ?? result[propSource];
                DataTable dt2 = _dataSet.Tables[currentTableName];
                // соединяем переданный источник с текущим
                DataTable resultTable = GetResultJoinTables(dt1, dt2, source.ObjectLink,
                                                            source.storage[0].PrimaryKeyStorageName);
                result.Add(source, resultTable);

                SetAllMasterTables(source, null, result);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Добавляет в таблицу новые строки с заполненными данными для указанной структуры
        /// </summary>
        /// <param name="dt">Таблица, в которую добавляются строки.</param>
        /// <param name="storageStruct">Структура хранения на основе которой будут добавлять строки.</param>
        /// <param name="columnsInfo">Информация о колонках для определения, что и в какие колонки записывать.</param>
        /// <param name="structIndex">
        /// Номер структуры.
        /// Необходим для того, чтобы достать настройки из информации о колонках.
        /// Если необходимо заполнить таблицу одним массивом данных и структура была одна, то необходимо передать 0.
        /// </param>
        private void FillDataTable(DataTable dt, StorageStructForView storageStruct, List <ColumnInfo> columnsInfo,
                                   int structIndex)
        {
            DataTable mainDataTable  = _dataSet.Tables[storageStruct.sources.storage[0].Storage];
            int       startRowsIndex = dt.Rows.Count;

            // Добавляем столько строк, сколько их в таблице основного объекта данных
            for (int i = 0; i < mainDataTable.Rows.Count; i++)
            {
                dt.Rows.Add(dt.NewRow());
            }

            // В этот список будут записаны мастеровые таблицы после соединения.
            var masterTables = new Dictionary <StorageStructForView.PropSource, DataTable>();

            SetAllMasterTables(storageStruct.sources, mainDataTable, masterTables);

            // Далее заполняем таблицу по ячейкам.
            foreach (var columnInfo in columnsInfo)
            {
                StorageStructForView.PropStorage propStorage = columnInfo.PropStorages == null
                                                                   ? null
                                                                   : columnInfo.PropStorages[structIndex];
                StorageStructForView.PropSource propSource = columnInfo.PropSources == null
                                                                 ? null
                                                                 : columnInfo.PropSources[structIndex];

                // Если это свойство хранимое
                if (propStorage != null && propStorage.Stored && !columnInfo.IsStormDataObjectType &&
                    !columnInfo.IsStormJoinedMasterKey && !columnInfo.IsStormMainObjectKey)
                {
                    // Если это свойство является собственным для основного объекта данных, то ищем в основной таблице.
                    if (propSource == storageStruct.sources)
                    {
                        for (int i = 0; i < mainDataTable.Rows.Count; i++)
                        {
                            dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = mainDataTable.Rows[i][propStorage.Name];
                        }
                    }
                    else if (masterTables.ContainsKey(propSource))
                    {
                        // иначе это свойство мастера и надо брать его из таблицы мастеров после соединения
                        for (int i = 0; i < mainDataTable.Rows.Count; i++)
                        {
                            dt.Rows[i + startRowsIndex][columnInfo.ColumnName] =
                                masterTables[propSource].Rows[i][propStorage.simpleName];
                        }
                    }
                }
                else
                {
                    if (columnInfo.IsStormMainObjectKey)
                    {
                        // в эту колонку записываются первичные ключи основного объекта данных
                        for (int i = 0; i < mainDataTable.Rows.Count; i++)
                        {
                            dt.Rows[i + startRowsIndex][columnInfo.ColumnName] =
                                mainDataTable.Rows[i][storageStruct.sources.storage[0].PrimaryKeyStorageName];
                        }
                    }
                    else if (columnInfo.IsStormDataObjectType)
                    {
                        // В эту колонку записывается номер типа для загрузки данных.
                        // Он необходим когда читаются наследники через базовый класс.
                        for (int i = 0; i < mainDataTable.Rows.Count; i++)
                        {
                            dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = structIndex;
                        }
                    }
                    else if (columnInfo.IsStormJoinedMasterKey)
                    {
                        // если этот мастер был указан в представлении, то его можно вытянуть через PropStorage
                        string simpleName = propStorage != null
                                                ? propStorage.simpleName
                                                : propSource.storage[0].PrimaryKeyStorageName;

                        // в эти колонки записываются первичные ключи мастеров
                        for (int i = 0; i < mainDataTable.Rows.Count; i++)
                        {
                            // Ключ мастера храниться в таблице мастера
                            if (masterTables.ContainsKey(propSource))
                            {
                                dt.Rows[i + startRowsIndex][columnInfo.ColumnName] =
                                    masterTables[propSource].Rows[i][simpleName];
                            }
                            else
                            {
                                // или его можно взять сразу из таблицы основного объекта данных
                                dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = mainDataTable.Rows[i][simpleName];
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Возвращает все источники мастеров по иерархии для указанного источника данных
        /// </summary>
        /// <param name="propSource">Источник данных от которого начнется проход по иерархии мастеров</param>
        /// <returns>Список всех источников мастеров, полученных по иерархии</returns>
        private List <StorageStructForView.PropSource> GetAllLinkedStoragesFroPropSource(StorageStructForView.PropSource propSource)
        {
            if (propSource.LinckedStorages == null || propSource.LinckedStorages.Length == 0)
            {
                return(new List <StorageStructForView.PropSource>());
            }

            var result = new List <StorageStructForView.PropSource>();

            foreach (var source in propSource.LinckedStorages)
            {
                result.Add(source);

                var linkedStorages = GetAllLinkedStoragesFroPropSource(source);
                result.AddRange(linkedStorages);
            }

            return(result);
        }