André Alves de Lima

Talking about Software Development and more…

Criando totalizadores no Report Viewer

É fato que ao desenvolvermos relatórios é praticamente impossível não precisarmos de algum tipo de totalizador. Seja a soma de valores, contagem de registros ou média de um determinado range de valores, é muito improvável que um relatório não tenha a totalização de alguma propriedade. No artigo de hoje veremos como trabalhar com totalizadores no Report Viewer.

Antes de começar, caso você esteja trabalhando com o Visual Studio Express, saiba que não existe suporte ao desenvolvimento de novos relatórios nessa edição do Visual Studio. É possível adicionar o controle do Report Viewer para a exibição de relatórios existentes no Visual Studio Express, mas, para desenhar novos relatórios ou editar relatórios existentes, você precisaria utilizar o SQL Server 2012 Report Builder. Outra opção é migrar para o Visual Studio Community, que suporta o Report Viewer nativamente. Os exemplos desse artigo utilizarão a edição Community do Visual Studio.

Criando o relatório de exemplo

Para demonstrar a criação de totalizadores no Report Viewer, vamos criar um projeto do tipo “Windows Forms Application“. No Form que é criado automaticamente pelo Visual Studio, adicione o controle do Report Viewer e faça o “docking” do controle para que ele ocupe o espaço inteiro do Form.

Feito isso, vamos primeiramente criar o DataSet que será utilizado para alimentar os dados do relatório. Para isso, adicione um novo item do tipo “DataSet” ao projeto (“DataSet” fica dentro da categoria “Data” na tela “Add New Item“). Utilize o nome “DataSetRelatorio.xsd” para o novo DataSet a ser criado.

Após ter criado o DataSet, adicione uma nova DataTable chamada “Transacao” com as seguintes colunas: IDTransacao (auto incremento, chave primária), Descricao (string), Categoria (string), Valor (double).

Com o DataSet criado, vamos adicionar um relatório ao projeto. Para isso, utilize a opção “Add New Item” e escolha o item “Report“, que fica dentro da categoria “Reporting“. Dê o nome de “RelatorioTransacao.rdlc” ao relatório que será criado.

Uma vez executados esses passos, o Visual Studio terá criado um novo relatório em branco. Poderíamos ter utilizado o “Report Wizard“, mas, ele requer maiores explicações. Pretendo escrever um artigo somente sobre o “Report Wizard” no futuro.

No relatório em branco, a primeira tarefa que temos que executar é adicionar a fonte de dados para o relatório. Para isso, utilize a opção “New DataSet” da janela “Report Data“.

Na janela que se abre, preencha o nome do novo DataSet como “DataSetRelatorio“, escolha na caixa de opções “Data source” o DataSet que criamos anteriormente (“DataSetRelatorio“) e escolha na caixa de opções “Available datasets” a tabela “Transacao“.

Feito isso, adicione no relatório um controle do tipo “Table” e arraste as colunas do DataSet para dentro das células detalhe da tabela.

Como o nosso DataSet tem quatro colunas e o controle “Table” é criado com somente três colunas, precisamos adicionar uma coluna extra para o campo “Valor“. Insira uma nova coluna à direita de “Categoria” clicando com o botão direito e escolhendo a opção “Insert Column / Right“.

Finalmente, arraste o campo “Valor” até a célula da nova coluna que acabou de ser criada e formate o relatório para que ele fique com uma aparência mais profissional.

Adicionando os totalizadores

A maneira mais fácil de criarmos totalizadores é clicarmos com o botão direito sobre a coluna que queremos totalizar e escolhermos a opção “Add Total“.

Isso fará com que a soma dos valores da coluna escolhida seja exibida na última linha da tabela.

Note que um totalizador nada mais é do que uma expressão. Nesse caso, para adicionarmos uma soma de todos os valores da coluna “Valor“, utilizamos a expressão “Sum“, que recebe como parâmetro o nome da coluna a ser somada.

Entretanto, a expressão “Sum” não é a única expressão que podemos utilizar para criarmos totalizadores. Além dessa expressão, temos à nossa disposição outras diversas funções que podem ser utilizadas para agregarmos um conjunto valores. Você encontra uma lista dessas funções clicando com o botão direito em uma das outras células da linha inferior da tabela e escolhendo a opção “Expression“.

Na tela “Expression“, confira todas as funções de agregação dentro da categoria “Common Functions / Aggregate“.

As principais expressões utilizadas para agregações de valores são:

