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

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

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

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

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

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

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

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

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

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

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

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

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

При использовании конструктора запросов моделей отчетов для создания запроса, чтобы получить набор данных, в котором в качестве источника данных используется модель отчета, можно использовать формулы вместо выражений. Эти формулы помогут уточнить данные отчета, если использовать пользовательские вычисления, встроенные в запрос, уточняющий данные, возвращаемые источником данных модели отчета. Дополнительные сведения см. в разделе Использование формул в запросах моделей отчетов (построитель отчетов версии 3.0 и службы SSRS).

ПримечаниеПримечание

В построителе отчетов и в конструкторе отчетов среды Business Intelligence Development Studio можно создавать и изменять определения отчета (RDL). В каждой среде разработки существуют различные способы создания, открытия и сохранения отчетов и связанных элементов. Дополнительные сведения см. в разделе Разработка отчетов в построителе отчетов и конструкторе отчетов 3.0 (SSRS) на веб-сайте microsoft.com.

Функции

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

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

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

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

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

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

    = Round(1.3)
    

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

    = Round(1.3*5)/5
    

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

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

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

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

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

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

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

  • Объединяют несколько полей с помощью операторов объединения и констант 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 FrameworkSystem.Text.RegularExpressions полезны при изменении формата существующих строк, например при форматировании телефонного номера. В следующем выражении функция 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 не содержит лишних пробелов и имеет тип String.

Lookup

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

    =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 в поле 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)
    

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

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

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)
    

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

Свойства

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

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

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

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

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

Видимость

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

  • Если указать следующее выражение для определения видимости строк сведений в группе, они отображаются только для продаж со значением более 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-адрес (построитель отчетов версии 3.0 и службы SSRS).

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

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

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

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

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

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

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

=Code.FixSpelling(Fields!SubCategory.Value)

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

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 текстового поля для условного отображения текста в зависимости от того, больше или меньше оно нуля.