terça-feira, 15 de dezembro de 2015

Datatable transformar linhas em colunas

        public delegate void EventoContaIDs(Int32 pValor, ProgressBar pPrg);
        public delegate void EventoTotalIDs(Int32 pValor, ProgressBar pPrg);
        public event EventoContaIDs ProgressoIDs;
        public event EventoTotalIDs TotalIDs;



        #region Constantes

        /// <summary>Formato de hora sem segundo: "HH:mm"</summary>
        public const String _FormatoHoraSS = "HH:mm";

        /// <summary>Formato de hora com segundo: "HH:mm:ss"</summary>
        public const String _FormatoHoraCS = "HH:mm:ss";

        /// <summary>Formato de data e hora: "dd/MM/yyyy HH:mm:ss"</summary>
        public const String _FormatoDataHora = "dd/MM/yyyy HH:mm:ss";

        /// <summary>Formato de data: "dd/MM/yyyy"</summary>
        public const String _FormatoData = "dd/MM/yyyy";

        /// <summary>Formato de moeda: "###,###,###,###,##0.00"</summary>
        public const String _FormatoMoeda = "###,###,###,###,##0.00";

        /// <summary>Formato de número: "###,###,###,###,##0"</summary>
        public const String _FormatoNumero = "###,###,###,###,##0";

        /// <summary>Formato de Moeda para uso em grids: "{0:N}"</summary>
        public const String _FormatoMoedaGrid = "{0:N}";

        /// <summary>Formato de Data para uso em grids: "{0:dd/MM/yyyy}"</summary>
        public const String _FormatoDataGrid = "{0:dd/MM/yyyy}";

        #endregion