– Avg: retorna a média de um conjunto de valores
– Count: retorna a contagem de itens de um conjunto de valores
– CountDistinct: retorna a contagem de itens distintos de um conjunto de valores
– Max: retorna o maior valor de um conjunto de valores
– Min: retorna o menor valor de um conjunto de valores
– Sum: retorna a soma de um conjunto de valores

Por exemplo, para adicionarmos a contagem de itens no nosso relatório, podemos utilizar a expressão “=Count(Fields!IDTransacao.Value)“.

Testando o relatório

A única maneira de testarmos um relatório local desenvolvido com o Report Viewer é utilizando-o dentro de uma aplicação. Portanto, volte até o Form criado anteriormente e escolha o relatório que acabamos de criar utilizando a “smart tag” do controle do Report Viewer.

Ao escolher o relatório, o Visual Studio automaticamente criará um DataSet e um BindingSource apontando para o DataSet que criamos anteriormente (“DataSetRelatorio“, tabela “Transacao“).

Em um cenário de aplicação normal nós provavelmente acessaríamos algum banco de dados para recuperar a lista de transações. Porém, a fim de simplificarmos esse exemplo, vamos adicionar algumas transações manualmente no DataSet do relatório. Para isso, vá até o code-behind do Form e adicione o seguinte código no construtor:

        public FormTotalizadores()
        {
            InitializeComponent();

            DataSetRelatorio.Transacao.AddTransacaoRow("Saldo anterior", "Crédito", 1234.56);
            DataSetRelatorio.Transacao.AddTransacaoRow("Pagamento de Conta", "Débito", -125.98);
            DataSetRelatorio.Transacao.AddTransacaoRow("Salário", "Crédito", 6324.34);
            DataSetRelatorio.Transacao.AddTransacaoRow("Rendimentos", "Crédito", 243.56);
            DataSetRelatorio.Transacao.AddTransacaoRow("Pagamento de Conta", "Débito", -230.99);
            DataSetRelatorio.Transacao.AddTransacaoRow("Transferência", "Débito", -500.00);
            DataSetRelatorio.Transacao.AddTransacaoRow("Pagamento de Conta", "Débito", -39.45);
            DataSetRelatorio.Transacao.AddTransacaoRow("Depósito", "Crédito", 200.00);
            DataSetRelatorio.Transacao.AddTransacaoRow("Pagamento de Conta", "Débito", -44.90);
            DataSetRelatorio.Transacao.AddTransacaoRow("Débito automático", "Débito", -135.50);
        }

Execute a aplicação e veja que a contagem de transações é exibida no final da coluna “Categoria” e a soma das transações é exibida no final da coluna “Valor“.

Totalizadores + Agrupamentos

Imagine a situação onde desejemos adicionar um agrupamento das transações por “Categoria“. Como o Report Viewer trata totalizadores quando temos agrupamentos no nosso relatório? Outras ferramentas de relatórios (como o Crystal Reports, por exemplo) demandam que você especifique explicitamente que o totalizador deve considerar o agrupamento. Felizmente a engine do Report Viewer é inteligente o suficiente para detectar se o totalizador está dentro ou fora de um grupo e, caso esteja dentro do grupo, ele automaticamente considerará que o totalizador deverá considerar somente os registros daquele grupo. Já no caso do totalizador estar fora de uma área de agrupamento, o Report Viewer considerará todos os registros para calcular o valor do totalizador.

Para entendermos essa sistemática, vamos agrupar as linhas da nossa lista de transações por “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 seguir.

Execute a aplicação e veja que o Report Viewer calcula os totalizadores justamente da forma que esperamos.

Caso você queira explicitamente indicar para o Report Viewer que o totalizador deve considerar somente os registros do grupo (não é necessário, mas, vai que você queira fazer isso), basta editar a expressão do totalizador e adicionar um segundo parâmetro com o nome do agrupamento. Por exemplo, a expressão para a somatória dos valores da transação pelo grupo de categorias ficaria a seguinte: “=Sum(Fields!Valor.Value, “Categoria”)

Concluindo

Não importa o relatório que você for desenvolver, muito provavelmente ele terá algum tipo de totalizador, seja a contagem de registros, somatório de valores, média de valores, etc. Nesse artigo você aprendeu a adicionar totalizadores no Report Viewer, tanto em relatórios simples quanto em relatórios com agrupamentos. Para ficar por dentro dos próximos posts, assine a minha newsletter clicando aqui ou utilizando o formulário abaixo.

Até a próxima!

André Lima

Image by Chad Miller used under Creative Commons
https://www.flickr.com/photos/chadmiller/311308512

