/// <summary>
        ///		Añade un nodo de dimensión (y sus hijos)
        /// </summary>
        private void AddDimensionNodes(NodeColumnViewModel root, DimensionModel dimension)
        {
            NodeColumnViewModel node = new NodeColumnViewModel(this, root, NodeColumnViewModel.NodeColumnType.Dimension,
                                                               dimension.Id, null);
            BaseReportingDictionaryModel <DimensionModel> childs = new BaseReportingDictionaryModel <DimensionModel>();

            // Asigna el código de dimensión
            node.DimensionId = dimension.Id;
            // Añade los campos de la dimensión
            AddColumnNodes(node, dimension.DataSource.Columns, NodeColumnViewModel.NodeColumnType.DimensionColumn, dimension.Id, string.Empty);
            // Crea la colección de dimensiones hija a partir de las relaciones
            foreach (DimensionRelationModel relation in dimension.Relations)
            {
                if (relation.Dimension != null)
                {
                    childs.Add(relation.Dimension);
                }
            }
            // Añade los nodos de dimensión hija
            foreach (DimensionModel child in childs.EnumerateValuesSorted())
            {
                AddDimensionNodes(node, child);
            }
            // Añade el nodo a la raíz
            root.Children.Add(node);
        }
        /// <summary>
        ///		Crea los registros de columnas
        /// </summary>
        private void CreateDataSourceColumns(int dataSourceId, BaseReportingDictionaryModel <DataSourceColumnModel> columns, ref int columnId)
        {
            foreach (DataSourceColumnModel column in columns.EnumerateValues())
            {
                // Inserta el origen de datos en la lista de Ids
                DataBaseIds.Add(("Column", column.Id, columnId, column.DataSource.Id));
                // Añade el registro
                Builder.AppendLine($@"INSERT INTO DataSourceColumns (DataSourceColumnId, DataSourceId, Name, Type, IsPrimaryKey, Visible, Required)
										VALUES ({columnId++}, {dataSourceId}, {Convert(column.Id)}, {(int) column.Type}, {Convert(column.IsPrimaryKey)},
												{Convert(column.Visible)}, {Convert(column.Required)});"                                                );
            }
        }
        /// <summary>
        ///		Añade los nodos de dimensiones
        /// </summary>
        private void AddDimensionNodes(ReportModel report)
        {
            NodeColumnViewModel root = new NodeColumnViewModel(this, null, NodeColumnViewModel.NodeColumnType.DimensionsRoot, "Dimensiones", null);
            BaseReportingDictionaryModel <DimensionModel> dimensions = GetDimensions(report);

            // Añade las dimensiones
            foreach (DimensionModel dimension in dimensions.EnumerateValuesSorted())
            {
                AddDimensionNodes(root, dimension);
            }
            // Añade el nodo raíz al árbol
            Children.Add(root);
        }
        /// <summary>
        ///		Obtiene las dimensiones de un informe
        /// </summary>
        private BaseReportingDictionaryModel <DimensionModel> GetDimensions(ReportModel report)
        {
            BaseReportingDictionaryModel <DimensionModel> dimensions = new BaseReportingDictionaryModel <DimensionModel>();

            // Añade las dimensiones
            foreach (ReportDataSourceModel dataSource in report.ReportDataSources)
            {
                foreach (DimensionRelationModel relation in dataSource.Relations)
                {
                    if (dimensions[relation.Dimension.Id] == null)
                    {
                        dimensions.Add(relation.Dimension);
                    }
                }
            }
            // Devuelve las dimensiones
            return(dimensions);
        }
        /// <summary>
        ///		Añade los nodos de columnas
        /// </summary>
        private void AddColumnNodes(NodeColumnViewModel root, BaseReportingDictionaryModel <DataSourceColumnModel> columns,
                                    NodeColumnViewModel.NodeColumnType nodeColumnType, string dimensionId, string dataSourceId)
        {
            // Añade las columnas adecuadas al árbol
            foreach (DataSourceColumnModel column in columns.EnumerateValuesSorted())
            {
                if (column.Visible)
                {
                    NodeColumnViewModel node = new NodeColumnViewModel(this, root, nodeColumnType, column.Id, column);

                    // Asigna las propiedades
                    node.DimensionId  = dimensionId;
                    node.DataSourceId = dataSourceId;
                    // Añade el nodo
                    root.Children.Add(node);
                }
            }
        }