Да, это возможно, но, как вы можете видеть, это немного сложно.
Чтобы сделать это более общий ответ, я создал свой собственный DataSet, с упрощенными колоннами, но более подробной информации:
select grp = 1, val = 100, dt = cast('01-jan-2015' as date)
union all select grp = 1, val = 110, dt = cast('01-jan-2015' as date)
union all select grp = 1, val = 200, dt = cast('02-jan-2015' as date)
union all select grp = 1, val = 210, dt = cast('02-jan-2015' as date)
union all select grp = 1, val = 300, dt = cast('03-jan-2015' as date)
union all select grp = 1, val = 310, dt = cast('03-jan-2015' as date)
union all select grp = 1, val = 400, dt = cast('04-jan-2015' as date)
union all select grp = 1, val = 410, dt = cast('04-jan-2015' as date)
union all select grp = 1, val = 500, dt = cast('05-jan-2015' as date)
union all select grp = 1, val = 510, dt = cast('05-jan-2015' as date)
union all select grp = 2, val = 220, dt = cast('02-jan-2015' as date)
union all select grp = 2, val = 230, dt = cast('02-jan-2015' as date)
union all select grp = 2, val = 320, dt = cast('03-jan-2015' as date)
union all select grp = 2, val = 330, dt = cast('03-jan-2015' as date)
union all select grp = 2, val = 420, dt = cast('04-jan-2015' as date)
union all select grp = 2, val = 430, dt = cast('04-jan-2015' as date)
Обратите внимание, что каждый GRP/дт комбинация имеет два значения и что grp 1
более длинный диапазон для dt чем grp 2
.
Я создал простую матрицу, основанную на этом:
Поскольку вы используете SQL Server 2012, вы можете использовать функцию LookupSet
, чтобы получить первые/последние значения для каждой группы строк.
Выражение в первой группы строк TextBox является:
=Code.SumLookup(
LookupSet(
First(Fields!dt.Value, "grp").ToString & Fields!grp.Value.ToString
, Fields!dt.Value.ToString & Fields!grp.Value.ToString
, Fields!val.Value
, "DataSet1"
)
)
На основании моих данных выборки, это дает свои требуемые результаты:
Обратите внимание, что второй grp
строка имеет более узкий диапазон, чем первый, но его первый/последний столбцы независимы для каждой группы, поэтому в каждом из них grp
. Здесь происходит немало вещей.
Пользовательский код для агрегации LookUpSet
результата
Выражение LookupSet
обернут в Code.SumLookup
пользовательской функции:
Function SumLookup(ByVal items As Object()) As Decimal
If items Is Nothing Then
Return Nothing
End If
Dim suma As Decimal = New Decimal()
suma = 0
For Each item As Object In items
suma += Convert.ToDecimal(item)
Next
Return suma
End Function
Это взято из ответа на this SO вопрос.
Предполагается, что каждая ячейка матрицы может быть суммой нескольких значений, поэтому ее необходимо суммировать. LookupSet
возвращает массив значений, который агрегируется по Code.SumLookup
.
Детали для LookupSet
Далее, LoopupSet
выражения сама:
LookupSet(
First(Fields!dt.Value, "grp").ToString & Fields!grp.Value.ToString
, Fields!dt.Value.ToString & Fields!grp.Value.ToString
, Fields!val.Value
, "DataSet1"
)
LookupSet
принимает следующие параметры:
LookupSet(source_expression, destination_expression, result_expression, dataset)
В нашем выражении, мы хотим получить все значения из DataSet1
, которые соответствуют первым dt
в текущем grp
сфере.
Для source_expression
я использую:
First(Fields!dt.Value, "grp").ToString & Fields!grp.Value.ToString
Это получает первый DT в рамках ряда ("grp"
это имя группы строк), затем добавляет это к текущему GRP. Это создает выражение, соответствующее аналогичному выражению при поиске в DataSet1
.
т.е. destination_expression
:
Fields!dt.Value.ToString & Fields!grp.Value.ToString
Наконец, мы указываем, что мы хотим Fields!val.Value
как result_expression
и DataSet1
в качестве параметра dataset
.
Все соответствующие Fields!val.Value
значения в DataSet1
сконструированы в массиве на LookupSet
, а затем агрегированы по Code.SumLookup
.
выражение Обновление для последних значений
Выражение для Last TextBox практически одинакова; просто изменить First
к Last
:
=Code.SumLookup(
LookupSet(
Last(Fields!dt.Value, "grp").ToString & Fields!grp.Value.ToString
, Fields!dt.Value.ToString & Fields!grp.Value.ToString
, Fields!val.Value
, "DataSet1"
)
)
Получить разницу
Наконец, чтобы получить разницу в них, просто вычесть одно выражение из другого в Разница TextBox, или даже ссылаться на ReportItems
значения:
=ReportItems!Last.Value - ReportItems!First.Value
Где Last
и First
- это имена текстовых полей.
Заключение
Очевидно, что вам необходимо будет обновить для вашего конкретного случая, но вы можете видеть, что это может быть сделано.
Стоит ли делать это в своем отчете? Вы можете видеть, что есть много шагов, и в целом было бы проще обратиться при создании DataSet. Но, если это не вариант, мы надеемся, что этот подход LookupSet
полезен.
Вы пытались использовать 'First (Fields! Yourfield.value,« yourgroup »)' и 'Last (Fields! Yourfield.value,« yourgroup »)' –
@CoderofCode конечно же сделал! но как вы используете несколько групп? Потому что действительно важно иметь все 3 группы! dcs1/DCS2/test1. ReportItems! не работает по этой причине –
@CoderofCode, который вы получаете в этом случае, - имеет параметр scope, который недействителен для функции aggrgate. –