#region transformar linhas em colunas (como o oracle usado atual é o 9 e o comando PIVOT só tem na versão 11 e também os sub-selects estavam muito lentos...)

        public void Transformar_Linhas_Em_Colunas(DataTable iDtPrinc, String pID, DataTable iDtSec, String pColuna)
        {
            Transformar_Linhas_Em_Colunas(iDtPrinc, pID, iDtSec, pColuna, null, null);
        }

        public void Transformar_Linhas_Em_Colunas(DataTable iDtPrinc, String pID, DataTable iDtSec, String pColuna, ProgressBar pPrg1, ProgressBar pPrg2)
        {
            Transformar_Linhas_Em_Colunas(iDtPrinc, pID, iDtSec, pColuna, pPrg1, pPrg2, string.Empty);
        }

        public void Transformar_Linhas_Em_Colunas(DataTable iDtPrinc, String pID, DataTable iDtSec, String pColuna, ProgressBar pPrg1, ProgressBar pPrg2, String pAdicionarNomeTabelaNaColuna)
        {
            if (TotalIDs != null && pPrg1 != null)
                pPrg1.Maximum = iDtPrinc.Rows.Count;

            if (String.IsNullOrEmpty(pColuna))
                Transformar_Linhas_Em_Colunas(iDtPrinc, pID, iDtSec, pPrg1, pPrg2, pAdicionarNomeTabelaNaColuna, false);
            else
            {
                //_DvGroup = null;
                CriarColunas(pColuna, iDtSec, pID, iDtPrinc, pAdicionarNomeTabelaNaColuna);

                //if (TotalIDs != null && pPrg1 != null)
                //    pPrg1.Maximum = iDtPrinc.Rows.Count;

                Int32 iCont = 0;
                foreach (DataRow iDrPrinc in iDtPrinc.Rows)
                {
                    if (!String.IsNullOrEmpty(iDrPrinc[pID].ToString()))
                    {
                        DataView iDvDados = new DataView(iDtSec, pID + "='" + iDrPrinc[pID].ToString() + "'", pColuna, DataViewRowState.CurrentRows);
                        if (iDvDados.Count > 0)
                        {
                            if (ProgressoIDs != null && pPrg2 != null)
                                pPrg2.Maximum = iDvDados.Count;

                            String iMesmo = "";
                            int iAux = 0;
                            Int32 iContAux = 0;
                            foreach (DataRowView iDrSec in iDvDados)
                            {
                                if (!iMesmo.Equals(iDrSec[pColuna].ToString()))
                                    iAux = 0;
                                iAux++;
                                foreach (DataColumn iDc in iDvDados.Table.Columns)
                                {
                                    if (!iDc.ColumnName.Trim().Equals(pID, StringComparison.OrdinalIgnoreCase)
                                        && !iDc.ColumnName.Trim().Equals(pColuna, StringComparison.OrdinalIgnoreCase))
                                    {
                                        iDrPrinc[(String.IsNullOrEmpty(pAdicionarNomeTabelaNaColuna) ? "" : pAdicionarNomeTabelaNaColuna)
                                            + iDrSec[pColuna] + (iAux == 1 ? "" : "_" + iAux) + "_" + iDc.ColumnName] = iDrSec[iDc.ColumnName];
                                    }
                                }
                                iMesmo = iDrSec[pColuna].ToString();
                                if (ProgressoIDs != null && pPrg2 != null)
                                    ProgressoIDs(++iContAux, pPrg2);
                            }
                            //String iMesmo = "";
                            //Int32 iContAux = 1;
                            //foreach (DataRowView iDrSec in iDvDados)
                            //{
                            //    if (!iMesmo.Equals(iDrSec[pColuna].ToString()))
                            //        iContAux = 1;
                            //    foreach (DataColumn iDc in iDvDados.Table.Columns)
                            //    {
                            //        if (!iDc.ColumnName.Trim().Equals(pID, StringComparison.OrdinalIgnoreCase)
                            //            && !iDc.ColumnName.Trim().Equals(pColuna, StringComparison.OrdinalIgnoreCase))
                            //        {
                            //            Boolean iExcecao = false;
                            //            if (_DvGroup != null)
                            //            {
                            //                _DvGroup.RowFilter = pColuna + "='" + iDrSec[pColuna] + "'";
                            //                if (_DvGroup.Count > 0)
                            //                    iExcecao = true;
                            //            }
                            //            iDrPrinc[iDrSec[pColuna] + (iExcecao ? "_" + iContAux : "") + "_" + iDc.ColumnName] = iDrSec[iDc.ColumnName];
                            //        }
                            //    }
                            //    if (!Validacao.IsEmpty(pColuna))
                            //        iMesmo = iDrSec[pColuna].ToString();
                            //    iContAux++;
                            //}

                        }
                    }
                    if (TotalIDs != null && pPrg1 != null)
                        TotalIDs(++iCont, pPrg1);
                }

            }
        }

        //public static T Tipo<T>(String pID, DataTable pDtPrinc)
        //{
        //    return ((pDtPrinc.Columns[pID].DataType == typeof(String)) ? typeof(String) : typeof(Int32));
        //}

        public static List<T> CreateList<T>(params T[] elements)
        {
            return new List<T>(elements);
        }

        private void CriarColunas(String pColuna, DataTable _DtSec, String pID, DataTable pDtPrinc, String pAdicionarNomeTabelaNaColuna)
        {
            //Dictionary<int, string> mydict = new Dictionary<string, int>();

            var queryDtAux = (from table in _DtSec.AsEnumerable()
                              select new
                              {
                                  aColuna = table.Field<String>(pColuna),
                                  aID = table.Field<Int32>(pID) //2014/09/19 -> aID = table.Field<Int32>(pID) alterado de Int32 para String //voltado para Int32 em 24/09/14, pois qdo. tem uma coluna tipo Int32 gera o erro
                              }
                             );
            var queryDt = queryDtAux.ToList();

            var queryGrp = from t in queryDt
                           group t by new { t.aColuna, t.aID } into g
                           select new
                           {
                               aCol = g.Key.aColuna,
                               aIde = g.Key.aID,
                               Total = g.Count()
                           };

            //pega o nº máximo de vezes que a coluna (tipo) vai aparecer por Identificador
            var queryMax = queryGrp
                .GroupBy(i => i.aCol)
                .Select(i => new { NovaColuna = i.Key, MyCount = i.Max(k => k.Total) })
                .OrderBy(i => i.NovaColuna); //order by adicionado em 2014/fev/26

            foreach (var x in queryMax)
            {
                for (int i = 0; i < x.MyCount; i++)
                {
                    foreach (DataColumn iDc in _DtSec.Columns)
                    {
                        if (!iDc.ColumnName.Trim().Equals(pID, StringComparison.OrdinalIgnoreCase)
                            && !iDc.ColumnName.Trim().Equals(pColuna, StringComparison.OrdinalIgnoreCase))
                        {
                            String iColumnName = (String.IsNullOrEmpty(pAdicionarNomeTabelaNaColuna) ? "" : pAdicionarNomeTabelaNaColuna)
                                + x.NovaColuna + (i == 0 ? "" : "_" + (i + 1).ToString()) + "_" + iDc.ColumnName;
                            pDtPrinc.Columns.Add(iColumnName, iDc.DataType);
                            String iFormato = string.Empty;

                            switch (_DtSec.TableName.Trim())
                            {
                                #region Valores
                                case "Valores":
                                    switch (iDc.ColumnName)
                                    {
                                        //case "VALOR_ATUALIZADO":
                                        //case "VALOR_CORRECAO":
                                        //case "VALOR_JUROS":
                                        //    iFormato = Geral._FormatoMoeda + "0000";
                                        //    break;
                                        case "DATA_ATUALIZACAO":
                                        case "QDO_ALTEROU":
                                        case "QDO_INCLUIU":
                                            iFormato = _FormatoDataHora;
                                            break;
                                    }
                                    break;
                                #endregion
                                #region Garantias
                                case "Garantias":
                                    switch (iDc.ColumnName)
                                    {
                                        case "QDO_ALTEROU":
                                        case "QDO_INCLUIU":
                                            iFormato = _FormatoDataHora;
                                            break;
                                    }
                                    break;
                                #endregion
                                #region Dados Clientes
                                case "Dados cliente":
                                    switch (iDc.ColumnName)
                                    {
                                        case "QUANDO":
                                            iFormato = _FormatoDataHora;
                                            break;
                                    }
                                    break;
                                #endregion
                            }
                            if (!String.IsNullOrEmpty(iFormato))
                                pDtPrinc.Columns[iColumnName].ExtendedProperties.Add("Formato", iFormato);
                        }
                    }
                }
            }
        }

        //DataView _DvGroup;
        //private void CriarColunasOLD(String pColuna, DataTable _DtSec, String pID, DataTable pDtPrinc)
        //{
        //    //faz o agrupamento pelo IDE e pelo campo a ser transformado em coluna e desse agrupamento verifica quais registros retornam mais de 1 ocorrência
        //    var groupQuery = from table in _DtSec.AsEnumerable()
        //                     group table by new { column1 = table[pID], column2 = table[pColuna] } into newdr
        //                     where newdr.Count() > 1
        //                     select newdr;

        //    //copia somente a estrutura do datatable
        //    DataTable iDtGroup = _DtSec.Clone();

        //    //copia as linhas que foram encontradas com mais de 1 ocorrência, essas linhas irão gerar a coluna com underline e nº na frente (_n) pois o datatable não aceita colunas com o mesmo nome
        //    foreach (var x in groupQuery)
        //        x.CopyToDataTable(iDtGroup, LoadOption.OverwriteChanges);

        //    //pega todos os campos que irão virar colunas
        //    DataTable iDtDistinct = _DtSec.DefaultView.ToTable(true, pColuna);

        //    //remove os campos que tem mais de 1 ocorrência
        //    var ccList = iDtDistinct.AsEnumerable();
        //    var bannedCCList = iDtGroup.AsEnumerable();
        //    var exceptBanned = from c in ccList
        //                       join b in bannedCCList
        //                          on c.Field<String>(pColuna) equals b.Field<String>(pColuna) into j
        //                       from x in j.DefaultIfEmpty()
        //                       where x == null
        //                       select c;

        //    //insere como colunas todos os campos, exceto os que tem mais de 1 ocorrência
        //    foreach (DataRow iDr in exceptBanned)
        //    {
        //        foreach (DataColumn iDc in _DtSec.Columns)
        //        {
        //            if (!iDc.ColumnName.Trim().Equals(pID, StringComparison.OrdinalIgnoreCase)
        //                && !iDc.ColumnName.Trim().Equals(pColuna, StringComparison.OrdinalIgnoreCase))
        //            {
        //                //if (iDc.ColumnName.Trim().ToUpper().Equals("AND_DTA"))
        //                //{

        //                //}

        //                pDtPrinc.Columns.Add(iDr[pColuna].ToString() + "_" + iDc.ColumnName, iDc.DataType);
        //            }
        //        }
        //    }

        //    _DvGroup = new DataView(iDtGroup, "", pColuna, DataViewRowState.CurrentRows);

        //    //para os campos com mais de 1 ocorrência insere colocando numeração na frente para não repetir (_n)
        //    String iMesmo = "";
        //    Int32 iContAux = 1;
        //    foreach (DataRowView iDr in _DvGroup)
        //    {
        //        if (!iMesmo.Equals(iDr[pColuna].ToString()))
        //            iContAux = 1;
        //        foreach (DataColumn iDc in _DtSec.Columns)
        //        {
        //            if (!iDc.ColumnName.Trim().Equals(pID, StringComparison.OrdinalIgnoreCase)
        //                && !iDc.ColumnName.Trim().Equals(pColuna, StringComparison.OrdinalIgnoreCase))
        //            {
        //                pDtPrinc.Columns.Add(iDr[pColuna].ToString() + "_" + iContAux.ToString() + "_" + iDc.ColumnName, iDc.DataType);
        //            }
        //        }
        //        iMesmo = iDr[pColuna].ToString();
        //        iContAux++;
        //    }
        //}

        public void Transformar_Linhas_Em_Colunas(DataTable iDtPrinc, String pID, DataTable iDtSec)
        {
            Transformar_Linhas_Em_Colunas(iDtPrinc, pID, iDtSec, null, null, string.Empty, false);
        }

        public void Transformar_Linhas_Em_Colunas(DataTable iDtPrinc, String pID, DataTable iDtSec, ProgressBar pPrg1, ProgressBar pPrg2, String pAdicionarNomeTabelaNaColuna,
            Boolean pValidarValorAnterior)
        {
            Transformar_Linhas_Em_Colunas(iDtPrinc, pID, iDtSec, pPrg1, pPrg2, pAdicionarNomeTabelaNaColuna, pValidarValorAnterior, String.Empty);
        }

        //public void Transformar_Linhas_Em_Colunas(DataTable iDtPrinc, String pID, DataTable iDtSec, ProgressBar pPrg1, ProgressBar pPrg2, String pAdicionarNomeTabelaNaColuna,
        //    Boolean pValidarValorAnterior, String pColunaVerNulos)
        //{
        //    Transformar_Linhas_Em_Colunas(iDtPrinc, pID, iDtSec, pPrg1, pPrg2, pAdicionarNomeTabelaNaColuna, pValidarValorAnterior, pColunaVerNulos, String.Empty);
        //}


        public void Transformar_Linhas_Em_Colunas(DataTable iDtPrinc, String pID, DataTable iDtSec, ProgressBar pPrg1, ProgressBar pPrg2, String pAdicionarNomeTabelaNaColuna,
            Boolean pValidarValorAnterior, String pColunaVerNulos) //, String pColunaVerNulos2
        {
            int iTotalCol = 0;

            String iFiltro = "";
            if (iDtSec.Columns.Contains(pColunaVerNulos))
            {
                String iNaoNulos = pColunaVerNulos + " is not null";
                //if (iDtSec.Columns.Contains(pColunaVerNulos2))
                //    iNaoNulos += " and " + pColunaVerNulos2 + " is not null";
                DataRow[] iDrFilt = iDtSec.Select(iNaoNulos);
                foreach (DataRow iDrF in iDrFilt)
                {
                    iFiltro += "," + iDrF[pID].ToString();
                }
                if (!String.IsNullOrEmpty(iFiltro))
                {
                    iFiltro = pID + " in (" + iFiltro.Substring(1) + ")";
                    iDtPrinc.DefaultView.RowFilter = iFiltro;
                }
            }

            Int32 iCont = 0;
            foreach (DataRowView iDrPrinc in iDtPrinc.DefaultView)
            {
                DataView iDvDados = new DataView(iDtSec, pID + "='" + iDrPrinc[pID].ToString() + "'", "", DataViewRowState.CurrentRows);

                if (iDvDados.Count > 0)
                {
                    if (iDvDados.Count > iTotalCol)
                    {
                        //iTotalCol = iDtSec.Rows.Count;
                        //for (int i = 1; i <= iTotalCol; i++)

                        for (int i = (iTotalCol + 1); i <= iDvDados.Count; i++)
                        {
                            foreach (DataColumn iDc in iDvDados.Table.Columns)
                            {
                                if (!iDtPrinc.Columns.Contains(pAdicionarNomeTabelaNaColuna + iDc.ColumnName + (i == 1 ? "" : "_" + i))
                                    && !iDc.ColumnName.Trim().Equals(pID.Trim(), StringComparison.OrdinalIgnoreCase))
                                    //if (!iDc.ColumnName.Trim().Equals(pID.Trim(), StringComparison.OrdinalIgnoreCase))
                                    iDtPrinc.Columns.Add(pAdicionarNomeTabelaNaColuna + iDc.ColumnName + (i == 1 ? "" : "_" + i), iDc.DataType);
                            }
                        }
                        iTotalCol = iDvDados.Count;
                    }

                    //copia dos dados

                    Int32 iContAux = 0;
                    if (ProgressoIDs != null && pPrg2 != null)
                        pPrg2.Maximum = iDvDados.Count;

                    int iAux = 1;
                    foreach (DataRowView iDrSec in iDvDados)
                    {
                        foreach (DataColumn iDc in iDvDados.Table.Columns)
                        {
                            if (!iDc.ColumnName.Trim().Equals(pID.Trim(), StringComparison.OrdinalIgnoreCase))
                            {
                                if (!pValidarValorAnterior ||
                                    (pValidarValorAnterior && String.IsNullOrEmpty(iDrPrinc[pAdicionarNomeTabelaNaColuna + iDc.ColumnName + (iAux == 1 ? "" : "_" + iAux)].ToString())))
                                    iDrPrinc[pAdicionarNomeTabelaNaColuna + iDc.ColumnName + (iAux == 1 ? "" : "_" + iAux)] = iDrSec[iDc.ColumnName];
                            }
                        }
                        iAux++;
                        if (ProgressoIDs != null && pPrg2 != null)
                            ProgressoIDs(++iContAux, pPrg2);
                    }

                }
                if (TotalIDs != null && pPrg1 != null)
                    TotalIDs(++iCont, pPrg1);
            }
        }

        public static string dataTableToHTML(DataTable dt)
        {
            if (dt.Rows.Count == 0)
                return "";

            StringBuilder builder = new StringBuilder();
            builder.Append("<html>");
            builder.Append("<head>");
            builder.Append("<title>");
            builder.Append("Page-");
            builder.Append(Guid.NewGuid().ToString());
            builder.Append("</title>");
            builder.Append("</head>");
            builder.Append("<body>");
            builder.Append("<table border='1px' cellpadding='5' cellspacing='0' ");
            builder.Append("style='border: solid 1px Silver; font-size: x-small;'>");
            builder.Append("<tr align='left' valign='top'>");
            foreach (DataColumn c in dt.Columns)
            {
                builder.Append("<td align='left' valign='top'><b>");
                builder.Append(c.ColumnName);
                builder.Append("</b></td>");
            }
            builder.Append("</tr>");
            foreach (DataRow r in dt.Rows)
            {
                builder.Append("<tr align='left' valign='top'>");
                foreach (DataColumn c in dt.Columns)
                {
                    builder.Append("<td align='left' valign='top'>");
                    builder.Append(r[c.ColumnName]);
                    builder.Append("</td>");
                }
                builder.Append("</tr>");
            }
            builder.Append("</table>");
            builder.Append("</body>");
            builder.Append("</html>");

            return builder.ToString();
        }

        //private static void CarregarFilhos(DataTable iDtPrinc, DataRow iDrPrinc, ref Int32 iTotalCol, String pID, DataView iDvSec)
        //{
        //    if (iDvSec.Count > 0)
        //    {
        //        if (iDvSec.Count > iTotalCol)
        //        {
        //            //iTotalCol = iDtSec.Rows.Count;
        //            //for (int i = 1; i <= iTotalCol; i++)

        //            for (int i = (iTotalCol + 1); i <= iDvSec.Count; i++)
        //            {
        //                foreach (DataColumn iDc in iDvSec.Table.Columns)
        //                {
        //                    //if (!_DtGeral.Tables[0].Columns.Contains(iDc.ColumnName + "_" + i) && !iDc.ColumnName.Trim().Equals(txtID.Text.Trim(), StringComparison.OrdinalIgnoreCase))
        //                    if (!iDc.ColumnName.Trim().Equals(pID.Trim(), StringComparison.OrdinalIgnoreCase))
        //                        iDtPrinc.Columns.Add(iDc.ColumnName + "_" + i, iDc.DataType);
        //                }
        //            }
        //            iTotalCol = iDvSec.Count;
        //        }

        //        //copia dos dados
        //        int iAux = 1;
        //        foreach (DataRowView iDrSec in iDvSec)
        //        {
        //            foreach (DataColumn iDc in iDvSec.Table.Columns)
        //            {
        //                if (!iDc.ColumnName.Trim().Equals(pID.Trim(), StringComparison.OrdinalIgnoreCase))
        //                    iDrPrinc[iDc.ColumnName + "_" + iAux] = iDrSec[iDc.ColumnName];
        //            }
        //            iAux++;
        //        }

        //    }
        //}

        #endregion

Nenhum comentário:

Postar um comentário