/// <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); }
/// <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); } }
/// <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); } } }
/// <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); }