Ejemplo n.º 1
0
        /// <summary>
        /// Retorna uma TabelaSelect a partir de uma TabelaDado
        /// OBS.: Não traz os apelidos do select
        /// </summary>
        /// <param name="tabelaDado"></param>
        /// <returns></returns>
        public static TabelaSelect getTabelaSelect(TabelaDado tabelaDado)
        {
            if (tabelaDado == null || tabelaDado.registros == null || tabelaDado.registros.Count == 0)
            {
                return(null);
            }

            TabelaSelect      tabelaSelect = new TabelaSelect();
            List <DadoTabela> dados        = tabelaDado.registros[0].dados;
            int colunas = dados.Count;

            tabelaSelect.campos = new string[colunas];
            for (int i = 0; i < colunas; i++)
            {
                tabelaSelect.campos[i] = tabelaDado.nome + "." + dados[i].nome;
            }

            foreach (RegistroTabela registro in tabelaDado.registros)
            {
                dados = registro.dados;
                string[] linha = new string[colunas];
                for (int i = 0; i < colunas; i++)
                {
                    linha[i] = dados[i].valor + "";
                }

                tabelaSelect.Registros.Add(linha);
            }

            return(tabelaSelect);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Realiza a união da tabela passada com a tabela atual.
        /// Os campos devem ser iguais, senão lança exceção.
        /// </summary>
        /// <param name="outraTabela"></param>
        public void uniao(TabelaSelect outraTabela)
        {
            if (!isIgual(this.campos, outraTabela.Campos))
            {
                throw new SGDBException("Para união de 2 tabelas, os campos devem ser iguais");
            }

            registros.AddRange(outraTabela.registros);
            if (registros.Count > Base.getInstance().qtd_max_registros)
            {
                registros.RemoveRange(Base.getInstance().qtd_max_registros, Registros.Count - Base.getInstance().qtd_max_registros);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Realiza a união da tabela passada com a tabela atual, depois realiza distinct com o resultado.
        /// Os campos devem ser iguais, senão lança exceção.
        /// </summary>
        /// <param name="outraTabela"></param>
        public void uniaoDistinct(TabelaSelect outraTabela)
        {
            if (!isIgual(this.campos, outraTabela.Campos))
            {
                throw new SGDBException("Para união de 2 tabelas, os campos devem ser iguais");
            }

            foreach (string[] outroR in outraTabela.Registros)
            {
                if (registros.Count > Base.getInstance().qtd_max_registros)
                {
                    break;
                }
                bool igual = false;
                foreach (string[] r in Registros)
                {
                    igual = isIgual(r, outroR);
                }
                if (!igual)
                {
                    Registros.Add(outroR);
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// realiza o INNER JOIN da tabela atual com a tabela passada conforme parametros da listaJoin
        /// e retorna o resultado do join
        /// </summary>
        /// <param name="outraTabela"></param>
        /// <param name="listaJoin"></param>
        /// <returns>resultado do Join</returns>
        public TabelaSelect join(TabelaSelect outraTabela, List <Filtro> listaJoin)
        {
            //para fazer o join será criado uma nova tabela com o resultado da operação
            TabelaSelect resultado = new TabelaSelect();
            int          colunas   = this.Campos.Length + outraTabela.Campos.Length;
            int          iniDir    = this.Campos.Length; //em que indice começam os registros da 2a tabela

            resultado.Campos = new string[colunas];
            //define os campos da nova tabela com a uniao das originais
            this.Campos.CopyTo(resultado.Campos, 0);
            outraTabela.Campos.CopyTo(resultado.Campos, iniDir);

            List <int[]> colFiltro = new List <int[]>();//lista contendo os indices em que serão verificados a igualdade

            //popula colFiltro
            foreach (Filtro filtro in listaJoin)
            {
                int colEsq = -1;
                int colDir = -1;
                //verifica se o filtro contempla as tabelas em questao
                if (resultado.Campos.Contains(filtro.RValue) && resultado.Campos.Contains(filtro.LValue))
                {
                    //define em que indice o valor será verificado na 1a tabela;
                    for (int i = 0; i < this.Campos.Length; i++)
                    {
                        if (this.Campos[i].Equals(filtro.RValue) || this.Campos[i].Equals(filtro.LValue))
                        {
                            colEsq = i;
                            break;
                        }
                    }

                    //define em que indice o valor será verificado na 2a tabela;
                    for (int i = 0; i < outraTabela.Campos.Length; i++)
                    {
                        if (outraTabela.Campos[i].Equals(filtro.RValue) || outraTabela.Campos[i].Equals(filtro.LValue))
                        {
                            colDir = i;
                            break;
                        }
                    }

                    //se os indices foram definidos corretamente compara registro a registro das 2 tabelas e insere no resultado se for igual
                    if (colEsq != -1 && colDir != -1)
                    {
                        colFiltro.Add(new int[] { colEsq, colDir });
                    }
                }
            }//foreach filtro

            //se nao tiver join retornar um produto cartesiano
            if (colFiltro.Count == 0)
            {
                foreach (string[] regEsq in this.Registros)
                {
                    foreach (string[] regDir in outraTabela.Registros)
                    {
                        if (resultado.Registros.Count > Base.getInstance().qtd_max_registros)
                        {
                            break;
                        }
                        string[] regTemp = new string[colunas];
                        regEsq.CopyTo(regTemp, 0);
                        regDir.CopyTo(regTemp, iniDir);
                        resultado.addRegistro(regTemp);
                    }
                }
            }
            else
            {
                foreach (string[] regEsq in this.Registros)
                {
                    foreach (string[] regDir in outraTabela.Registros)
                    {
                        bool insere = true;
                        foreach (int[] filtro in colFiltro)
                        {
                            if (!regEsq[filtro[0]].Equals(regDir[filtro[1]]))
                            {
                                insere = false;
                                break;
                            }
                        }
                        if (resultado.Registros.Count > Base.getInstance().qtd_max_registros)
                        {
                            insere = false;
                        }

                        if (insere)
                        {
                            string[] regTemp = new string[colunas];
                            regEsq.CopyTo(regTemp, 0);
                            regDir.CopyTo(regTemp, iniDir);
                            resultado.addRegistro(regTemp);
                        }
                    }
                }
            }
            if (resultado.Registros.Count > Base.getInstance().qtd_max_registros)
            {
                resultado.Registros.RemoveRange(Base.getInstance().qtd_max_registros, resultado.Registros.Count - Base.getInstance().qtd_max_registros);
            }

            return(resultado);
        }