Newsletter do André Lima

* indicates required



Powered by MailChimp

59 thoughts on “Criando totalizadores no Report Viewer

  • Wanderson disse:

    Bom dia,

    Muito bons seu material desenvolvido sempre acompanho seu site. Eu tenho um duvida eu utilizo o ReportView para criar relatórios, só que não consigo justificar um texto dentro dos compomentes como pro exemplo TextBox, como tenho alguns relatório que o cliente precisa de um texto justificado, você conhece uma maneira de justificar no ReportView?.

    Obrigado.

  • […] Existe uma categoria de expressões que servem para totalizar grupos de valores no Report Viewer. Não vou detalhá-las nesse artigo pois semanas atrás eu escrevi um post justamente sobre totalizadores no Report Viewer. […]

  • Bartolomeu Feliciano disse:

    Ótimo trabalho. Tenho aprendido muito com seus artigos.
    Se possível, gostaria de ajuda para resolver o problema que estou tendo ao somar no ReportViwer. Preciso somar o último registro menos o primeiro. Isso é para cálculo de horímetro de equipamentos. Por exemplo:
    2000
    2010
    2020
    2030
    Total: 2030 – 2000 = 30.

    Podes ajudar?

  • Anderson Nunes disse:

    Olá André tudo bem?

    Estou tentando resolver um problema para o meu TCC. Eu tenho um relatório financeiro onde eu agrupei os totais por entrada e saída.

    Preciso fazer uma linha exibindo o Total de entrada menos o total de saída. Como fazer?

    Grato pelo seu apoio.

    • andrealveslima disse:

      Olá Anderson!

      Nesse caso eu acho que a única alternativa é fazer dois somatórios combinados com a expressão IIF.. No primeiro somatório você só considera as linhas que são do tipo “entrada” e no segundo somatório você considera só as linhas que são do tipo “saída”.. A expressão completa ficaria mais ou menos assim:

      =sum(iif(Fields!TipoLancamento.Value=”ENTRADA”, Fields!Valor.Value, Convert.ToDecimal(0))) – sum(iif(Fields!TipoLancamento.Value=”SAÍDA”, Fields!Valor.Value, Convert.ToDecimal(0)))

      Eu preparei um projetinho de exemplo pra você.. Baixe o projeto neste link e veja se é isto que você está querendo fazer:

      https://www.dropbox.com/s/tyv6nlresheokul/EntradaMenosSaidaRV.zip?dl=0

      Abraço!
      André Lima

  • Alverne Paiva disse:

    Como faço pra criar um totalizador de campo mas que ele apareça no rodapé do relatório e não no corpo. Quando tento da um erro dizendo que ” references a field in an aggregate expression without a scope. “.

    • andrealveslima disse:

      Olá Alverne!

      Você precisa colocar o nome do DataSet como segundo parâmetro na expressão de SUM:

      Você já tentou dessa maneira?

      Abraço!
      André Lima

  • WEDER FRANÇA DOS SANTOS disse:

    Olá André,

    Sou iniciante em C#, criei um relatório onde busco produtos em um determinado produto, até aí tudo bem, consigo realizar este processo.
    Gostaria de no final do relatório exibir o total das vendas destes produtos.
    Segui sua última orientação (=Sum(Fields!TotalVendas.Value, “ProdutosOrdem”);
    porem nada acontece e no textbox que coloquei esta espressão aparece “erro”.
    Como faço para solucionar tal problema.
    No seu exemplo a expressão “sum” ficou marcada pelo visual studio como erro, teria como resolver esta questão.
    desde de já agradeço.

    • andrealveslima disse:

      Olá Weder, tudo tranquilo?

      Muito estranho, hein.. Eu montei aqui um exemplo rapidinho e funcionou tranquilamente:

      Se quiser, você pode baixar esse projeto de exemplo aqui.. Se você ainda não tiver conseguido resolver esse problema mesmo olhando esse exemplo que eu preparei, me envia o seu arquivo rdlc para eu dar uma olhada..

      Abraço!
      André Lima

      • Bianca Gomes disse:

        Seu arquivo não está abrindo, tem como explicar mais como você fez isso?

      • Alberto Estante disse:

        Ola, sou grande devorador dos seus posters: obrigado e parabens pelo belo trabalho. O teu exemplo funciona, mas eu kero que em cada pagina (no page footer) coloque o total da coluna dessa pagina e a partir da 2a pagina colocar tb o total da pagina anterior na page header

        • andrealveslima disse:

          Olá Alberto, muito obrigado pelo comentário!

          Eu acredito que a sua dúvida é exatamente a mesma que a Mariana (outra leitora do site) postou nos comentários desse mesmo artigo.. Se você der uma olhada nos comentários mais abaixo, você verá a conversa que tivemos.. Clique neste link para ir direto para o comentário dela ou procure por “saldo anterior” aqui na área de comentários que você vai encontrar a nossa discussão..

          Abraço!
          André Lima

  • Inelves disse:

    Olá
    Eu criei uma expressão para calcular objetivos Diários para os Clientes, entretanto esses Objetivos posem ser valores positivos ou negativos, Então meu total simplesmente faz o que deveria fazer, soma o que é pra somar e diminui, entretanto que queria que apenas somasse os valores positivos.

    minha expressão é essa para calcular os valores de cada cliente

    ((Lookup(Fields!Codigo_Vendedor.Value+Fields!Codigo_Cliente.Value+Fields!Cod_Gpo.Value,Fields!Codigo_Vendedor.Value+Fields!Codigo_Cliente.Value+Fields!Codigo_Gpo.Value,Fields!Meta_Vlr.Value, “Objetivo_Cliente”)) – (Lookup(Fields!Codigo_Cliente.Value+Fields!Cod_Gpo.Value,Fields!Codigo_Cliente.Value+Fields!Cod_Gpo.Value, Fields!Valor_Total.Value, “Venda_Cliente”))) / (Lookup(Fields!Codigo_Cliente.Value,Fields!Codigo_Cliente.Value, Fields!VP.Value, “Visitas_Prevista”))

    Como posso fazer um total de apenas Valores Positvos???

    Desde Já agradeço

    • andrealveslima disse:

      Olá Inelves!

      Não consegui entender direito a sua expressão sem ter mais informações dos seus DataSets (quais são as tabelas, campos, etc).. Entretanto, para somar somente valores positivos, você teria que utilizar um IIf onde você analisa se o valor da expressão é maior ou menor que zero.. Se for maior que zero, você considera o próprio valor da expressão.. Se for menor que zero, você considera zero..

      Seria algo como:

      =IIf(SuaExpressao > 0, SuaExpressao, 0)

      Entendeu? Se não tiver entendido, fique à vontade para me mandar o seu arquivo rdlc por e-mail e mais informações sobre exatamente o que você está querendo fazer.. Meu endereço é contato [arroba] andrealveslima [ponto] com [ponto] br..

      Abraço!
      André Lima

  • Elcio Esteves disse:

    Bom dia André,

    Parabéns pelo post, muito bom.
    Preciso de uma ajuda para repetir os totais dos agrupamentos no final do relatório como no exemplo.

    Filial Produto Valor
    1 45 20,00
    96 10,00
    Total Filial 1 30,00

    2 12 52,00
    25 10,00
    30 12,00
    Total Filial 2 74,00

    Total Filial 1 30,00
    Total Filial 2 74,00
    Total Geral 104,00

    Desde já agradeço,

    Elcio Esteves.

  • Fabricio Souza Moreria disse:

    Boa tarde, André.

    Estou precisando criar uma coluna de saldo no meu relatório tipo descrito abaixo, mas não estou sabendo como.
    Descrição Quantidade Saldo
    LANCA 01 100,00 100,00
    LANCA 02 50,00 150,00
    LANCA 03 -20,00 130,00

    • andrealveslima disse:

      Olá Fabrício!

      Para conseguir fazer isso você só precisa utilizar a expressão “RunningValue”.. Exemplo, supondo que o campo que você quer criar o saldo se chame “Valor”:

      =RunningValue(Fields!Valor.Value, Sum, Nothing)
      

      Abraço!
      André Lima

  • Jorge Aranda disse:

    Boa noite André, acompanho seus artigos e ja adianto que todos são muito bons!

    Tenho uma duvida, tenho um report que da em torno de 12 a 16 paginas, onde cada linha tem um valor, eu preciso somar o total dos valores da pagina em questão e apresentar isso no final de cada pagina.

    Alguma dica? Muito obrigado!

    • andrealveslima disse:

      Olá Jorge, muito obrigado pelo comentário! Fico feliz que os meus artigos estejam te ajudando.. :)

      Quanto à sua questão, como indicado nesta thread do StackOverflow, teoricamente você pode somar os valores por página colocando um TextBox no rodapé da página com a seguinte expressão:

      =Sum(ReportItems!NomeDoTextbox.Value)
      

      Você já tentou dessa forma?

      Abraço!
      André Lima

  • Mariana disse:

    Bom dia, André! Muito bom seu artigo.
    Tenho um relatório que monta um extrato da conta bancária do cliente, baseado naquilo que ele comprou e vendeu em determinado período. Eu mando como parâmetro o saldo do dia anterior e na linha detalhe vou deduzindo ou acrescentando nesse valor, dependendo se o registro é a Pagar ou Receber. Quando meu relatório tem mais de uma página, eu preciso pegar esse valor calculado da última linha detalhe da primeira página e mostrar na segunda página, no mesmo campo onde eu mostro o saldo do dia anterior na primeira página. É como se o valor calculado da primeira página fosse o novo saldo anterior.
    Não sei se fui clara, mas tem como fazer isso?

    • andrealveslima disse:

      Olá Mariana, muito obrigado pelo comentário!

      Como é que você está fazendo para acumular os valores na primeira página? Você por um acaso está utilizando a expressão “Previous” para pegar as informações acumuladas até o registro anterior? Se estiver utilizando essa expressão, acredito que a lógica seria a mesma para pegar as informações da página anterior..

      Me conte mais informações sobre como você está fazendo para acumular os valores na primeira página..

      Abraço!
      André Lima

      • Mariana disse:

        Olá, André, obrigada pela resposta :D
        Eu estou usando a expressão RunningValue para acumular os valores da linha detalhe.
        Eu uso uma fórmula que é a seguinte:
        @SaldoInicial + RunningValue(ValorEntradas – ValorSaidas)

        Onde @SaldoInicial eu mando por parâmetro para o relatório, ValorEntradas é uma coluna na linha Detalhe que mostra o valor do lançamento caso seja um recebimento e ValorSaidas é igual ao ValorEntradas, para mostrar o valor do lançamento caso ele seja um pagamento.

        • andrealveslima disse:

          Olá Mariana!

          Uau, que dúvida interessante hein.. O que você pode fazer é adicionar um campo invisível na sua área de detalhes que desconsidere o valor atual do RunningValue.. Por exemplo, suponha a seguinte Tablix onde eu quero acumular os valores da primeira coluna + um valor inicial (passado no parâmetro chamado “Inicio”:

          A minha expressão da segunda coluna (que vai ser o acúmulo, ou seja, o RunningValue), ficou assim:

          =RunningValue(Fields!Valor.Value, Sum, "DataSet1") + Parameters!Inicio.Value
          

          Isso é mais ou menos o que você tem até agora.. E aí que vem o segredo.. Em uma terceira coluna (configurada como invisível), você calcula o RunningValue menos o valor atual.. No meu caso, a expressão ficou assim:

          =RunningValue(Fields!Valor.Value, Sum, "DataSet1") + Parameters!Inicio.Value - Fields!Valor.Value
          

          Dê um nome claro para esse campo do relatório, no meu caso eu chamei de “TextboxRunningValueAnterior”.. Por fim, no cabeçalho da página, você pega o primeiro valor desse campo calculado, cujo valor vai ser justamente o total da página anterior:

          =”Total anterior = ” & String.Format(“{0:n2}”, First(ReportItems!TextboxRunningValueAnterior.Value))

          O resultado disso é o seguinte.. Primeira página:

          Segunda página:

          E assim por diante..

          É mais ou menos isso que você está procurando fazer?

          Abraço!
          André Lima

          • Mariana disse:

            Era exatamente isso que eu queria!!! Demorei pra entender seu raciocínio, mas finalmente consegui fazer funcionar.
            Muito obrigada pela ajuda!
            P.S. Acabei respondendo como comentário novo, por favor ignore a lerdeza da pessoa.

          • andrealveslima disse:

            Olá Mariana!

            Que bom que deu certo, fico feliz que tenha funcionado.. :)

            Qualquer outra dúvida, é só entrar em contato..

            Abraço!
            André Lima
            PS: fica tranquila, eu deletei o outro comentário.. ;)

  • Pablo Sousa disse:

    Boa Tarde André Lima!!!

    Parabéns pelo trabalho maravilhoso que faz, muito bom mesmo, para os aspirantes como eu, e ótimo.
    Andre estou com dificuldades de fazer a soma de uma coluna no relatorio, parece simples mas esta me deixando louco.
    Vamos lá eu uso o codigo simples para somar as colunas do relatorio mas nesse não esta dando certo, segue o codigo para somar a coluna – =Sum(Fields!ValorTotBruto.Value) , esse codigo esta em uma textbox no corpo do relatorio, em outros da certo nesse não vai, quando executa o relatorio na caixa texto retorna #erro, simples assim não fala erro em nenhum lugar, tem como debugar o relatorio em tempo de execução, para achar o erro, mas não consegui, acompanho seu trabalho ja faz 2 anos e vi que manja bem de relatorio, se pudar dar uma força no que pode estar acontecendo???
    Andre o que eu preciso e somente colocar o valor total da coluna em uma textbox, simples não, a outra coisa o dado esta em string no banco de dados tipo string.

    Andre desde já agradeço atenção, muito obrigado.
    aguardo possível ajuda.

    Pablo Sousa.

    • andrealveslima disse:

      Olá Pablo!

      Primeiramente, muito obrigado pelo elogio! Fico feliz que os meus artigos estejam te ajudando nos seus projetos.. :)

      Quanto à sua questão, provavelmente o erro está acontecendo porque, como você disse, o campo é do tipo string.. O Report Viewer não consegue somar strings, você tem que converter primeiro para algum tipo numérico.. Exemplo:

      =Sum(Convert.ToInt32(Fields!ValorTotBruto.Value))
      

      E quanto a debugar as mensagens de erro, normalmente você obtém mais informações sobre os erros do Report Viewer na janela de output quando um erro acontece.. Ou seja, execute a aplicação, abra o relatório e, quando aparecer #erro, dê uma olhada no conteúdo da janela “Output” no Visual Studio..

      Abraço!
      André Lima

      • Pablo Sousa disse:

        André Lima Boa Tarde!!!

        Excelente André, perfeito muito bom resolveu tudo.
        André muito obrigado pela ajuda, parabéns pela sabedoria.
        Sobre o erro isso que era interessante não aparecia erro nenhum ali onde você fala, “Output”, mas beleza agora deu tudo certo.
        Desde já agradeço, muito obrigado.
        Ate a proxima!!!

        Atenciosamente,

        Pablo Sousa.

        • andrealveslima disse:

          Olá Pablo!

          Que estranho hein.. Aqui sempre que eu recebo um erro a janela output indica mais informações do que está acontecendo por trás dos panos.. Mas, enfim, que bom que acabou dando certo.. :)

          Abraço!
          André Lima

  • Miguel Pires disse:

    André, bom dia!

    Estou com a seguinte dúvida: Estou fazendo uma folha de ponto e preciso que em uma coluna dela, some e subtraia as horas extras e atrasos para que no final mostre o saldo de horas extras ou atrasos da pessoa, porém, quando o funcionário começa no primeiro dia com atraso a hora ao invés de vir negativa, aparece “#Erro” conforme a imagem ( https://i.imgur.com/5c9vfXK.jpg ). Acredito que isso acontece pois ele começa a contar da data 01/01/0001 as 00:00:00, sendo assim, não tem como diminuir nenhum valor. Consegue me ajudar?

    • andrealveslima disse:

      Olá Miguel!

      Primeiro precisamos entender exatamente qual é o erro que realmente está acontecendo.. Você já deu uma olhada na janela de output do Visual Studio depois que você exibiu o relatório para ver se não tem uma mensagem mais detalhada do erro? Como é que você está fazendo o somatório das horas? Semana passada eu publiquei um artigo sobre somatório de horas no Report Viewer, talvez as expressões que eu indiquei lá te ajudem também:

      Somatório de horas no Report Viewer

      Abraço!
      André Lima

  • Pablo Sousa disse:

    Boa Noite André Lima!!!

    André surgiu outra duvida, consegui fazer assim =Sum(Convert.ToInt32(Fields!ValorTotBruto.Value)), dar certo em numero inteiro por exemplo “1452”, agora se o numero for “14,52” consegui assim =Sum(Convert.ToDouble(Fields!ValorTotBruto.Value)), agora vem a questão, e se eu quizer formatar o resultado para R$ 14,52, como ficaria, já tentei formatcurrency, tentei format, mas ai da o erro do começo, tem como formatar esse resultado em reais???
    Desde já agradeço atenção, muito obrigado.

    Atenciosamente,

    Pablo Sousa.

    • andrealveslima disse:

      Olá novamente, Pablo!

      Eu faria somente a somatória normalmente com a expressão SUM (como você já fez) e depois formataria o TextBox pelo próprio designer do relatório (botão direito no TextBox -> TextBox Properties -> Aba Number -> Currency).. Você já tentou dessa maneira?

      Abraço!
      André Lima

      • Pablo Sousa disse:

        Bom Dia André Lima!!!

        André dessa forma não tinha feito, e agora deu certo, muito bom.
        Mais uma fez muito obrigado pela dica.

        Abraço!!!
        Pablo Sousa.

  • Pablo Sousa disse:

    Boa Noite André Lima!!!

    Andre tem acontecido em alguns relatórios o seguinte:
    Por exemplo faço uma pesquisa para ver todas vendas por porduto de janeiro, ai acontece assim no campo produto se tiver dois produtos iguais ele só aparece 1 o outro aparece em branco, ou as vezes nem a linha, onde posso arrumar isso, não esconder valores iguais nas colunas? será que tem como fazer isso???
    Desde já agradeço atenção, muito obrigado.

    Abraço!
    Pablo Sousa.

    • andrealveslima disse:

      Olá Pablo!

      Estranho hein.. Será que você poderia me enviar um screenshot dessa situação acontecendo para eu entender melhor o layout do seu relatório?

      Abraço!
      André Lima

  • Pablo Sousa disse:

    Olá André Boa Noite!!!

    André me desculpa acho que viajei, hoje cedo olhei a mensagem e fui analisar melhor realmente estranho hoje tudo funcionando, acho que digitei codigo errado, ou fiz a rotina errada sei lá, mas esse problema eu já tive antes em um relatorio de comissão, eu acrescentava os pedidos na relação de comissão, o que o pedido tem um codigo de pedido que vai na tabela pedido e na tabela produto do pedido, ai o pedido tem 6 produtos com o mesmo codigo, e ai que deu o problema so aparecia na coluna codigo do pedido a primeira linha com o codigo o restante não em branco, na epoca consegui arrumar vendo uma explicação da internet que nem lembro mais onde foi, lembro que foi em algum lugar que falava aceitar dados duplicados, que tambem não achei porque meu reportview esta em ingles, e não consegu colocar ele em portugues já temtei de tudo, o visual studio esta em portugues já baixei o pacote de idiomas mas fica em ingles, ai complica.
    Enfim o problema sumiu hoje deu certo, desculpa ai a minha falha.
    Desde já agradeço, muito obrigado por tudo.

    Abraço!!!
    Pablo Sousa

    • andrealveslima disse:

      Olá Pablo!

      Sem problema! O que importa é que o problema foi resolvido.. :)

      Existe mesmo uma propriedade que podemos utilizar no Report Viewer para esconder dados repetidos, porém, ela é desabilitada por padrão.. Em inglês ela se chama “HideDuplicates”..

      Abraço!
      André Lima

  • Pablo Sousa disse:

    Boa Noite André Lima!!!

    André primeiramente parabéns pelo trabalho, mais uma vez preciso de seus conhecimentos, estou fazendo um relatorio e surgiu uma dificuldade tremenda talvez você possa dar uma dica, preciso saber o seguinte.

    Tenho 3 textbox, 1 preço venda, 2 preço custo, 3 resultado, preciso saber o seguinte a porcentagem entre a diferença de preço de venda para preço de custo, vamos lá.

    na calculadora

    23,50 / 13,64 = 1,72287 , ai tira o 1 e a virgula e fica 72287, ai coloca a virgula 72,29, 13,64 * 72,29 = 9,860 + 13,64 = 23,50 perfeito.

    mas em vb.net como fazer essa conta dar o resultado correto tipo textbox1 23,50 / textbox2 13,64 = textbox3 72,29.

    Estou fazendo assim em vb.net segue abaixo

    Me.txtlucro.Text = PV / PC
    Me.txtlucro.Text = (Me.txtlucro.Text.Replace(“,”, “”))

    Dim tirar As String
    tirar = Me.txtlucro.Text
    tirar = tirar.Remove(1, 1)
    Me.txtlucro.Text = tirar

    ‘ codigo colocar barra na string
    Dim strTexto As String
    strTexto = Me.txtlucro.Text
    strTexto = strTexto.Insert(2, “,”)

    Me.txtlucro.Text = strTexto

    Me.txtlucro.Text = Convert.ToDecimal(Me.txtlucro.Text).ToString(“F4”)

    gostaria de saber o resultado em porcentagem entre dois numeros por exemplo 23,50 / 13,64 = 72,29%.

    André não sei se pode fazer pergunta aqui mesmo, ou estou fazendo errado??? se estou me desculpe.

    Desde já agradeço atenção, muito obrigado.

    Pablo Sousa.

    • andrealveslima disse:

      Olá Pablo, obrigado pelo comentário!

      Sem problema, pode perguntar onde você quiser.. :)

      Quanto à sua dúvida, eu não entendi direito.. Você está com dificuldade em fazer isso no VB ou no relatório? Se for no VB.NET, tem uma maneira muito mais fácil, convertendo os valores para “Decimal” e fazendo a conta normalmente com os mesmos passos que você fez na calculadora.. Exemplo:

              Dim PrecoVenda = "23,50"
              Dim PrecoCusto = "13,64"
              Dim Resultado = ((Convert.ToDecimal(PrecoVenda) / Convert.ToDecimal(PrecoCusto)) - 1) * 100
              Resultado = Math.Round(Resultado, 2)
              MessageBox.Show(Resultado)
      

      Se for no relatório, você teria duas opções:

      1) Mandar essa informação já calculada para o relatório (recomendo – quanto menos cálculo no relatório, melhor)
      2) Calcular no relatório utilizando a mesma lógica que eu apresentei acima

      Abraço!
      André Lima

  • Pablo Sousa disse:

    Bom Dia André Lima!!!

    Primeiramente parabéns e muito obrigado pela ajuda, deu certo muito bom.
    E no VB.NET que estou fazendo, e melhor mesmo no relatorio e menos calculo melhor.
    Desde já agradeço demais, muito obrigado.

    Abraço!
    Pablo Sousa

  • Eder disse:

    Ola parabéns pelas dicas, ajuda muito nós iniciantes
    Andre, me diz uma coisa porque fica desabilitado meu ADD TOTAL, quer somar coluna com horas ..

  • Rodrigo disse:

    Olá.
    Parabéns pelos artigos e pela dedicação em ajudar as pessoas.
    Minha dúvida é a seguinte, tem um reportviewer no c# com algumas formulas de SUM. Porém quando exporto para o excel o relatório as formulas elas deixam de existir e a única coisa que aparece é a soma.

    Tenho um projeto que onde a pessoa pode exportar o relatório para fazer filtros porém gostaria de deixar esse campo de subtotal dinamico, aparecendo a formula no excel para que assim os calculos atualizem de acordo com os filtros. Existe como? E outra… tem como criar tabela dinamica no reportviewer?

    • andrealveslima disse:

      Olá Rodrigo, obrigado pelo comentário!

      Infelizmente, quando exportamos do Report Viewer (ou Reporting Services) para o Excel, as expressões não são convertidas para fórmulas na planilha.. O valor atual é calculado e exportado para o Excel.. Isso você pode conferir também na documentação:

      Text box values that are expressions are not converted to Excel formulas. The value of each text box is evaluated during report processing. The evaluated expression is exported as the contents of each Excel cell.

      Quanto a tabelas dinâmicas, o que você está querendo fazer exatamente? Normalmente quando pessoas perguntam sobre tabelas dinâmicas no Report Viewer, o que elas estão querendo fazer são agrupamentos por colunas.. Veja se não é isto que você está querendo fazer:

      Designing matrix reports

      Abraço!
      André Lima

  • Andre Luiz Alves disse:

    Grande André!!!
    Parabéns pelo post.
    Uma dúvida que me surgiu. No exemplo onde você faz um total com agrupamento, imagine o seguinte:
    – Quero fazer exatamente a mesma coisa. Porém, caso o grupo do crédito ou o grupo do débito esteja zerado, eu não quero que apareçam os registros no relatório.
    – Exemplo: Débitos estão zerados. Então o meu relatório somente ira exibir as linhas dos lançamentos em crédito. Os outros ficam invisíveis.

    Como eu devo fazer? Existe alguma configuração no relatório que faça automaticamente? Ou eu devo fazer um pré-processamento, somar tudo e deletar os registros do DataSet caso o total seja zerado?

    Obrigado pelo apoio!

    • andrealveslima disse:

      Olá André!

      Eu nunca fiz isso, mas você poderia tentar trabalhar com a configuração de visibilidade da linha de detalhes do Tablix.. Você pode adicionar uma expressão para decidir se a linha vai ser visível ou não.. Aí você poderia tentar fazer um SUM das informações e, caso o somatório desse zero, você não exibiria a linha..

      Entendeu a ideia?

      Abraço!
      André Lima

  • Miron Alighieri dos Santos disse:

    Olá André!
    Parabéns pela ajuda que tem provido a todos com seus posts e livros sobre report viewer.
    Gostaria de saber se tem como incluir índice em report viewer, ou seja, uma página que liste tópicos e a página onde este tópico está. Procurei bastante e não achei nada sobre. Desde já obrigado

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *