Поделиться через


Примеры выражений (построитель отчетов 2.0)

Выражения часто используются в отчетах для управления содержимым и внешним видом отчета. Выражения записываются на языке Microsoft Visual Basic, и в них можно использовать встроенные функции, пользовательский код, глобальные переменные и определенные пользователем переменные. Дополнительные сведения о редакторе выражений и типах ссылок, которые можно включать в выражения, см. в разделах Использование выражений (построитель отчетов 2.0) и Как добавить выражение (построитель отчетов 2.0).

В данном разделе приведены примеры выражений, которые можно использовать для решения типичных задач в отчете.

  • Функции языка Visual Basic Примеры функций дат, строковых функций, функций преобразований и условных функций Visual Basic.

  • Функции отчета Примеры статистических функций и других встроенных функций отчета.

  • Внешний вид данных отчета   Примеры изменения внешнего вида отчета.

  • Свойства   Примеры задания свойств элемента отчета, отвечающих за формат и видимость.

  • Параметры   Примеры использования параметров в выражении.

  • Пользовательский код Примеры внедренного пользовательского кода.

Функции

Многие выражения в отчете содержат вызовы функций. Они позволяют форматировать данные, применять логические операции и производить доступ к метаданным отчета. В выражениях можно использовать функции из библиотеки времени выполнения MicrosoftVisual Basic, а также из пространств имен System..::..Convert и System..::..Math. Можно добавить ссылки на функции из других сборок или пользовательский код. Можно также использовать классы платформы Microsoft.NET Framework, включая System.Text.RegularExpressions. Дополнительные сведения о функциях Visual Basic см. в разделе «Библиотека времени выполнения Visual Basic» на веб-узле msdn.microsoft.com.

Функции языка Visual Basic

Функции языка Visual Basic позволяют управлять данными, отображаемыми в текстовых полях, или используются в параметрах, свойствах и других областях отчета. В этом разделе приведены примеры, демонстрирующие применение некоторых из этих функций. Дополнительные сведения о функциях Visual Basic см. в документации по Visual Basic.

Функции для работы с датой

  • Функция Today возвращает текущую дату. Следующее выражение можно указать в текстовом поле для вывода даты формирования отчета или в качестве параметра фильтрации данных на основе текущей даты.

    =Today()
    
  • Функция DateAdd может оказаться полезной для вычисления диапазона дат на основе одного параметра. Следующее выражение вычисляет дату, которая отстоит на 6 месяцев позже даты, указанной в параметре StartDate.

    =DateAdd(DateInterval.Month, 6, Parameters!StartDate.Value)
    
  • Функция Year отображает год для конкретной даты. Это можно использовать для группирования по датам или для вывода года в качестве метки для набора дат. Выражение возвращает год для заданной группы дат заказов на продажу. Для работы с датами можно также пользоваться функцией Month и другими. Дополнительные сведения см. в документации по Visual Basic.

    =Year(Fields!OrderDate.Value)
    

