none
Ajuda com expressão LINQ - Reorganizar dados com título repetido porém valores diferentes RRS feed

  • Pergunta

  • Olá, estou há um dia agarrado com uma forma de apresentar os dados na tela. Tenho um gridView onde será exibido um relatório contendo o nome do produto, o valor de venda do mês atual, valor de venda do mês/ano anterior, valor acumulado do ano e valor acumulado do ano anterior. Para isso criei uma struct onde cada campo corresponde a uma coluna do meu grid. Como temos vários produtos não dá pra fixar o número de linhas de cada período pois pode ser que tenha ou não determinado produto em determinado período. 

    A consulta no banco se dá em 4 etapas, chamo 2x um método onde passo uma data como parâmetro e 2x outro método que recebe 2 parâmetros (data inicial e data final). O resultado desse processamento coloco em um DataSet contendo minhas 4 tabelas de retorna das consultas. 

    Neste DataSet percorro cada tabela faço o somatório dos valores de venda do produto e agrupo-os por nome. Até aí tudo ocorre bem. O problema começa aí. Na hora de colocar no grid como tenho o mesmo produto para cada período preciso fazer com que eles sejam exibidos na mesma linha e não seja adicionado em uma nova linha. 

    Acho que minha lógica não está funcionando a contento. Alguém teria uma sugestão? Obrigado!

    sexta-feira, 22 de fevereiro de 2013 18:38

