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

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!
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 -
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.
-
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 -
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.