Ох, это было сложно, но это выполнимо. Я предполагаю, что вы делаете это в матрице, и набор данных выглядит примерно так
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
Тогда довольно просто получить макет, который вам нужен для отображения значений в месяц в год. Каждый «Месяц» — это отдельная группа строк. Каждый «Год» — это отдельная группа столбцов, а сами годы содержатся в родительской группе «Тип». Сумма значений вычисляется с помощью выражения
=Sum(Fields!Val.Value)
Добавление новой строки в конце матрицы позволяет использовать то же выражение для расчета итоговой суммы для группы.
Теперь по умолчанию, поскольку столбцы сгруппированы по годам, в область действия входят только значения для этого года. Поскольку мы хотим сравнить данные по годам, нам нужно сохранить эту сумму для оценки в следующем столбце. Мы можем сделать это, используя код отчета.
Щелкните правой кнопкой мыши текст отчета, выберите «Свойства отчета», затем выберите «Код» и введите следующее.
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
На данный момент не обращайте внимания на тот факт, что одна и та же функция используется дважды — мы вернемся к этому позже. Код фактически сохраняет новое значение, переданное ему как текущее, или сбрасывает текущее значение до нуля. По мере рендеринга отчета он обрабатывает каждую ячейку по одной и запускает код для каждой ячейки по очереди, поэтому эффективно, если бы у вас был только результат этого кода в ячейке, он вернул бы
0, value, 0, value, 0 value…
Наконец, чтобы собрать все это вместе, нам нужно убедиться, что расчет, который мы будем использовать, выглядит следующим образом.
For every alternative column
Take the Sum of this column
Minus the previous column value
And divide the result by the previous column value
Обратите внимание, что нам нужно дважды использовать значение предыдущего столбца. Если бы мы использовали один и тот же фрагмент кода для обоих, он оценивал бы его дважды для каждой ячейки, сбрасывая значение до нуля в один из раз, когда нам нужно было запустить его. Следовательно, требование для двух функций выше
Установите код для вашего процента по сравнению с 2014 годом в ячейку
=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)),
"")
В результате получится такая матрица
И при запуске это будет выглядеть так
Надеюсь, это то, что вам нужно. Если нет, или если вам нужна дополнительная помощь, пожалуйста, дайте мне знать, и я постараюсь помочь дальше.
person
Jonnus
schedule
12.11.2015