SSRS – Utilizando calculo de variação em uma matriz

Olá pessoal,

Depois de alguns dias de jejum de posts por aqui, recentemente passei por uma situação que quero compartilhar com vocês. Estava ajundando alguns colegas na construção de alguns relatórios em Reporting Services quando surgiu a situação descrita neste post.

Tinhamos um relatório utilizando uma matriz contendo em seu conjunto de linhas uma lista de produtos, no eixo de coluna o período e o dado era a quantidade vendida (tudo funcionando como o esperado!).

Neste relatório era necessário termos uma coluna que demonstrasse a variação ou melhor evolução entre o período atual e o período anterior  (O usuário até enviou um excel de exemplo, isso no excel é muito simples, mas em um relatório do SSRS utilizando matriz não é tão trivial), sendo assim teriamos o seguinte layout:

image

A fórmula para a variação seria (AnoAnterior(2011)-AnoCorrente(2012))/ (AnoAnterior(2011)+(AnoCorrente(2012)).

Após algumas horas de reflexão e tentativas, olhando o artigo Advanced Matrix Reporting Techniques (que por sinal é mais complexo que o meu cenário) tive uma idéia que foi a criação de uma função em VB conforme a seguir:

Public Function GetGrowthValue(ByVal PreviousValue, ByVal CurrentValue)
As Object
    If IsNothing(PreviousValue) OR IsNothing(CurrentValue) Then
        Return Nothing
    Else if PreviousValue = 0 OR CurrentValue = 0 Then
        Return Nothing
    Else 
        Return (CurrentValue - PreviousValue) /
               (CurrentValue + PreviousValue) 
    End If
End Function

Criei esta função no corpo do relatório, em seguida adicionei dentro do grupo de colunas um novo campoa e inseri uma expressão chamando a função criada anteriormente:

=Code.GetGrowthValue(Previous(Sum(Fields!salesAmount.Value),
"CalendarYear"),Sum(Fields!salesAmount.Value))

Note que como estamos trabalhando com Matriz eu preciso passar o escopo, por isso utilizo o “CalendarYear” que é o nome do meu grupo de colunas.

Com isso, conseguimos gerar uma coluna de variação entre um ano e outro, e quando não há dado para comparação exibimos em branco. A imagem a seguir ilustra o resultado obtido utilizando a base de dados de exemplo AdventureWorks:

image

 Bom, não é algo de outro mundo, mas resolvi montar este post depois de procurar algumas coisas a respeito na internet e em alguns fóruns e não ter encontrado, espero que seja útil pra vocês!

Abraços e até o próximo post.

Ass: Giuliano B. Cardoso

Anúncios

6 Responses to “SSRS – Utilizando calculo de variação em uma matriz”


  1. 1 Leonardo Silveira 24/10/2012 às 20:35

    Giuliano, estou com um problema igual a este postado por vc, tenho varios relatórios que sâo comparativos de variação de custos de um mes com outro, porém como o relatório é dinamico, ou seja, está num tablix formado via agrupamento, não estou conseguindo calcular uma coluna com a outra, pq se formos ver no layout do rdlc, nao existe duas colunas pra criar uma expressão. Acredito que da forma que você fez seja uma saída, porém tentei colocar no meu projeto e nao consegui, poderia me esclarecer onde coloco a função que vc criou para que a expressao possa chamá-la?

  2. 2 giulianocardoso 26/10/2012 às 09:55

    Olá Leonardo, que bacana sua participação!

    Creio que pela descrição teu problema deve ser bastante semelhante ao abordado neste post. No entanto, eu não consegui compreender a sua dificuldade. Veja que durante o post eu comento que a função deve ser criada no corpo do relatório (cada relatório) e crio uma nova coluna na matriz, nesta coluna eu crio uma expressão para chamar a função criada no corpo do relatório.

  3. 3 Leonardo SIlveira 29/10/2012 às 19:50

    Coloquei a função na propriedade na guia code, ai na coluna da variação coloquei a expressão para passar os parâmetros da função. conforme abaixo:
    =Code.GetGrowthValue(Previous(Sum(Fields!monetary_amount.Value), “to_date”),Sum(Fields!monetary_amount.Value))

    No meu caso o to_date, faz parte do meu agrupamento de colunas, porém quando tento rodar dá o seguinte erro:

    Error 1 The Value expression for the text box ‘Textbox29’ has a scope parameter that is not valid for an aggregate function. The scope parameter must be set to a string constant that is equal to either the name of a containing group, the name of a containing data region, or the name of a dataset.

    • 4 giulianocardoso 30/10/2012 às 20:27

      Olá Leonardo,

      O erro que você está enfrentando é referente a impossibilidade de a função conseguir agregar os dados usando o tipo de dados que está contido dentro do escopo do seu agrupamento de colunas “to_date”.
      Você já está utilizando alguma função neste agrupamento?
      Que tipo de dados contém este agrupamento?

      Caso se sinta mais a vontade poderia me enviar mais detalhes por e-mail.

      []s

      • 5 Leonardo Silveira 30/10/2012 às 20:32

        Giuliano, poderia me passar seu email? assim fica mais facil pois posso te mandar alguns prints.

  4. 6 giulianocardoso 24/11/2012 às 16:29

    Olá pessoal, somente para deixar registrado; Eu e o Leonardo conversamos por e-mail e ele conseguiu solucionar o problema no relatório.
    O Leonardo percebeu que ele estava incluindo a nova coluna fora do grupo e por isso mesmo usando as dicas contidas neste post o relatório não funcionava, após ele incluir a coluna dentro do grupo ele conseguiu obter o resultado esperado!


Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s




Giuliano B. Cardoso,
Administrador de Empresas com Habilitação em Informática, atua em Tecnologia da Informação há mais de 10 anos, especialista em banco de dados SQL Server, atualmente atua como consultor em Business Intelligence e instrutor de cursos oficiais Microsoft.
Possuí as seguintes certificações: ITIL-F, MCP,MCDBA SQL 2000, MCTS SQL 2005/2008, MCITP SQL2005/2008 e MCT

Mais acessados

Anúncios

%d blogueiros gostam disto: