Примеры выражений (службы Reporting Services)

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

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

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

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

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

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

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

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

Примеры выражений для специальных задач см. в следующих разделах.

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

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

Функции

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

Платформа .NET Framework предоставляет множество путей задания пользовательских форматов, например для специальных форматов даты. Дополнительные сведения см. в статье Типы форматирования на веб-узле MSDN.

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

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

Дополнительные сведения о функциях Visual Basic см. в документации по Visual Basic.

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

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

    =Today()
    
  • Функция DateAdd может оказаться полезной для вычисления диапазона дат на основе одного параметра. Следующее выражение вычисляет дату, наступающую на 6 месяцев позже даты, указанной в параметре типа System..::..DateTime с именем 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")
    
    ПримечаниеПримечание

    Убедитесь, что значение Fields!Phone.Value не содержит лишних пробелов и имеет тип System..::..String.

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

Функции 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 — с красным фоном.

  • Третий способ получить такой же эффект — использование функции Choose. Функция Choose использует первый параметр в качестве индекса на один из оставшихся параметров функции. Первым параметром должно быть целое число. Если это выражение задано в качестве цвета фона текстового поля в таблице, то значение MyIndex управляет цветом.

    =Choose(Fields!MyIndex.Value,"Red","Green","Yellow")
    

    Например, если MyIndex имеет значение 1, то цвет фона имеет значение «Red». Убедитесь, что в результирующем наборе запроса данные для MyIndex не выходят за пределы диапазона списка параметров.

  • Проверяет значение поля 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 предоставляют ряд дополнительных функций, которые позволяют управлять данными в отчете. В этом разделе приведены примеры использования двух из этих функций. Дополнительные сведения о функциях отчетов и примеры их использования см. в разделе Использование встроенных функций отчета и статистических функций в выражениях (службы Reporting Services).

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 строк.

    =CInt(Ceiling(RowNumber(Nothing)/25))
    

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

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

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

Свойства

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

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

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

    =Iif(Fields!Profit.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)
    

URL-адреса

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

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

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

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

  • Следующее выражение в зависимости от определенных условий управляет добавлением 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
    

    Дополнительные сведения см. в разделе Настройка свойств параметров для опубликованного отчета.

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

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

  • В следующем примере вызывается метод внедренного кода 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
    

Другим путем создания пользовательских констант или настройки значения для выражения является использование переменной отчета или групповой переменной.

Использование групповых переменных для нестандартного статистического выражения

Можно инициализировать значение групповой переменной, которая является локальной в области определенной группы, а затем включать в выражения ссылку на эту переменную. Одним из способов использования групповой переменной в пользовательском коде является реализация нестандартного статистического выражения. Дополнительные сведения см. в разделе Использование групповых переменных в службах Reporting Services 2008 для нестандартного статистического выражения.

Дополнительные сведения о переменных см. в разделе Использование ссылок на коллекции переменных отчета и групповых переменных в выражениях (службы Reporting Services).

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

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

=Code.FixSpelling(Fields!SubCategory.Value)

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

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))
    

Журнал изменений

Обновления

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