none
ReportViewer - Subtrair totais dos agrupamentos RRS feed

  • Pergunta

  • Ola pessoal

    Meu problema é o seguinte:

    Tenho um relatorio, usando agrupamentos, agrupados pro 2 datas. Exemplo:

    02/02/2009
    AAAAAAAAAAAA - 100,00
    BBBBBBBBBBBB - 200,00
    CCCCCCCCCC  - 200,00
    -----------------------------
    TOTAL - 500,00

    02/03/2009
    AAAAAAAAAAA - 200,00
    BBBBBBBBBBB - 50,00
    CCCCCCCCCC - 100,00
    -----------------------------
    TOTAL - 350,00

    IMPORTANTE:
    - Sempre serão somente duas datas (que sao informadas pelo usuario).
    - Os totais de cada data estao no rodape do grupo e sao calculados com o SUM(Fields!CampoValor.Value)

    Ate aqui tudo ok.

    O que preciso fazer é colocar no final do relatorio, por exemplo, no Table Footer, a diferenca (saldo) entre o 2º e o 1º totais. No exemplo acima seria (350,00 - 500,00) = R$ -150,00

    Como posso fazer isso?

    (Uso .NET 2.0 - VS 2005 - Report Viewer SP1)

    Obrigado.

    segunda-feira, 6 de abril de 2009 18:19

Respostas

  • Robson,

    Seu caso e relativamente simples pois voce sabe quais sao as datas (foram entradas pelo usuario como parametros do relatorio). Neste caso voce pode usar uma soma condicional, mais ou menos assim:
    =Sum(iif(Fields!Data.Value = Parameters!Data1.Value, -1 , 1 ) * Fields!soma.Value)

    basicamente se o valor for parte da primeira data, ele vai retornar -1, e portanto somar o valor negativo do campo. Se for diferente (data2) ele retorna positivo, no final voce tem todos os campos 2 menos todos os campos 1.

    Quanto ao problema da patricia, a maneira mais facil seria repetir a tabela com os agrupamentos no final, sem linhas de detalhe, assim a soma dos agrupamentos seria mostrada no final.

    Att
    Boreki
    http://www.boreki.eng.br
    quarta-feira, 15 de abril de 2009 20:39

