/// <summary>
        /// Проверяет правильность составленого SELECT по схеме исходной БД
        /// </summary>
        /// <param name="ds">Схема исходной БД</param>
        /// <param name="from">Оператор FROM</param>
		public void Validate(DataSet ds, FromClass from)
		{
			//если таблица одна, то мы ее ставим по умолчанию
			if (from.Count == 1)
			{
				this.defaultTable = from[0];
			}
			if (paint.Count >0 )
			{
				this.paint.Validate(ds, this.defaultTable);
			}
			
			for (int i=0; i<l.Count; i++)
			{
				if (isString(i))
				{
					string curTable = this.Table(i);
					DataTable table = ds.Tables[curTable];
					if (table == null)
					{
						string al = this.baseSql.alias.GetTableAlias(curTable);
						if (al == null)
							throw new NotExistException("Не найдено таблицы в DataSet-e: " + curTable);
						if (ds.Tables[al]!=null)
							table = ds.Tables[al];
						else
							throw new NotExistException("Не найдено таблицы в DataSet-e: " + curTable);
					}

					if (this[i] == "*")
					{
						l.RemoveAt(i);
						i=-1;
						for (int j=0; j<table.Columns.Count;j++)
						{
							//l.Add( new Data(curTable, table.Columns[j].ColumnName.ToString()));
							//if (!isExist(table.Columns[j].ColumnName.ToString()))
							//{
								this.Add(curTable, table.Columns[j].ColumnName.ToString());
							//}
							
						}
						continue;
					}
                    
					
					string ColName = this[i];
					if (table.Columns[this[i]] == null)
					{
						//проверяем наличие колонки в Алиасе
						if (this.baseSql.alias.GetColumnAlias(this[i]) == null)
							throw new NotExistException("Не найдено колонки в DataSet-e: "+ curTable+"."+ this[i]);
						else
							ColName = this.baseSql.alias.GetColumnAlias(this[i]).name;
					}
					//Мы добавлем типы данных в Select
					if (table.Columns[ColName].DataType == typeof(String))
						((Data)l[i]).type = ElementType.STRING;
					else if (table.Columns[ColName].DataType == typeof(Decimal))
						((Data)l[i]).type = ElementType.DECIMAL;
					else if (table.Columns[ColName].DataType == typeof(DateTime))
						((Data)l[i]).type = ElementType.DATE;
					//
					//}
				}
				else
				{
					GetSQL(i).Validate(ds);
				}
			}
		}
        /// <summary>
        /// Упрощает схему SQL-запрсоа. Проверяет колонок и таблиц на существование в DataSet-е
        /// </summary>
        /// <param name="ds">Схема датасета</param>
        /// <param name="from">From-класс</param>
		public void Simplify(DataSet ds, FromClass from)
		{
			for (int i=0; i<l.Count; i++)
			{
				if (isString(i))
				{
					string curTable = this.Table(i);
					DataTable table = ds.Tables[curTable];
					if (table == null)
					{
						//Должны посмареть Алиас
						string al = this.baseSql.alias.GetTableAlias(curTable);
						if (al == null)
							throw new NotExistException("Не найдено таблицы в DataSet-e: " + curTable);
						if (ds.Tables[al]!=null)
							table = ds.Tables[al];
						else
							throw new NotExistException("Не найдено таблицы в DataSet-e: " + curTable);
					}

					if (this[i] == "*")
					{
						l.RemoveAt(i);
						i--;
						for (int j=0; j<table.Columns.Count;j++)
							this.Add(curTable, table.Columns[j].ColumnName.ToString());
						continue;
					}
				}
				else
				{
					GetSQL(i).Siplify(ds);
				}
			}
		}
        /// <summary>
        /// Конструктор
        /// </summary>
		public SQLStruct()
		{
			select = new SelectClass(this);
			from = new FromClass(this);
			where = new WhereClass(this);
			As = new AsClass(this);
			group = new GroupClass(this);
		}