Примеры выражений в отчетах с разбивкой на страницы построитель отчетов

Область применения: Построитель отчетов (SSRS) Power BI конструктор отчетов построитель отчетов в SQL Server Data Tools

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

Внимание

Если включена песочница RDL, вы можете использовать только определенные типы и элементы в тексте выражения во время публикации отчета. Дополнительные сведения см. в статье "Включение и отключение песочницы RDL для служб Reporting Services в интегрированном режиме SharePoint".

Примеры выражений для конкретных использования см. в следующих статьях:

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

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

Функции

Многие выражения в отчете содержат вызовы функций. Вы можете форматировать данные, применять логику и получать доступ к метаданным отчета с помощью этих функций. Выражения, использующие функции из библиотеки времени выполнения Microsoft Visual Basic и из Convert Math пространств имен, можно написать. Можно добавить ссылки на функции из других сборок или пользовательский код. Вы также можете использовать классы из Microsoft платформа .NET Framework, в том числеSystem.Text.RegularExpressions.

Функции Visual Basic

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

Платформа .NET Framework предоставляет множество настраиваемых параметров форматирования, например для определенных форматов дат.

Математические функции

  • Функция Round полезна при округлении чисел до ближайшего целого числа. Следующее выражение округляет 1,3 до 1:

    = Round(1.3)  
    

    Можно также написать выражение, округляющее значение до указанного кратного, подобное функции MRound в Excel. С помощью этой функции можно умножить значение на фактор, который создает целое число, округляет число, а затем делится на один и тот же фактор. Например, чтобы округить 1.3 до ближайшего числа 0,2 (1.4), используйте следующее выражение:

    = Round(1.3*5)/5  
    

Функции данных

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

    =Today()  
    
  • Для извлечения определенной части даты используйте функцию DateInterval. Вот некоторые допустимые параметры DateInterval:

    • DateInterval.Second

    • DateInterval.Minute

    • DateInterval.Hour

    • DateInterval.Weekday

    • DateInterval.Day

    • DateInterval.DayOfYear

    • DateInterval.WeekOfYear

    • DateInterval.Month

    • DateInterval.Quarter

    • DateInterval.Year

      Например, это выражение показывает количество недели в текущем году для сегодняшней даты:

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

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

    =Year(Fields!OrderDate.Value)  
    
  • Для настройки формата функции можно объединять в выражении. Следующее выражение меняет формат даты с формы «месяц-день-год» на форму «месяц-неделя-день недели». Например, 12/23/2009 для December Week 3:

    =Format(Fields!MyDate.Value, "MMMM") & " Week " &   
    (Int(DateDiff("d", DateSerial(Year(Fields!MyDate.Value),   
    Month(Fields!MyDate.Value),1), Fields!FullDateAlternateKey.Value)/7)+1).ToString  
    

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

  • Следующее выражение форматирует значение SellStartDate как MMM-YY. Поле SellStartDate — это тип данных Datetime:

    =FORMAT(Fields!SellStartDate.Value, "MMM-yy")  
    
  • Следующее выражение форматирует значение SellStartDate как dd/MM/гггг. Поле SellStartDate — это тип данных Datetime:

    =FORMAT(Fields!SellStartDate.Value, "dd/MM/yyyy")  
    
  • Функция CDate преобразует это значение в дату. Функция Now возвращает значение Date, содержащее текущую дату и время в соответствии с системой. DateDiff возвращает значение типа Long, указывающее число интервалов времени между двумя значениями типа Date.

    В следующем примере отображается дата начала текущего года:

    =DateAdd(DateInterval.Year,DateDiff(DateInterval.Year,CDate("01/01/1900"),Now()),CDate("01/01/1900"))  
    
  • В следующем примере отображается дата начала предыдущего месяца на основе текущего месяца:

    =DateAdd(DateInterval.Month,DateDiff(DateInterval.Month,CDate("01/01/1900"),Now())-1,CDate("01/01/1900"))  
    
  • Следующее выражение создает интервал между SellStartDate и LastReceiptDate. Эти поля находятся в разных наборах данных — DataSet1 и DataSet2. Функции построитель отчетов — первая функция в отчете с разбивкой на страницы (построитель отчетов), которая является статистической функцией, возвращает первое значение SellStartDate в DataSet1 и первое значение LastReceiptDate в DataSet2:

    =DATEDIFF("yyyy", First(Fields!SellStartDate.Value, "DataSet1"), First(Fields!LastReceiptDate.Value, "DataSet2"))  
    
  • Функция DatePart возвращает целочисленное значение, содержащее указанный компонент заданного значения Date. Следующее выражение возвращает год для первого значения SellStartDate в DataSet1. Область набора данных указана, так как в отчете существует несколько наборов данных:

    =Datepart("yyyy", First(Fields!SellStartDate.Value, "DataSet1"))  
    
    
  • Функция DateSerial возвращает значение даты, представляющее указанный год, месяц и день, с указанием времени, заданного полуночи. В следующем примере отображается дата окончания для предыдущего месяца на основе текущего месяца:

    =DateSerial(Year(Now()), Month(Now()), "1").AddDays(-1)  
    
  • Следующие выражения отображают различные даты на основе значения параметра даты, выбранного пользователем:

Описание примера Пример
Вчера =DateSerial(Year(Parameters!TodaysDate.Value),Month(Parameters!TodaysDate.Value),Day(Parameters!TodaysDate.Value)-1)
Два дня назад =DateSerial(Year(Parameters!TodaysDate.Value),Month(Parameters!TodaysDate.Value),Day(Parameters!TodaysDate.Value)-2)
Месяц назад =DateSerial(Year(Parameters!TodaysDate.Value),Month(Parameters!TodaysDate.Value)-1,Day(Parameters!TodaysDate.Value))
Два месяца назад =DateSerial(Year(Parameters!TodaysDate.Value),Month(Parameters!TodaysDate.Value)-2,Day(Parameters!TodaysDate.Value))
Год назад =DateSerial(Year(Parameters!TodaysDate.Value)-1,Month(Parameters!TodaysDate.Value),Day(Parameters!TodaysDate.Value))
Два года назад =DateSerial(Year(Parameters!TodaysDate.Value)-2,Month(Parameters!TodaysDate.Value),Day(Parameters!TodaysDate.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 полезны для возврата подстроки, например обрезки DOMAIN\username только имени пользователя. Следующее выражение возвращает часть строки параметраUser, расположенную справа от символа обратной косой черты (\):

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

    Следующее выражение приводит к тому же значению, что и предыдущий, используя элементы класса платформа .NET Framework 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)  
    

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

    ="Report for " & JOIN(Parameters!MySelection.Value, " & ")  
    
    
  • Функции Regex из платформа .NET Framework System.Text.RegularExpressions полезны для изменения формата существующих строк, например форматирования номера телефона. Следующее выражение использует функцию Replace для изменения формата телефонного номера в поле с "nnn-nnn-nnnnnn" на "(nnn) nnn-nnnn":

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

    Примечание.

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

Подстановка

  • При указании ключевого поля можно использовать функцию Lookup для извлечения значения из набора данных со связью "один к одному", например для пары "ключ-значение". Следующее выражение отображает имя продукта из набора данных с именем Product, учитывая идентификатор продукта для сопоставления:

    =Lookup(Fields!PID.Value, Fields!ProductID.Value, Fields!ProductName.Value, "Product")  
    

LookupSet

  • Задавая ключевое поле, можно использовать функцию LookupSet для извлечения набора значений из набора данных со связью "один ко многим". Например, у одного человека может быть несколько телефонных номеров. В следующем примере предположим, что набор данных PhoneList содержит в каждой строке идентификатор пользователя и телефонный номер. ФункцияLookupSet возвращает массив значений. Следующее выражение объединяет возвращаемые значения в одну строку и отображает список телефонных номеров для пользователя, указанного ContactID:

    =Join(LookupSet(Fields!ContactID.Value, Fields!PersonID.Value, Fields!PhoneNumber.Value, "PhoneList"),",")  
    

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

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

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

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

    =CStr(Parameters!MySelection.Count)  
    

Функции принятия решений

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

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

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

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

  • Такого же эффекта можно добиться с помощью функции 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, отображаются зеленым фоном. Значения от одного до девяти отображаются синим фоном. Значения, равные одному отображению с желтым фоном. Значения 0 или меньше отображаются красным фоном.

  • Проверьте значение поля "ВажныйDate " и верните "Красный", если оно больше недели и "Синий" в противном случае. Это выражение можно использовать для управления свойством Color текстового поля в элементе отчета:

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

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

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

    =IIF(IsNothing(Fields!LargePhoto.Value),True,False)  
    
  • Функция MonthName возвращает значение типа String, содержащее название указанного месяца. В следующем примере отображается значение NA в поле "Месяц" , если поле содержит значение 0:

    IIF(Fields!Month.Value=0,"NA",MonthName(IIF(Fields!Month.Value=0,1,Fields!Month.Value)))  
    
    

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

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

Sum

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

    =Sum(Fields!LineTotal.Value, "Order")  
    
  • Функцию Sum можно также использоваться для вычислений условных статистических функций. Например, представьте, что у вас есть набор данных с полем с именем State с возможными значениями Not Started, Started и 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. Если поместить это выражение в верхний или нижний колонтитул страницы, он предоставляет сумму значений в текстовом поле "Затраты" для страницы:

    =Sum(ReportItems("Cost").Value)  
    

Примечание.

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

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

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

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

    =Ceiling(RowNumber(Nothing)/25)  
    

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

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

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

Свойства

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

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

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

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

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

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

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

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

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

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

Примечание.

Доступные цвета приходят из перечисления Платформа .NET Framework KnownColor.

Цвета диаграммы

Чтобы указать цвета для диаграммы фигур, можно использовать пользовательский код для управления порядком, который сопоставляет цвета со значениями точек данных. Этот пользовательский код помогает использовать согласованные цвета для нескольких диаграмм с одинаковыми группами категорий. Дополнительные сведения см. в разделе "Указание согласованных цветов" в нескольких диаграммах фигур в отчете с разбивкой на страницы (построитель отчетов).

Visibility

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

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

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

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

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

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

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

    ="https://contoso/MyInfo?ID=" & Fields!EmployeeID.Value  
    

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

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

    =IIF(Parameters!IncludeURLs.Value,"https://contoso.com/productcatalog",Nothing)  
    

данных отчета

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

Параметры

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

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

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

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

    =Fields(Parameters!ParameterField.Value).Value  
    

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

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

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

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

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

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

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

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

  • Задайте для числителя значение 0 и знаменатель равным 1, если значение поля B равно 0 или не определено. В противном случае задайте числитель для поля A и знаменателя значение поля B:

    =IIF(Field!B.Value=0, 0, Field!A.Value / IIF(Field!B.Value =0, 1, Field!B.Value))  
    
  • Используйте функцию пользовательского кода, чтобы вернуть значение выражения. В следующем примере возвращается процентная разница между текущим и предыдущим значениями. Это значение можно использовать для вычисления разницы между двумя последовательными значениями. Он обрабатывает пограничный случай первого сравнения, если предыдущее значение отсутствует, и он работает в случаях, когда предыдущее значение или текущее значение является пустым, называемым 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  
    

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

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

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