Проблема
Я использую динамические группы матриц, как в Динамическая группировка из Веб-журнал Sleazy Hacks Reporting Services Криса Хейса (который, кстати, имеет кое-что интересное и стоит проверить). Мои группы строк и столбцов привязаны к двум многозначным параметрам, и все работает отлично, кроме одной вещи. Несмотря на то, что я запрещаю показ неиспользуемых групп, они все еще занимают место.
Вот как теперь выглядит отчет, когда я выбираю только одну группу строк и одну группу столбцов:
Обратите внимание, что даже если нежелательные группы имеют скрытое свойство True (как установлено выражением), они все еще занимают место. Вот как я хотел бы, чтобы это выглядело (я вырезал пустые области из картинки вручную):
Вопрос
У кого-нибудь есть идеи, как уменьшить пустые области, когда соответствующие группы матриц скрыты?
Только для любопытных (не является частью вопроса)
Для справки, вот как выглядит матрица в режиме Layout:
И если кто-то еще захочет создавать динамические группы матриц, вот этот раздел кода, который выполняет тяжелую работу:
Public Function ValueIsInMultiParameter(MultiParameter As Parameter, Value As String) As Boolean
Dim i as Long
For i = 0 to MultiParameter.Count - 1
If MultiParameter.Value(i) = Value Then Return True
Next
Return False
End Function
Public Function DynamicFieldValue(CurrentFields As Fields, MultiParameter As Parameter, Index As Long) As Object
If ParameterCount(MultiParameter) - 1 < Index Then Return ""
Return CurrentFields(MultiParameter.Value(Index)).Value
End Function
Public Function DynamicFieldFormattedValue(CurrentFields As Fields, MultiParameter As Parameter, Index As Long) As Object
If ParameterCount(MultiParameter) - 1 < Index Then Return ""
Return CustomFormat(CurrentFields(MultiParameter.Value(Index)).Value, MultiParameter.Value(Index))
End Function
Public Function DynamicGrouping(MultiParameter As Parameter, Index As Long) As Object
If ParameterCount(MultiParameter) - 1 < Index Then Return "None"
Return MultiParameter.Value(Index)
End Function
Public Function DynamicGroupingLabel(CurrentFields As Fields, MultiParameter As Parameter, Index As Long) As String
If Index = 0 Then Return "Grand Total"
If ParameterCount(MultiParameter) - 1 < Index Then Return ""
Return CustomFormat(CurrentFields(MultiParameter.Value(Index - 1)).Value, MultiParameter.Value(Index - 1)) & " Total"
End Function
Public Function CustomFormat(Value As Object, ValueType As String) As String
Select Case ValueType
Case "DayOf"
Return Format(Value, "M/d/yyyy")
Case "WeekOf"
Return Format(Value, "M/d/yyyy")
Case "WeekDayPart"
Return WeekdayName(Value)
Case "MonthOf"
Return Format(Value, "MMM yyyy")
Case "MonthDayPart"
Return "Day " & Value
Case "MonthWeekPart"
Return "Week " & Value
Case "YearOf"
Return Format(Value, "yyyy")
Case "YearDayPart"
Return "Day " & Value
Case "YearWeekPart"
Return "Week " & Value
Case "YearMonthPart"
Return MonthName(Value)
Case "YearPart"
Return Value
Case Else
Return Value
End Select
End Function
Public Function ParameterCount(MultiParameter As Parameter) As Long
If MultiParameter.Count = 0 OrElse MultiParameter.Value(0) = "1" Then Return 0
Return MultiParameter.Count
End Function
В параметрах я поместил жестко запрограммированный список выбираемых опций группировки, например, параметр RowGroups имеет доступные значения:
Label Value
----- -------
Year YearOf
Month MonthOf
Week WeekOf
Day DayOf
Где Значение - это имя столбца SQL, возвращаемого DataSet.