Todas as Respostas

  • Olá Osmar,

    Não seria o caso de usar um group by ou um pós processamento para agrupar em diferentes colunas?

    Poderia postar a sua estrutura e o que tem de código até agora?

    []s!


    MSc. Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Visual C#
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 28 de fevereiro de 2013 11:50
    Moderador
  • Olá Fernando, gostaria que me ajudasse a solucionar este problema. Estou achando bem complicado fazer isso. O que tenho de código até agora:

    Primeiro o meu método onde deveria fazer o preenchimento das minhas linhas da minha visão do relatório final:

     public List<RelatorioVisaoPrincipal> ObterRelatorioVisaoFinal(string periodo)
            {
                var periodos = Utilitarios.ObterPeriodosRelatorio(periodo);
                List<RelatorioVisaoPrincipal> linhasRelatorioFinal = new List<RelatorioVisaoPrincipal>();
               
                //DataTable tabelaAux = new DataTable();
                //tabelaAux.Columns.Add("TituloOrigemVenda");
                //tabelaAux.Columns.Add("ValorTotalMesAtual");
                //tabelaAux.Columns.Add("ValorTotalMesAnoAnterior");
                //tabelaAux.Columns.Add("ValorTotalAnoAnterior");
                //tabelaAux.Columns.Add("valorTotalAcumuladoAnoAnterior");       
    
                try
                {
                    var tabelas = RelatoriosDAL.ObterResultadoDeTodasConsultas(periodos);
                   
                    //var tabelasReunidas = tabelas.Tables[0].AsEnumerable().Union(tabelas.Tables[1].AsEnumerable().Union(tabelas.Tables[2].AsEnumerable().Union(tabelas.Tables[3].AsEnumerable())));
                    for (int i = 0; i < tabelas.Tables.Count; i++)
                    {
                        //var externalCodes = Utilitarios.MontarExternalCode(tabelas.Tables[i]);
                        //var equipes = RelatoriosDAL.ObterEquipesDeVendaPorExternalCodes(externalCodes);
                        //var resultado = ObterSomatorioParcialPorVeiculo(tabelas.Tables[i]);
                        //foreach (RelatorioVisaoParcial item in resultado)
                        //{
                        //    linhasRelatorioFinal.Add(new RelatorioVisaoPrincipal { TituloOrigemVenda = item.Origem, ValorTotalMesAtual = item.ValorTotalVendaPeriodo });
                        //}
                        switch (i)
                        {
                            case 0:
                                 var r1 = (ObterSomatorioParcialPorVeiculo(tabelas.Tables[i]));
                                 foreach (var item in r1)
                                 {
                                     resultado1.Add(new RelatorioVisaoParcial { Origem = item.Origem, ValorTotalVendaPeriodo = item.ValorTotalVendaPeriodo });
                                 }
                                break;
                            case 1:
                                 var r2 = ObterSomatorioParcialPorVeiculo(tabelas.Tables[i]);
                                 foreach (var item in r2)
                                 {
                                     resultado2.Add(new RelatorioVisaoParcial { Origem = item.Origem, ValorTotalVendaPeriodo = item.ValorTotalVendaPeriodo });
                                 }
                                break;
                            case 2:
                                var r3 = (ObterSomatorioParcialPorVeiculo(tabelas.Tables[i]));
                                 foreach (var item in r3)
                                 {
                                     resultado3.Add(new RelatorioVisaoParcial { Origem = item.Origem, ValorTotalVendaPeriodo = item.ValorTotalVendaPeriodo });
                                 }
                                break;
                            case 3:
                                var r4 = (ObterSomatorioParcialPorVeiculo(tabelas.Tables[i]));
                                 foreach (var item in r4)
                                 {
                                     resultado4.Add(new RelatorioVisaoParcial { Origem = item.Origem, ValorTotalVendaPeriodo = item.ValorTotalVendaPeriodo });
                                 }
                                break;
                        }                   
                    }
                    var resultadoFinal = resultado1.Union(resultado2);
                }
                catch (Exception)
                {
                    //GestorDeErros.TratarErro(ex);
                }
                return linhasRelatorioFinal;
            }

    Agora as minhas structs:

     public struct RelatorioVisaoParcial
        {
            public string Origem { get; set; }
            public decimal ValorTotalVendaPeriodo { get; set; }
        }
    
     public struct RelatorioVisaoPrincipal
        {
            public string TituloOrigemVenda { get; set; }
            public decimal ValorTotalMesAtual { get; set; }
            public decimal ValorTotalMesAnoAnterior { get; set; }
            public decimal ValorTotalAnoAnterior { get; set; }
            public decimal valorTotalAcumuladoAnoAnterior { get; set; }
        }

    Repare que faço o somatório com as minhas visões parciais, depois preciso identificar as minhas parciais, ver quais tem os nomes do produto repetido e agrupar os resultados em suas respectivas colunas sem adicionar em uma nova linha. Obrigado.

    terça-feira, 5 de março de 2013 13:17
  • Olá Osmar,

    Poderia me explicar qual o uso da estrutura RelatorioVisaoPrincipal?

    Os dados das tables do DataSet Tabelas estão mapeados apenas para a estrutura RelatorioVisaoParcial. 

    O passo para montar o RelatorioVisaoPrincipal vêm após este código? É desse código que vc precisa?

    []s!


    MSc. Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Visual C#
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 7 de março de 2013 12:18
    Moderador
  • Olá, a estrutura RelatorioVisaoPrincipal é utilizada como retorno para a camada de apresentação onde será feito o data bind no meu grid de apresentação desses dados. O dataSet contém minhas 4 tabelas em memória resultante da consulta com uma base de dados progress, onde cada tabela corresponde à um período passado como paràmetro sendo eles: Mes Atual, Mes - Ano Anterior/ Acumulado do Ano (são duas datas) e Acumulado Do Ano Anterior (Também passo duas datas).

    O passo para montar o relatório está dentro do método ObterRelatorioVisaoFinal e minha intenção é finalizar na expressão Linq que está errada. Este método chama outros métodos onde são feitos os cálculos de somatório dos valores de venda dos produtos bem como o agrupamento por nomes de produto.

    Resumindo, preciso agrupar os meus dados usando a expressão linq do método mostrado porém com algumas restrições:

     - Para cada período posso ou não ter determinado produto;

     - Caso eu tenha o produto no mes atual mas não tenha no mes do ano anterior, então esse campo deverá ser preenchido com o valor 0, para quando for feito o databind do gridview apareça o valor R$ 0,00.

    quinta-feira, 7 de março de 2013 15:02