Ooh, qui était une question délicate, mais il est faisable. Je suppose que vous faites cela dans une matrice, et l'ensemble de données ressemble à quelque chose comme ça
Month Year Category Value
--------- ----- ----------- -----
January 2014 Search 376
January 2015 Search 306
February 2014 Search 295
February 2015 Search 167
March 2014 Search 245
March 2015 Search 206
January 2015 Website 489
Il est alors assez simple pour obtenir la mise en page dont vous avez besoin pour afficher les valeurs par mois par an. Chaque mois est son propre groupe de lignes. Chaque 'Année' est son propre groupe de colonnes, et les années sont elles-mêmes contenues dans un groupe parent sur 'Type'. La somme des valeurs est calculée en utilisant l'expression
=Sum(Fields!Val.Value)
Ajout d'une nouvelle rangée du bas de la matrice permet la même expression à utiliser pour calculer le total pour le groupe.
Par défaut, comme les colonnes sont regroupées par année, seules les valeurs de cette année sont incluses dans la portée. Comme nous voulons comparer les années, nous devons préserver ce total pour être évalué par la colonne suivante. Nous pouvons le faire en utilisant le code derrière le rapport.
Clic droit sur le corps du rapport, sélectionnez Propriétés du rapport, puis choisissez Code et entrez les informations suivantes
Dim CurrentSubtractor AS Integer
Dim CurrentDivisor AS Integer
Public Function GetPrevValueForSubtraction(NewSubtractor AS Integer) AS Integer
Dim ReturnValue AS Integer = NewSubtractor
if CurrentSubtractor = 0 then
CurrentSubtractor = NewSubtractor
else
ReturnValue = CurrentSubtractor
CurrentSubtractor = 0
end if
return ReturnValue
end function
Public Function GetPrevValueForDivisor(NewDivisor AS Integer) AS Integer
Dim ReturnValue AS Integer = NewDivisor
if CurrentDivisor = 0 then
CurrentDivisor = NewDivisor
else
ReturnValue = CurrentDivisor
CurrentDivisor = 0
end if
return ReturnValue
end function
Ignorer le fait qu'il est la même fonction à deux reprises pour le moment - nous reviendrons à plus tard . Le code préserve efficacement la nouvelle valeur passée en tant que courant, ou réinitialise la valeur actuelle à zéro. Le rapport rend traite chaque cellule une à la fois, et exécute le code pour chaque cellule à son tour, de manière efficace si vous venez d'avoir le résultat de ce code dans la cellule qu'il retournerait
0, value, 0, value, 0 value…
Enfin, pour apporter tout cela ensemble, nous devons nous assurer que le calcul nous utiliserons comme suit
For every alternative column
Take the Sum of this column
Minus the previous column value
And divide the result by the previous column value
Notez la façon dont nous devons utiliser la valeur de la colonne précédente deux fois. Si nous utilisions le même extrait de code pour les deux, il l'évaluerait deux fois pour chaque cellule, en réinitialisant la valeur à zéro pour l'une des fois où nous devions l'exécuter.D'où l'exigence de deux fonctions ci-dessus
Définir le code de votre pourcentage vs 2014 à la cellule à
=iif(Fields!Year.Value = MAX(Fields!Year.Value, "DataSet10"),
(sum(Fields!Val.Value) -
Code.GetPrevValueForSubtraction(sum(Fields!Val.Value)))/
Code.GetPrevValueForDivisor(sum(Fields!Val.Value)),
"")
Cela se traduira par une matrice disposé comme ce
Et quand courir, il ressemblera à ceci
J'espère que c'est ce dont vous avez besoin. Si ce n'est pas le cas, ou si vous avez besoin d'aide, s'il vous plaît faites le moi savoir et j'essaierai d'aider davantage.
Pouvez-vous mettre à jour votre question pour fournir un exemple de votre sortie actuelle (image via imgur?) Et ce que vous souhaitez faire (par exemple dans une nouvelle colonne déterminer "valeur 2015 - valeur 2014") – Jonnus
édité le commentaire, mais foiré avec le formatage. –