Todas as Respostas

  • Fala !

    Você pode tentar fazer assim, já que serão sempre 2 datas.

    Vc calcularia 2 vezes o total. No Rodape ficaria mais ou menos assim :


    SUM(Fields!CampoValor2.Value) - SUM(Fields!CampoValor1.Value)
    
    
    Não sei se é a melhor forma de fazer, mas funcionaria...   =)


    Espero ter ajudado !

    segunda-feira, 6 de abril de 2009 18:37
  • Blz, Leandro

    O problema é que nao existe CampoValor2 e CampoValor1, é apenas um unico campo CampoValor.

    Entao se eu fizer:
    SUM(Fields!CampoValor2.Value) - SUM(Fields!CampoValor1.Value)
    Simplesmente o resultado sera SEMPRE ZERO. A nao ser que tivesse uma forma de eu dizer que a primeira soma é referente ao 2º agrupamento (350,00 no exemplo) e a 2ª soma referente só ao 1º agrupamento (500,00 no exemplo), que é o que eu preciso, sacou?

    []s

    segunda-feira, 6 de abril de 2009 18:45
  • Ninguem ai pra me dar um help?
    :(
    quarta-feira, 8 de abril de 2009 23:02
  • Robson,

    Você pode tentar assim: 
    =Sum(CampoValor.Value, "GrupoData")


    Onde "GrupoData" é o nome do agrupamento que você está utilizando.

    [ ]'s

    quinta-feira, 9 de abril de 2009 12:20
  • Olá Olintho

    O exemplo que voce passou apenas ira somar tudo.

    Como eu disse antes, eu preciso SUBTRAIR os dois subtotais (das duas datas), ou seja, a soma na primeira data do agrupamento MENOS a soma da segunda data do agrupamento. (veja no exemplo no 1º post).

    Mesmo assim , agradeço pela atenção.

    []s
    quinta-feira, 9 de abril de 2009 23:36
  • Oi Robson

    estou com um problema parecido com o seu.

    Tenho o total de cada grupo e no fim do relatório tenho que exibir esses totais novamente, separadamente.

    Se alguém puder nos ajudar.

     

    Agradeço

     


    Patricia
    segunda-feira, 13 de abril de 2009 12:02
  • Oi Patricia,

    Acho q o seu caso é ate mais complicado que o meu :/

    Ainda nao voltei a mexer no relatorio, portanto nao pesquisei mais sobre o assunto.. assim que puder darei uma "googlada" e uma verificada no forum americano.

    Qquer coisa, eu poste aqui

    []s
    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications
    quarta-feira, 15 de abril de 2009 00:07
  • Robson,

    Seu caso e relativamente simples pois voce sabe quais sao as datas (foram entradas pelo usuario como parametros do relatorio). Neste caso voce pode usar uma soma condicional, mais ou menos assim:
    =Sum(iif(Fields!Data.Value = Parameters!Data1.Value, -1 , 1 ) * Fields!soma.Value)

    basicamente se o valor for parte da primeira data, ele vai retornar -1, e portanto somar o valor negativo do campo. Se for diferente (data2) ele retorna positivo, no final voce tem todos os campos 2 menos todos os campos 1.

    Quanto ao problema da patricia, a maneira mais facil seria repetir a tabela com os agrupamentos no final, sem linhas de detalhe, assim a soma dos agrupamentos seria mostrada no final.

    Att
    Boreki
    http://www.boreki.eng.br
    quarta-feira, 15 de abril de 2009 20:39
  • Boreki,

    Muito obrigado, amigo. Funcionou perfeitamente. E isso me ajudará em futuros relatórios também (eu preciso em um deles, somar somente algumas linhas da tabela dependendo de uma flag, agora posso resolver usando o IIF e passando o valor 0 como ultimo parâmetro)

    Aproveito para perguntar:

    1) Esta é a única forma de se fazer somas condicionais do report viewer? Apesar de funcionar, me parece mais uma "gambiarra" do que uma SOLUCAO mesmo.

    2) Apenas para confirmar: não existe uma forma de ler uma valor de uma célula da tabela não é? Ao invés de ler o valor de um campo (Fields!XXXX.Value), eu leria o Value de uma determinada célula da tabela, referenciando-a por um nome ou indice....é impossível certo?


    []s e muito obrigado
    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications
    quarta-feira, 15 de abril de 2009 21:12
  • Robson,

    Uma maneira de acessar um item do proprio relatorio eh usar a collection ReportItems ao invez de Fields:
    =ReportItems!Textbox1.Value

    Mas existem algumas limitacoes, por exemplo, voce nao pode fazer referencias desse tipo dentro do proprio data region, o que acredito seria seu caso.

    Com relacao a soma condicional, todas as funcoes de agregacao somam uma expressao, voce usar uma expressao que retorna um campo (Fields!Campo.Value) ou uma expressao variavel (iif/choose/etc) nao faz diferenca dentro do relatorio. Isso faz diferenca para dar manutencao ao relatorio, pois as expressoes vao se tornando mais complexas, ficando mais dificil de modifica-las depois.

    Uma outra maneira que voce poderia fazer isso seria usar custom code no relatorio. Voce pode adicionar um codigo VB dentro do relatorio que eh invocado atravez de uma expressao.

    Att
    Boreki
    http://www.boreki.eng.br
    quarta-feira, 15 de abril de 2009 22:33
  • Boreki,

    Obrigado pelas explicações.

    Nunca utilizei custom code no report (é somente em VB nao é?). Irei ler a respeito.

    Valeu!
    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications
    quarta-feira, 15 de abril de 2009 23:27