9 10 2010
Agrupamentos Simples no Report Viewer do VS 2010
[Atenção!!! Este artigo tem sua versão em vídeo! Se quiser pular a parte escrita e só assistir o vídeo, dê uma olhada no final do post!]
Olá pessoal, tudo tranquilo?
No post de hoje vou explicar como fazer agrupamentos simples no Report Viewer que acompanha o Visual Studio 2010. Vou falar sobre isso porque, como vocês sabem, o novo Report Viewer conta agora com componentes novos, mais avançados e sofisticados, como o novo Tablix. E, com a chagada das funcionalidades novas do Tablix, uma das features que teve melhorias foi a questão de agrupamentos. Agora conseguimos fazer agrupamentos de várias formas (Column ou Row Groups, do tipo Parent, Child, Adjacent Right e Adjacent Left).
Entretanto, toda essa sofisticação na questão dos agrupamentos acabou confundindo todo mundo que estava acostumado com o jeito antigo de se fazer agrupamentos (botão direito, add group e pronto). Várias questões no fórum da MSDN tratam essa questão de pessoas perdidas com o agrupamento no Report Viewer do VS 2010.
Portanto, neste artigo / vídeo de hoje, vou mostrar uma das maneiras para que vocês consigam criar o mesmo tipo de grupo que vocês estavam acostumados com as versões anteriores.
Primeiramente, para esse exemplo, vamos utilizar a seguinte estrutura:
Nesse DataSet temos uma lista de Atividades. Essas Atividades foram executadas em alguma data por um certo funcionário. Suponham que tenhamos os seguintes dados nesse DataSet:
Com essas informações, gostaria de montar um relatório agrupado por:
G1) Atividades
G2) Datas
D) Funcionários
Para conseguirmos um relatório com esse layout, no seu projeto no Visual Studio 2010, adicione um novo item do tipo Report. Não se esqueça que essas informações são válidas para aplicações com Target Framework = .NET Framework 4.0.
No relatório que você criou, abra o ToolBox e arraste um componente do tipo Table no corpo do seu relatório. Na janela Report Data, adicione um novo DataSet no seu relatório apontando para o local em que está a fonte de dados que alimentará o seu relatório.
Feito isso, arraste os campos DESCRICAO, DATA e FUNCIONARIO para as colunas da sua Table, de forma que ela fique parecida com a imagem abaixo:
Com isso, temos uma listagem simples dos dados da nossa tabela. Para criarmos os grupos, clique com o botão direito na linha de detalhe e escolha a opção Add Group -> Parent Group…
Na janela que se abre, escolha o campo de agrupamento que, no nosso caso, é o campo DESCRICAO (atividade), já que esse é o primeiro grupo do relatório que estamos querendo fazer. Escolha também a opção para que o Report Viewer crie o Group Header para utilizarmos mais pra frente.
Ao executar essa operação, o Report Viewer cria uma coluna para identificar o agrupamento. Como não precisamos dessa coluna de acordo com o layout que estamos querendo, podemos deletá-la, clicando com o botão direito e escolhendo a opção Delete Columns e Delete Columns Only na caixa de diálogo.
Faça exatamente o mesmo procedimento acima para incluir o segundo grupo, só que agora escolhendo o campo DATA.
Pronto! Com os grupos prontos, basta você customizar a formatação da sua Table para que ela fique parecida com a imagem abaixo (lembrando que o propósito deste artigo não é deixarmos o relatório bonito, mas sim, mostrar como podemos agrupar uma Table de forma simples como você estava acostumado nas versões anteriores):
Para testar o relatório, basta incluir um Form no seu projeto, arrastar da sua ToolBox o componente ReportViewer e escolher o relatório que acabamos de criar. E o resultado vai ser parecido com o que mostramos no início do artigo.
É isso… Conseguiram entender? Se o artigo não foi suficiente, não tem problema! Abaixo segue um vídeo mostrando passo-a-passo como você consegue obter o mesmo resultado. Aí não tem erro! =)
[Observação: para assistir o vídeo em uma qualidade melhor, clique no botão HD do Media Player abaixo]
Antes de me despedir, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail toda semana sobre o artigo publicado, ficará sabendo em primeira mão sobre o artigo da próxima semana e receberá também dicas “bônus” que eu só compartilho por e-mail. Além disso, você já deve ter percebido que eu recebo muitas sugestões de temas e eu costumo dar prioridade às sugestões vindas de inscritos da minha newsletter. Inscreva-se utilizando o formulário logo abaixo.
Por hoje é só. Espero que vocês tenham conseguido entender como podemos fazer o bom e velho agrupamento simples das versões anteriores no Report Viewer do Visual Studio 2010.
Qualquer coisa é só deixar um comentário no post. Até a próxima!
André Alves de Lima.
Chegando ao Microsoft MVP Localizando sua Aplicação WPF utilizando Arquivos de Recursos
[…] Agrupamentos simples no report viewer do vs 2010 – André Alves […]
Muito interessante o seu post André. Parabéns.
O que eu não estou satisfeito com o Report Viewer 2010 é que se neste seu exemplo, se você adicionar registros com a mesma data e atividade o suficiente para quebrar a página ele não repete o cabeçalho na página seguinte. No 2008 tinha a opção RepeatOnNewPage. No 2010 não tem isto na Janela de Propriedades eu costumo resolver isto editando diretamente no XML do relatório.
Alan,
Primeiramente, muito obrigado pelo comentário!
Quanto à sua necessidade, não tinha reparado nessa diferença de comportamento. Vou dar uma verificada melhor e, se descobrir algo, posto aqui.
[]’s, André.
Tem como somar os valores distintos que vem de um DataSet usando o Expression no reportviewer?
EX:
item Valor
A 100
B 200
C 300
D 400
A 100
B 200
C 300
D 400
Soma = 1000 (somando somente os valores cujo item nao repete)
o que eu consigo é:
=FormatCurrency(Sum(Fields!Valor.Value)) Soma = R$ 2.000,00
Vlw
Olá Matheus.
Obrigado pelo comentário. Eu não testei, mas, pode ser que este artigo te ajude:
http://blogs.msdn.com/b/sqlforum/archive/2011/04/28/walkthrough-how-to-get-distinct-values-of-a-column-of-a-sharepoint-list-using-sql-server-reporting-services.aspx
Ele mostra como retornar somente os dados não repetidos de uma coluna. Aí é só mesclar com essa sua fórmula e provavelmente vai funcionar como esperado.
André Lima
Eu estava acostumado com Crystal e Jasper, agora estou precisando criar um formulário com o Report Viewer e também não encontrei opção para repetir o cabeçalho nas páginas.
Acabei encontrando a solução em um site gringo. A princípio não me pareceu muito intuitivo mas enfim… vou deixar postado aqui para outros que tiverem a mesma dificuldade.
Na janela “Rows Groups”, clicar na seta à direita e selecionar a opção “Advanced Mode”. Selecionar a primeira linha “Static” e setar suas propriedades como KeepTogether=True, KeepWithGroup=After, RepeatOnNewPage=True (apenas a última propriedade setada como true não funcionou aqui – tive que setar as 3).
Não consegui achar dentro de advanced mode tais opções, vc tem a referência de onde encontrou a solução. até !
Opa…De tanta insistência localizei o item, obrigado e acho que o post vai ajudar muitas pessas ainda.
Valeu cara, a unica maneira que encontrei de repetir o cabeçalho da Tabela, foi o método que você falou…
abrigado mesmo
Esse teu comentário ajudou muito!
Olá Piter, obrigado pelo comentário! Fico feliz que a solução apresentada pelo Vinicius tenha te ajudado no seu projeto.. Qualquer coisa estamos aí..
Abraço!
André Lima
Alan,
Na verdade parece que esta opção está disponível também no Report Viewer 2010, só que está muito bem escondida…
http://stackoverflow.com/questions/5469292/how-to-show-headers-in-each-page-of-the-report-in-microsoft-report-viewer
Abraço,
André Lima
Olá André,
Trabalho muito com relatórios, tanto Report Viewer como Crystal. Gostaria de dar os meus parabéns, bem explicativo e de fácil entendimento, algumas coisas mudaram muito da versão 2008 para a 2010, é bom alguns artigos e MELHOR ainda vídeo-aulas demonstrando como realizar determinada coisa na versão do 2010.
Bom, parabéns mais uma vez !! Abs
Rafael,
Muito obrigado pelo elogio!
Um grande abraço!
Olá Amigo, estou tendo um grande problema com esse report viewer, preciso muito que você me ajude!
Seguinte, eu estou trabalhando com Linq to SQL e estou tentando fazer um monte de coisa nesse ReportViewer e nada da Certo!
1º: meu select tem funções de agregação do tipo e sum(talcoluna)/count(talcoluna) as NomeColuna
Eu faço group by “NomeColuna” ….e uso colunas de outras tabelas, um exemplo é que uso Join.
Me fala ai, como eu faço para chegar nesse resultado no Report Viewer?
Como eu jogo um “select” dentro desse report viewer e poder especificar cada coluna do que está vindo do meu datatable ou dataset?
2º Eu tentei usar a dois dataset mas ele não permite, então como irei colocar o nome do cliente do dataset 2 se no dataset 1 só tenho o ID?(resumo: como fazer JOIN dos dataset?) Eu joguei o nomedocliente do primeiro dataset e blz, fui jogar os dados da venda na tela do dataset 1 e dai falou que não permite….eaew, #comofas?
3º Eu uso consultas do tipo iqueryable, como eu faço para jogar esses dados dentro do reportviewer?
Obrigado amigo, espero que me ajude ou me forneça algum tipo de material para eu poder consultas coisas avançadas como essa. Obrigado.
Olá Reynaldo, obrigado pelo comentário.
Realmente o Report Viewer é um tanto quanto complicado. Eu sempre sugiro que você prepare os dados para o relatório em uma só “view” no banco de dados ou, caso esteja trabalhando com dados em memória, prepare todos os dados em somente uma DataTable e utilize essa DataTable como fonte de dados do seu relatório.
André Lima
Realmente explicação de ótima qualidade, estava com muita dificuldade para entender essas modificações!
Muito Obrigado
Alfeu,
Obrigado pelo comentário!
Abraço!
André Alves de Lima.
Boa tarde, Amigo preciso de uma ajuda que nao acho em nenhum lugar, consegui fazer a ligação com o banco de dados tudo certinho, mas quero no proprio formulario colocar um texte e um botao para filtrar o conteudo que eu quero mostrar, mas ta dificil viu, gostaria da sua ajuda
Paulo,
Veja se este vídeo te ajuda em algo:
Abraço,
André Lima
Excelente Post! Ajudou bastante!
Preciso de uma ajuda, será que alguém já fez?
Colocar subtotais e totais em relatórios agrupados?
Muito obrigado,
Juvenal
Olá Juvenal,
Veja se este link te ajuda em algo:
http://www.sourcecodester.com/visual-basic-net/reportviewer-grouping-data-rdlc-report.html
Abraco,
André Lima
Parabens cara!!!!
Excelente demosntração…..
Ótimo tutorial, mas estou com um problema que não consigo resolver,
tenho uma classe assim
long id;
string name;
list observations;
o que acontece é que não consigo exibir essa lista de observações.
Poderia me ajudar?
Olá Felipe,
Obrigado pelo comentário. Só não consegui entender a sua dúvida. Como assim você não consegue exibir essa lista de observações?
André Lima
Bom dia Andre.
Bom tutorial. Será que vc consegue me ajudar com este problema? Uma vez feito o relatório, ele aparece no ReportView corretamente mas colapsado. Se eu gero um PDF a partir dele o pdf é renderizado também colapsado. Como o relatório é grande, não da para ir abrindo todos os grupos.
ja procurei e vou continuar procurando mas se vc tiver alguma dica, por favor…
Olá Deraldo,
Primeiramente, obrigado pelo comentário!
Dê uma olhada nesta thread do forum da MSDN americana.. Nela está sendo discutida uma possibilidade de proporcionar ao usuário uma opção de expandir/retrair todas as linhas de um grupo.. Acredito que ela vá te ajudar a solucionar o seu problema..
Abraço!
André Lima
Andre, boa tarde.
Estou usando o VS 2010 (vb.net)
Estou tendo criar um relatório com o Report Viewer.
-‘ Criei o dataSet
– Criei .RDLC
– Quando entro na tela do relatorio e seleciono
opção “View”->”ReportData”. Ao clicar em “New”->”DataSet” apresenta o erro
“Microsoft Visual has encountered a problem and needs to close”.
O que posso fazer para corrigir esse problema.
Agradeço a sua ajuda.
Marcelo
Marcelo,
Não sei se você ainda está tendo esse problema, mas, ele é um daqueles difíceis de resolver.. Esse tipo de erro “Microsoft Visual has encountered a problem and needs to close” normalmente acontece quando o Visual Studio (ou algum componente de terceiros ou extensão) crashou e não conseguiu se recuperar.. Eu tentaria fazer um repair no Visual Studio pra ver se ajuda.. Ou ir desabilitando / desinstalando as extensões pra tentar entender se alguma delas está causando esse crash..
Espero que ajude..
Abraço!
André Lima
[…] entender com facilidade é que, todos os meses, o post mais lido do meu blog sempre acaba sendo um post de 2010 sobre agrupamentos simples no Report Viewer do Visual Studio 2010. Levando em conta essa estatística, achei pertinente abordar de vez em quando o assunto […]
André,
Parabéns pelo tutorial, eu nunca tinha trabalhado com reportviewer.
Com esse tutorial consegui evoluir bem no que eu precisava.
Att,
Gustavo.
Olá Gustavo!
Muito obrigado pelo comentário! Fico feliz em ter ajudado com o tutorial.. Fique atento aos novos posts do blog.. De vez em quando escrevo sobre geração de relatórios no Visual Studio (não só com o ReportViewer, mas também com o Crystal Reports).. Além disso, estou planejando escrever um ebook sobre relatórios com ReportViewer.. Caso ache a ideia interessante, inscreva-se no site para não perder nenhuma novidade..
Grande abraço!
André Lima
Bom dia, André
Tenho um simples projeto (Windows Form) utilizando o banco de dados em Access com os campos ID, Nome e Imagem (guarda apenas o caminho da imagem), gostaria de ajuda para inserir as imagens do banco no ReportViewer, pois há vários dias estou tentando alguns códigos, dicas e exemplos dado em video, mas sem sucesso. Apenas aparece um “X” vermelho no lugar das fotos. Não encontrei nada por aquí referente a isso. Estou desenvolvendo em C# no VS 2010 com ACCESS.
Poderia me ajudar?
Desde já agradeço a colaboração…Obrigado!
Olá! Primeiramente, obrigado pelo comentário!
Ontem eu vi a sua questão nos foruns da MSDN e achei interessante.. Não sei se você viu, mas, eu respondi a questão lá no forum:
https://social.msdn.microsoft.com/Forums/pt-BR/670c246e-68a7-4a9e-ba60-e62ae1eb2f1d/imagens-no-reportviewer-com-access?forum=vsreportingpt&prof=required
Vou postar a resposta aqui também caso o link saia do ar algum dia:
O que você precisa fazer é adicionar um campo imagem no seu relatório e configurar suas propriedades da seguinte maneira:
– Source: “External”
– Value: =”File://” & Fields!NomeDaColunaOndeEstaOCaminhoDaImagem.Value
Depois, na hora de exibir o relatório, você precisa alterar uma propriedade muito importante, a “EnableExternalImages”, antes de chamar o RefreshReport.. Dessa forma, a chamada do relatório ficaria parecida com o seguinte:
this.TblTableAdapter.Fill(this.dbDataSet.Tbl);
this.reportViewer1.LocalReport.EnableExternalImages = true;
this.reportViewer1.RefreshReport();
Para entender melhor esse problema, confira os seguintes links:
https://social.msdn.microsoft.com/Forums/en-US/fd71bb7e-ce9d-4120-8599-c010edbe5f74/relative-path-for-an-image-on-the-report-viewer?forum=vsreportcontrols
http://www.codeproject.com/Articles/38554/Microsoft-Reporting-Services-Part-II
E caso queira receber uma lista gratuita com diversos outros recursos sobre o Report Viewer, inscreva-se na minha newsletter:
http://www.andrealveslima.com.br/blog/index.php/inscreva-se/
[…] de um caminho em disco no Report Viewer. Eu respondi a questão no próprio fórum (e também em um comentário de um outro post aqui no blog), mas, como não foi suficiente para resolver o problema do autor da questão, vamos ao […]
Bom dia André,
Nem sei se você está respondendo aqui ainda, mas se estiver, preciso de sua ajuda.
Fiz um relatório como no seu tutorial, mt bom por sinal, parabéns. Ele está funcionando, porém estou com um problema no HeaderGroup. Ele agrupa bonitinho, faz a quebra por página, mas na hora que exibe o header, ele não traz o valor de cada grupo não, só mostra o primeiro valor de grupo, tipo, tenho 7 agrupamentos diferentes, todos separados por página, mas no HeaderGroup só exibe o mesmo valor sempre. Utilizei aquele método de alterar o Static do RowGroup para exibir em cada página. Você sabe me dizer se tem que fazer mais alguma coisa para exibir o valor correto de cada agrupamento?? fico no aguardo caso você ainda acompanhe o post.
Abraço…
Olá Marcos, obrigado pelo comentário! Porém, não consegui visualizar o seu problema.. Para facilitar, me mande um email (veja o endereço na página “Sobre”) com screenshots mostrando como está o designer do relatório, como ele está sendo exibido no preview e como ele deveria estar se comportando..
Abraço!
André Lima
[…] “Categoria“. Caso você não saiba como fazer isso, confira o meu outro artigo sobre agrupamentos simples no Report Viewer. O resultado deve ficar parecido com as imagens a […]
[…] 1) Agrupamentos Simples no Report Viewer do VS 2010 Eu já tinha reparado que esse é disparado o post mais lido do meu blog. Se olharmos o relatório de posts mais lidos de 2013, ele também ficou em primeiro. Esse ano não foi diferente. Com quase três vezes mais acessos do que o segundo colocado, esse post sobre agrupamentos simples no Report Viewer do Visual Studio 2010 foi novamente o campeão desse ano. Isso só me ajuda a validar a ideia de escrever um ebook sobre o ReportViewer. Além disso, estou utilizando um “lead magnet” com uma lista de recursos do Report Viewer para atrair novas pessoas para a minha newsletter. […]
Bom dia André!
Muito seu artigo. Sou iniciante no reportviewer e estou com uma dúvida gigantesca. Estou desenvolvendo um relatório e preciso adicionar o agrupamento ao final da linha, pois preciso calcular uma média de acordo com o agrupamento. É possível adicionar o agrupamento ao final da linha?
Olá Jean, obrigado pelo comentário!
Não consegui entender muito bem o que você está querendo dizer com “agrupamento ao final da linha”.. Será que você poderia explicar com mais detalhes? De preferência com screenshots mostrando o resultado que você está esperando.. Se quiser mandar mais detalhes por e-mail, fique à vontade: contato [arroba] andrealveslima [ponto] com [ponto] br..
Abraço!
André Lima
Cara, me passaram do nada aqui no projeto um relatório para eu diminuir o número de campos, de modo que o relatório coubesse em uma folha a4 em landscape.
Eu não sabia quase nada sobre como mexer em relatório .rldc. Me sugeriram que eu usasse agrupamentos para tornar alguns campos em grupos e assim removê-los da table principal do relatório. Eu não tinha ideia de como fazê-lo.
Mas eis que encontro esse teu vídeo passo-a-passo e aí eu consegui fazer a tarefa! Muito obrigado mesmo!
E o pessoal que comentou linkando outro site que explica como fazer os headers de grupos aparecem de novo quando começa uma nova página do relatório também foram de muita ajuda!
Obrigado.
Olá Piter, muito obrigado pelo comentário! Fico muito feliz que os meus artigos / vídeos tenham te ajudado na sua “saga” com o Report Viewer.. :)
Caso surja alguma dúvida, é só entrar em contato..
Um grande abraço!
André Lima
Boa tarde André, tudo certo? Já não é a primeira vez que te escrevo rsrs. Como seus artigos envolvendo o Report Viewer são tão bons talvez você consiga tirar uma dúvida minha. Eu tenho um datatable que recebem valores medidos de equipamentos, por exemplo equipamento1, valorX, equipamento2, valorY, classificados em colunas por nome do equipamento e por valor recebido, ou seja, são todos misturados. Neste datatable eu também armazeno a hora e a data que esse valor for medido para filtrar no relatório. Quando vou filtrar os dados por data, hora e nome, tudo ocorre bem, porém, quando tento filtrar mais de um equipamento o relatório fica vazio. Já tentei mudar muitas coisas, mas nada parece resolver. Será que é possível criar o relatório dessa maneira que quero fazer?
Desde já agradeço a ajuda!
Muito Obrigado.
Olá André, muito obrigado pelo comentário! Agradeço o elogio.. :)
Quanto à sua questão, teoricamente você poderia fazer isso com parâmetros “multi-valor”.. Veja como passar dados em parâmetros desse tipo neste link:
Passing a Multi-value parameter to the ReportViewer control
Como é que você tentou fazer e não deu certo? Poderia dar mais detalhes?
Abraço!
André Lima
Olá André, obrigado pela ajuda!
Não sei se o problema está relacionado aos parâmetros. Eu criei 3 deles, equip1, equip2 e equip3, cada um com a string que representa o nome do equipamento para ser filtrado e exibido.
A maneira que eu tentei fazer foi atribuindo os groups na seguinte ordem: id, data, hora, nome, valor, nome, valor, nome, valor. Fiz todos como parent, depois id, data e hora como parent e os demais como child, e por último id, data e hora como parent, o nome como parent e o valor respectivo ao nome como child.
No datatable está da seguinte maneira:
id | data | hora | equipamento | valor |
1 | 17/05/2017 | 13:30 | equip1 | X |
2 | 17/05/2017 | 13:30 | equip2 | Y |
3 | 17/05/2017 | 13:31 | equip1 | A |
4 | 17/05/2017 | 13:31 | equip2 | B |
A lógica que eu segui é que o filtro de data e hora vai ser sempre o mesmo para qualquer equipamento.
Como na tabela eu tenho misturado os nomes dos equipamentos, creio que na hora de fazer o segundo filtro aconteça alguma treta que impede que os dados sejam exibidos.
Eu tentei fazer como equação na visibilidade, não funcionou também. Tentei inserir o filtro no arquivo xsd do data table, mas sem êxito.
Penso em alterar o data table ou fazer três tabelas no relatório.
Peço desculpas pelo texto gigante, mas eu imagino como deve ser ruim ter de ficar tentando entender o nosso problema. Procurei ser mais claro possível.
Agradeço muito a força!
André.
Olá André!
Não entendi muito bem porque você criou todo esse monte de grupos.. Os seus dados já não estão vindo prontos da DataTable? Então era só filtrar o Tablix com a expressão que você quiser..
Mas, enfim, se você estiver tendo dificuldade com filtros no relatório, talvez uma ideia seria já mandar os dados filtrados para o relatório.. Uma opção para isso é trabalhar com DataViews.. Eu mostrei como fazer isso neste artigo:
Mandando uma DataTable filtrada para o Report Viewer
Abraço!
André Lima
Opá André.
Esqueci de mencionar essa parte.
O relatório deveria ser exibido mais ou menos da seguinte maneira:
data | hora | nome | valor | nome | valor |
data | hora | equip1 | X | equip2 | Y |
data | hora | equip1 | A | equip2 | B |
data | hora | equip1 | C | equip2 | D |
Ou seja, eu teria que filtrar o campo nome várias vezes. Essa é a parte que não estou conseguindo fazer.
Vou tentar utilizar o dataview como você indicou e mudar o data table criando uma coluna pra cada equipamento.
Muito obrigado pela ajuda e paciência André!
Olá André!
Entendi.. Tenta aí com DataView e, caso você não consiga (ou se realmente fizer questão de implementar direto no relatório), me manda o seu arquivo rdlc para eu dar uma olhada (contato [arroba] andrealveslima [ponto] com [ponto] br)..
Abraço!
André Lima