Строковые функции

  • Объединяют несколько полей с помощью операторов объединения и констант Visual Basic. Следующее выражение возвращает два поля, каждое на отдельной строке в одном текстовом поле.

    =Fields!FirstName.Value & vbCrLf & Fields!LastName.Value 
    
  • Функция Format позволяет отформатировать даты и числа в виде строки. Следующее выражение отображает значения параметров StartDate и EndDate в длинном формате даты.

    =Format(Parameters!StartDate.Value, "D") & " through " &  Format(Parameters!EndDate.Value, "D")  
    

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

  • Функции Right, Len и InStr полезны для извлечения вложенных строк; например для усечения строки вида ДОМЕН\имя_пользователя до имени пользователя. Следующее выражение возвращает часть строки параметра User, расположенную справа от символа обратной косой черты (\).

    =Right(Parameters!User.Value, Len(Parameters!User.Value) - InStr(Parameters!User.Value, "\"))
    

    Следующее выражение возвращает то же значение, что и предыдущее, используя элементы класса .NET FrameworkSystem..::..String вместо функций Visual Basic.

    =Parameters!User.Value.Substring(Parameters!User.Value.IndexOf("\")+1, Parameters!User.Value.Length-Parameters!User.Value.IndexOf("\")-1)
    
  • Отображает выбранные значения из многозначного параметра. В следующем примере функция Join объединяет выбранные значения параметра MySelection в одну строку, которая может использоваться в качестве выражения для значения текстового поля в элементе отчета.

    = Join(Parameters!MySelection.Value)
    
  • Функции Regex класса .NET FrameworkRegularExpressions полезны при изменении формата существующих строк, например при форматировании телефонного номера. В следующем выражении функция Replace используется для изменения в поле формата телефонного номера из десяти цифр с «nnn-nnn-nnnn» на «(nnn) nnn-nnnn».

    =System.Text.RegularExpressions.Regex.Replace(Fields!Phone.Value, "(\d{3})[ -.]*(\d{3})[ -.]*(\d{4})", "($1) $2-$3")
    

Функции преобразования

Функции Visual Basic можно использовать для преобразования поля из одного типа данных в другой тип данных. Функции преобразования могут использоваться, чтобы преобразовать тип данных по умолчанию для поля в тип данных, необходимый для вычислений или для объединения текста. 

  • Следующее выражение преобразует константу 500 в тип Decimal, чтобы сравнить ее с денежным типом данных Transact-SQL в поле Value выражения фильтра. 

    =CDec(500)
    
  • Следующее выражение отображает количество значений, выбранных для многозначного параметра MySelection.

    =CStr(Parameters!MySelection.Count)
    

Функции выбора

  • Функция Iif возвращает одно из двух значений в зависимости от того, истинно ли указанное выражение. В следующем выражении используется функция Iif, которая возвращает логическое значение True, если значение LineTotal превышает 100. В противном случае возвращается значение False:

    =IIF(Fields!LineTotal.Value > 100, True, False)
    
  • Следующее выражение использует несколько функций IIF (так называемые вложенные IIF), возвращая одно из трех значений в зависимости от значения поля PctComplete. Следующее выражение может быть помещено в свойство цвета заливки текстового поля, чтобы изменять цвета фона в зависимости от значения текстового поля.

    =IIF(Fields!PctComplete.Value >= 10, "Green", IIF(Fields!PctComplete.Value >= 1, "Blue", "Red"))
    

    Значения, большие или равные 10, отображаются с зеленым фоном, от 1 до 9 — с синим фоном, и меньшие 1 — с красным фоном.

  • Такого же эффекта можно добиться с помощью функции Switch. Функция Switch полезна при наличии трех и более проверяемых условий. Функция Switch возвращает значение, связанное с первым выражением ряда, которое оценивается как true:

    =Switch(Fields!PctComplete.Value >= 10, "Green", Fields!PctComplete.Value >= 1, "Blue", Fields!PctComplete.Value = 1, "Yellow", Fields!PctComplete.Value <= 0, "Red",)
    

    Значения, больше или равные 10, отображаются с зеленым фоном, от 1 до 9 — с синим фоном, равные 1 — с желтым фоном и меньшие или равные 0 — с красным фоном.

  • Проверяет значение поля ImportantDate и возвращает строку «Red», если прошло больше недели, в ином случае — «Blue». Это выражение позволяет управлять свойством Color текстового поля в элементе отчета.

    =IIF(DateDiff("d",Fields!ImportantDate.Value, Now())>7,"Red","Blue")
    
  • Проверяет значение поля PhoneNumber и возвращает строку «No Value», если это значение null (Nothing в Visual Basic); в противном случае возвращает значение телефонного номера. Это выражение позволяет управлять содержимым текстового поля в элементе отчета.

    =IIF(Fields!PhoneNumber.Value Is Nothing,"No Value",Fields!PhoneNumber.Value)
    
  • Проверяет значение поля Department и возвращает либо имя вложенного отчета, либо значение null (Nothing в Visual Basic). Это выражение может использоваться для условной детализации вложенных отчетов.

    =IIF(Fields!Department.Value = "Development", "EmployeeReport", Nothing)
    
  • Проверяет, не является ли значением поля NULL. Это выражение можно использовать для управления свойством Hidden элемента-изображения отчета. В следующем примере изображение, задаваемое полем [LargePhoto], отображается, только если значение поле не равно NULL.

    =IIF(IsNothing(Fields!LargePhoto.Value),True,False)
    

Функции отчетов

Службы Reporting Services предоставляют ряд дополнительных функций, которые позволяют управлять данными в отчете. В этом разделе приведены примеры использования двух из этих функций. Дополнительные сведения о функциях отчетов и примеры их использования см. в разделе Использование встроенных функций отчета и статистических функций в выражениях (построитель отчетов 2.0).

Sum

  • Функция Sum суммирует значения в группе или области данных. Она может быть полезна в колонтитулах группы. Следующее выражение отображает сумму данных в группе или области данных Order.

    =Sum(Fields!LineTotal.Value, "Order")
    
  • Функцию Sum можно также использоваться для вычислений условных статистических функций. Например, если набор данных содержит поле State с возможными значениями «Not Started», «Started», «Finished», следующее значение, помещенное в верхний колонтитул группы, вычисляет статистическую сумму только для значения «Finished».

    =Sum(IIF(Fields!State.Value = "Finished", 1, 0))
    

RowNumber

  • Если функция RowNumber используется в текстовом поле в области данных, то она отображает номер строки для каждого экземпляра текстового поля, в котором содержится это выражение. Эта функция может оказаться полезной для нумерации строк в таблице. Также она может быть полезна для более сложных задач, например для разбивки на страницы по определенному числу строк. Дополнительные сведения см. в подразделе Разрывы страниц далее в этом разделе.

    Область, указанная для элементов управления RowNumber, когда начинается перенумерация. Ключевое слово Nothing указывает, что функция начнет нумерацию строк с первой строки самой внешней области данных. Чтобы начать подсчет внутри вложенной области данных, используйте имя области данных. Чтобы начать подсчет внутри группы, используйте имя группы.

    =RowNumber(Nothing)
    

Внешний вид данных отчета

Выражения позволяют изменять внешний вид данных, отображаемых в отчете. Например, можно отобразить значения двух полей в одном текстовом поле, вывести сведения об отчете или изменить порядок разбиения на страницы.

Верхние и нижние колонтитулы

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

  • Следующее выражение выдает имя отчета и время его запуска. Его можно указать в текстовом поле в нижнем колонтитуле или в теле отчета. Время форматируется с помощью строки форматирования .NET Framework для короткой даты:

    =Globals.ReportName & ", dated " & Format(Globals.ExecutionTime, "d")
    
  • Следующее выражение, если его поместить в текстовое поле в нижнем колонтитуле отчета, выводит номер страницы и общее число страниц, содержащихся в отчете:

    =Globals.PageNumber & " of " & Globals.TotalPages
    

В следующих примерах показано, как вывести в верхнем колонтитуле страницы первое и последнее значение на странице, получив результат, похожий на список каталогов. Подразумевается, что в области данных существует текстовое поле LastName.

  • Следующее выражение, помещенное в текстовое поле в левой части верхнего колонтитула, выводит первое значение текстового поля LastName на этой странице.

    =First(ReportItems("LastName").Value)
    
  • Следующее выражение, помещенное в текстовое поле в правой части верхнего колонтитула, выводит последнее значение текстового поля LastName на этой странице.

    =Last(ReportItems("LastName").Value)
    

В следующем примере показано, как отобразить общее количество страниц. Подразумевается, что в области данных существует текстовое поле Cost.

  • Следующее выражение, помещенное в верхний или нижний колонтитул, выводит сумму значений в текстовом поле Cost для данной страницы.

    =Sum(ReportItems("Cost").Value)
    
ПримечаниеПримечание

При ссылке из колонтитула в выражении может быть указан только один элемент отчета. Кроме того, в выражениях верхнего и нижнего колонтитулов можно ссылаться на имя текстового поля, но не использовать выражение фактических данных в текстовом поле.

Разрывы страниц

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

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

    =Ceiling(RowNumber(Nothing)/25)
    

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

    =Ceiling(RowNumber(Nothing)/Parameters!RowsPerPage.Value)
    

    Дополнительные сведения об установке разрывов страниц см. в разделе Как добавить разрыв страницы (построитель отчетов 2.0).

Свойства

Выражения используются не только для отображения данных в текстовых полях. С их помощью можно также менять свойства элементов отчета. Можно изменить стиль данных или видимость элемента отчета.

Форматирование

  • Следующее выражение при использовании в свойстве Color текстового поля изменяет цвет текста в зависимости от значения поля Profit.

    =Iif(Fields!Profit.Value < 0, "Red", "Black")
    

    Можно также использовать переменную объекта языка Visual Basic Me. Эта переменная является другим способом сослаться на значение текстового поля.

    =Iif(Me.Value < 0, "Red", "Black")

  • При указании следующего выражения в свойстве BackgroundColor элемента отчета в области данных цвет фона каждой строки изменяется с бледно-зеленого до белого.

    =Iif(RowNumber(Nothing) Mod 2, "PaleGreen", "White")
    

    Возможно, что при использовании выражения для конкретной области понадобится указать набор данных для статистической функции:

    =Iif(RowNumber("Employees") Mod 2, "PaleGreen", "White")
    
ПримечаниеПримечание

Доступные цвета выбираются из перечисления .NET FrameworkKnownColor.

Видимость

Изменяя значения свойства видимости, можно скрывать и отображать элементы отчета. В области данных (например, в таблице) можно в зависимости от значения выражения сделать некоторые из строк подробностей изначально невидимыми.

  • Если указать следующее выражение для определения видимости строк сведений в группе, они отображаются только для продаж со значением более 90% в поле PctQuota.

    =Iif(Fields!PctQuota.Value>.9, False, True)
    
  • Если указать следующее выражение для свойства Hidden таблицы, то таблица будет показана, только если в ней больше 12 строк.

    =IIF(CountRows()>12,true,false)
    
  • Следующее выражение, заданное для свойства Hidden столбца, показывает столбец только в том случае, если поле в наборе данных отчета существует после получения данных из источника данных.

    =IIF(Fields!Column_1.IsMissing, true, false)
    

URL-адреса

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

  • Следующее выражение, используемое как действие на текстовом поле, формирует настраиваемый URL-адрес, указывающий поле набора данных EmployeeID в качестве параметра URL-адреса.

    ="http://adventure-works/MyInfo?ID=" & Fields!EmployeeID.Value
    

    Дополнительные сведения см. в разделе Как добавить гиперссылку на URL-адрес (построитель отчетов 2.0).

  • Следующее выражение в зависимости от определенных условий управляет добавлением URL-адреса в текстовое поле. Это выражение зависит от параметра IncludeURLs, который позволяет пользователю решать, включать ли в отчет активные URL-адреса. Это выражение установлено в качестве действия для текстового поля. Установив параметр в значение False и просматривая затем отчет, можно экспортировать отчет Microsoft Excel без гиперссылок.

    =IIF(Parameters!IncludeURLs.Value,"http://adventure-works.com/productcatalog",Nothing)
    

Данные отчета

С помощью выражений можно управлять данными отчета, например параметрами и другими данными отчета. Можно даже изменить запрос, используемый для получения данных при построении отчета.

Параметры

В параметрах выражения используются для изменения их значения по умолчанию. Например, можно использовать параметр для фильтрации данных для конкретного пользователя на основе идентификатора пользователя, запускающего отчет.

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

    =User!UserID
    
  • С помощью глобальной коллекции Parameters можно ссылаться на параметр в параметре запроса, критерий фильтра, текстовое поле или другие области отчета. В следующем примере подразумевается, что параметр имеет имя Department:

    =Parameters!Department.Value
    
  • Параметр может быть создан в отчете, но установлен как скрытый. При выполнении отчета на сервере отчетов параметр не отображается на панели инструментов и читатель отчета не может изменить значение по умолчанию. Скрытый параметр можно использовать для установки значения по умолчанию в качестве пользовательской константы. Это значение можно использовать в любом выражении, включая выражение поля. Следующее выражение идентифицирует поле, задаваемое значением параметра по умолчанию для параметра с именем ParameterField.

    =Fields(Parameters!ParameterField.Value).Value
    

Пользовательский код

В отчете можно использовать пользовательский код. Он либо внедряется в отчет, либо хранится в используемой отчетом пользовательской сборке. Дополнительные сведения о пользовательском коде см. в разделе Использование в выражениях ссылок на пользовательский код (построитель отчетов 2.0).

  • В следующем примере вызывается метод внедренного кода ToUSD, который преобразует значение поля StandardCost в долларовый эквивалент.

    =Code.ToUSD(Fields!StandardCost.Value)
    
  • В следующем примере показано, как определить некоторые пользовательские константы и переменные.

    [Visual Basic]

    Public Const MyNote = "Authored by Bob"
    Public Const NCopies As Int32 = 2
    Public Dim  MyVersion As String = "123.456"
    Public Dim MyDoubleVersion As Double = 123.456
    

    Хотя пользовательские константы и переменные не отображаются в представлении «Константы редактора выражений» (отображаются только встроенные константы), на них можно сослаться из любого выражения, как показано в следующих примерах. Они рассматриваются как значения типа Variant.

    [Visual Basic]

    =Code.MyNote
    =Code.NCopies 
    =Code.MyVersion
    =Code.MyDoubleVersion
    

Замена текста в поле во время выполнения

В следующем примере вызывается внедренный метод FixSpelling, который заменяет в поле SubCategory.Value все встречающиеся строки «Bike» на «Bicycle».

=Code.FixSpelling(Fields!SubCategory.Value)

Следующий код показывает реализацию метода FixSpelling при его внедрении в определение отчета. Пример показывает, как нужно ссылаться на класс .NET FrameworkSystem.Text..::..StringBuilder. Дополнительные сведения см. в разделе Как добавить код в отчет (построитель отчетов 2.0).

Public Function FixSpelling(ByVal s As String) As String
   Dim strBuilder As New System.Text.StringBuilder(s)
   If s.Contains("Bike") Then
      strBuilder.Replace("Bike", "Bicycle")
      Return strBuilder.ToString()
      Else : Return s
   End If
End Function

Подавление значения NULL или нулевых значений во время выполнения

Во время обработки отчета результатом вычисления некоторых значений в выражении может быть NULL или значения могут быть неопределенными. Это может вызывать ошибки времени выполнения, которые приводят к отображению в текстовом поле значения #Ошибка вместо вычисленного выражения. Функция IIF особенно чувствительна к такому поведению, так как, в отличие от инструкции If-Then-Else, каждая часть инструкции IIF оценивается (включая вызовы функций) перед передачей в подпрограмму, которая проверяет значения на равенство true или false. Инструкция =IIF(Fields!Sales.Value is NOTHING, 0, Fields!Sales.Value) формирует значение #Ошибка в отчете, готовом для просмотра, если поле Fields!Sales.Value имеет значение NOTHING.

Чтобы избежать этого состояния, используйте одну из следующих стратегий.

  • Установите числитель в 0, а знаменатель в 1, если значение поля B равно 0 или не определено; в противном случае установите в качестве числителя значение поля А, а в качестве знаменателя — значение поля B.

    =IIF(Field!B.Value=0, 0, Field!A.Value / IIF(Field!B.Value =0, 1, Field!B.Value))
    
  • Используйте функцию пользовательского кода, чтобы вернуть значение выражения. В следующем примере возвращается процентная разница между текущим и предыдущим значениями. Этот пример может использоваться для вычисления разницы между двумя последовательными значениями. В нем обрабатывается крайний случай первого сравнения (когда нет предыдущего значения) и случаи, когда либо предыдущее значение, либо текущее значение равно null (Nothing в языке Visual Basic).

    Public Function GetDeltaPercentage(ByVal PreviousValue, ByVal CurrentValue) As Object
        If IsNothing(PreviousValue) OR IsNothing(CurrentValue) Then
            Return Nothing
        Else if PreviousValue = 0 OR CurrentValue = 0 Then
            Return Nothing
        Else 
            Return (CurrentValue - PreviousValue) / CurrentValue
        End If
    End Function
    

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

    =Code.GetDeltaPercentage(Previous(Sum(Fields!Sales.Value),"ColumnGroupByYear"), Sum(Fields!Sales.Value))
    

    Тем самым предотвращаются исключения времени исполнения, и для отображения в зависимости от определенных условий текста, основанного на значениях, можно использовать выражение, подобное =IIF(Me.Value < 0, "red", "black"), в свойстве Color текстового поля.