2015-10-14 10 views
2

У меня есть отчет о SSRS с Dataset, что эти 3 поля:Sum первый элемент каждой группы и RunningValue

Fields!MyFirstField.Value 
Fields!MySecondField.Value 
Fields!MyThirdField.Value 

Отчет делится на группы: В моих файлах Роу У меня есть

MyPrimaryGroup 
    MySeconday Group 

И у меня есть поле, что делает каждую группу:

Fields!Group.Value 

в среде IDE a - накапливать первый элемент каждой группы каждого поля.

Что я сделал следующее:

Dim Acum as Double 
Dim ActualGroup = "" 
Function Accumulator(ByVal MyGroup as String, ByVal value as Double) As Double 


If ActualGroup <> MyGroup 
    Acum= Acum + value 
    ActualGroup = MyGroup 
    Return Acum 
    value=0 
End If 


End Function 

После этого я сделал вычисляемое поле, как это:

=Code.Accumulator(Fields!Group.Value,Fields!MyFirstField.Value) 

И поставить его в ряд внутри моей основной группы, дело в том, он только накапливает первые два, например:

На этом изображении мы имеем графический пример того, что делает код, это сохранение первого элемента каждой группы, так что в этом случае Накопленный v ALUE должен быть 10+11+12=33 но код дает мне 21, не сохраняет третье значение года]

enter image description here

Это одна часть проблемы, другая проблема заключается в том, что я не могу сделать этот аккумулятор работать с поле, которое есть выражение величины пробега, например:

FormatNumber(RunningValue(Fields!MySecondField.Value, Sum,"MyDataset"), 2) 

есть ли способ, чтобы подвести первый элемент каждой группы и накапливает его значение, то же самое с полем, которое на самом деле работает значение?

дать вам больше информации о том, что я, что достичь, я скриншот таблицы: enter image description here

Где вы видите синие круги, находится в этих полях внутри моей группы, которые я хочу поставить код и MyField3 является бегущее значение и эти группы: enter image description here

Это более или менее информация у меня есть для первых двух элементов моей группы: enter image description here

Так код s hould:

If MERCH308 <> "" then 
0 = 0 + 6,80 
"" = MERCH308 
End If 

На следующей группе он должен делать:

If MERCH314 <> MERCH308 
6,80 = 6,80 + 22,28 
MERCH308 = MERCH314 
End If 

И К следующему:

If MERCH314 <> MERCH314 
//It does not enter the if 

Пока она не видит новую группу, отличную от MERCH314, проблема , что единственный способ правильного функционирования кода (как я уже исследовал) - отменить разрывы страниц в таблице и пометить «Поддержание всего на одной странице, если это возможно».

И что Im пытается сказать с проблемой RunningValue заключается в следующем:

MyFields3 является бегущим значением:

=FormatNumber(RunningValue(Fields!MyFields3.Value, Sum,"MyDataset",2) 

Но я не могу подать заявление:

Code.Accumulator(Fields!MyGroup.Value,RunningValue(Fields!MyFields3.Value,Sum,"Mydataset") 

Как он говорит, что «имеет неправильное число в качестве параметра для функции RunningValue»

Итак, идея состоит в том, чтобы накапливать 1-й элемент каждой группы аккумулятора, так как «RunningValue» на самом деле является аккумулятором, поэтому идея состоит в том, чтобы суммировать (для моей третьей колонки) 6,80 + 29,08. Но помните, что 29,08 - результат рабочего значения.

+0

Ok Я решил проблему с разрывом страницы , Если у кого-то такая же проблема, вы должны объявить свои переменные как общедоступные, так как каждый разрыв страницы является новым экземпляром и будет публичным. Ваши значения будут сохраняться. Теперь о проблеме с текущим значением – Nickso

+0

Проверьте мое обновление. –

ответ

0

Я могу помочь вам с первой частью вашей проблемы, поэтому мой ответ является частичным, потому что я не понимаю вашу проблему с текущим полем значений, поэтому я пытаюсь угадать, что вам нужно.

Вы должны пойти в report/report properties/code вкладку и добавьте следующий код:

Dim public total as Integer 
Dim public prevgroup as String = "" 

Public Function AddTotal(ByVal group as String,ByVal value AS Integer) AS Integer 
    If (group <> prevgroup) Then 
     total = total + value 
     prevgroup = group 
     return total 
    End If 
    return 0     
End Function 

Public Function GetTotal() 
    return total 
End Function 

Это предположение о расположении данных у вас есть.

enter image description here

Используйте это выражение, чтобы получить сумму первых значений каждой отдельной группы:

=Code.GetTotal() 

Используйте этот один, чтобы получить значение бега:

=Code.AddTotal(Fields!Group.Value,Fields!Value.Value) 

It будет презентован:

enter image description here

Красный прямоугольник представляет собой мой набор данных, другие данные добавляются выражениями.


ОБНОВЛЕНИЕ: Запуск значение первых значений на основе спецификации пользователя.

Дайте мне знать, если это было полезно.

Вы можете достичь этого, добавив номер строки в запрос набора данных.

select 
    ROW_NUMBER() OVER (Order by (select 1)) as row_num, 
    * 
from CTE 

Примечание. Я просто добавляю номер строки и выбирая все поля из CTE. Это мой набор данных:

enter image description here

Измените функцию AddTotal следующим

Dim public total as Integer 
Dim public prevgroup as String = "" 

Public Function AddTotal(ByVal group as String,ByVal value AS Integer, ByVal nextGroup As String) AS Integer 
    If (group <> prevgroup) Then 
     total = total + value 
     prevgroup = group 
    End If 

    If (group <> nextGroup) Then 
     return total 
    End If 
    return 0   
End Function 

Настройте Tablix, как показано ниже:

enter image description here

В выражении установлен следующий код :

=Code.AddTotal(Fields!Group.Value,Fields!Value.Value, 
lookup(Fields!row_num.Value + 1,Fields!row_num.Value,Fields!Group.Value,"DataSet5") 
) 

Выберите выражение строки и установите параметр Row visibility со следующим кодом:

=Iif(Code.AddTotal(Fields!Group.Value,Fields!Value.Value, 
lookup(Fields!row_num.Value + 1,Fields!row_num.Value,Fields!Group.Value,"DataSet5") 
)=0,True,False) 

Это будет анонсировать ниже Tablix:

enter image description here

+0

Эй, Алехандро, я обновил свою начальную нить кучей тонны дополнительной информации. – Nickso

+0

Это отличная идея, есть ли способ сделать то же самое с RowNumber вместо изменения запроса? – Nickso

+0

@Nickso: Нет, мой подход использует 'lookup' для получения следующего значения группы строк. 'Lookup' ищет строку в наборе данных (RowNumber не может использоваться как выражение параметра или параметра функции поиска) и возвращает другое значение столбца в указанной строке, указанной пользователем. Я думаю, что это единственный способ узнать будущую строку набора данных. Поделитесь своим SQL-запросом, чтобы помочь вам добавить номер строки, это просто, но –

Смежные вопросы