Хотя вас, конечно же, не выгонят за это из команды разработчиков отчетов, почему бы не выполнить еще одно простое действие, чтобы отчет выглядел еще лучше? Попробуйте сделать следующее:
If {0Ship Days} = 0 Then "Доставка в тот же день"
Else
If {0Ship Days} = 1 Then "Доставка через 1 день"
Else
"Доставка через " + ToText({0Ship Days}. 0) + " дня"
Это пример составного, или вложенного, оператора If-Then-Else. Обратите внимание на то, что количество конструкций If, Then и Else в формуле может быть любым.
Вы можете сделать второй оператор If результатом первого Then или результатом первого Else и так далее. Никаких строгих ограничений по поводу того, каким должно быть количество вложений, не существует, однако, несомненно, формула будет с трудом восприниматься уже после одного или двух уровней вложения. Не забывайте также, что наличие конструкции Else не является обязательным, а это значит, что при добавлении вложенных уровней вам вовсе необязательно включать соответствующую конструкцию Else для каждой конструкции If.
Несколько действий в одном операторе If-Then-Else
Вы, наверное, заметили, что во всех показанных выше примерах оператора If-Then- Else в качестве результата вычисления частей Then и Else выполнялось только одно действие. Хотя такой вариант подходит для многих формул, в некоторых ситуациях вам будет необходимо сделать так, чтобы выполнялось не одно, а сразу несколько действий; например, может потребоваться, чтобы в качестве результата одной конструкции Then или Else присваивались значения сразу нескольким переменным (переменные более подробно будут рассматриваться чуть позже в этой главе). В таком случае вы можете просто повторить проверку If-Then-Else несколько раз, с разными результатами для каждой конструкции Then и Else. Главное, не забывайте отделять операторы If-Then- Else друг от друга с помощью точки с запятой. Например, чтобы в одной формуле присвоить значения сразу нескольким переменным, вы можете воспользоваться следующим кодом:
NumberVar GroupBonus;
NumberVar GroupFollowUpCount;
NumberVar ReportBonus;
NumberVar ReportFollowUpcount;
StringVar GoodCustomer;
If {Orders.Order Amount} > 5000 Then GroupBonus := GroupBonus + 1
Else
GroupFollowUpCount := GroupFollowUpCount + 1 ;
If {Orders.Order Amount} > 5000 Then ReportBonus := ReportBonus + 1
Else
ReportFollowUpCount := ReportFollowUpCount + 1 ;
If {Orders.Order Amount} > 5000 Then GoodCustomer := {Customer.Customer Name}
Все эти операторы I f будут вычислены и всем переменным будут присвоены соответствующие значения. В отчете формула отобразит результат последнего действия в операторе If. В этом примере, если Order Amount превышает $5000, все бонусные переменные будут увеличены на единицу, а переменной GoodCustomer будет присвоено имя заказчика. Но поскольку присвоение значения переменной GoodCustomer является последним выполняемым действием, то имя заказчика и будет именно тем, что формула отобразит в отчете. Если Order Amount меньше $5000, то на единицу будет увеличено содержимое двух переменных FollowUpCount. Но поскольку последний оператор в этом случае все равно будет пытаться присвоить новое значение переменной GoodCustomer, но эта попытка завершится неудачей (в этом операторе нет конструкции Else), в конечном счете, переменной GoodCustomer никакое значение присвоено не будет и формула возвратит пустую строку.
Улучшенные варианты формул If-Then-Else в Crystal Reports
Если описанная до этого логика If-Then-Else еще не вызвала у вас желание стать программистом (или даже наоборот, отбила его), знайте, что Crystal Reports включает еще целый ряд других возможностей If-Then-Else, которые, возможно, заставят вас все-таки изменить свое мнение!
Во-первых, операторы If-Then-Else в синтаксисе Basic отличаются от своих “собратьев” в синтаксисе Crystal. Синтаксис Basic следует более распространенному подходу If-Then-Else-Endlf, хорошо известному программистам, работающим на языке Basic. В частности, включение конструкции Endlf существенно упрощает задачу выполнения нескольких действий в качестве результата одного оператора If-Then-Else:
If <проверка> Then Else-Endif <оператор>
<оператор>
<еще операторы.>
Else
<оператор>
<оператор>
<еще операторы.>
End If
В синтаксисе Basic вы также можете использовать конструкцию Else If (обратите внимание на то, что Endlf пишется слитно), которая позволяет делать вложения нескольких условий I f в одном операторе:
If <первая проверка> Then <оператор.>
Elself Соператоры второй проверки> Then соператоры второй проверки>
Else
<операторы, если первая проверка будет неудачной.>
End If
Помимо этого, существует еще одна версия логики If-Then-Else, доступная как в синтаксисе Crystal, так и в синтаксисе Basic. Если вы пользуетесь программными продуктами Microsoft Office, типа Microsoft Access, то наверняка знакомы с функцией IIF {Immediate If). Эта сокращенная версия расширенной логики If-Then-Else фактически представляет собой одну функцию, подобную ToText или Uppercase (в дереве функций ее можно найти в разделе Programming Shortcuts (Программные сокращения)), которая принимает три аргумента. Синтаксис этой функции выглядит следующим образом:
IIF(<булевское выражением <результат, если true>, <результат, если false>)
Эту функцию удобно использовать для упрощения логики If-Then-Else в небольших простых формулах или для создания такого себе мини-оператора If-Then-Else, который будет выполняться в виде части более сложной формулы. Например, взгляните на следующую строковую формулу, в которой используется традиционная логика If-Then-Else:
If {Customer.Counry} "USA” Then {Customer.Counrу Name} + " требует внутренних тарифов доставки"
Else
{Customer.Counry Name} + " требует международных тарифов доставки"
С применением функции Ilf эта формула может быть упрощена до следующего вида:
{Customer.Counry Name} + " требует " +
IIF({Customer.Counry} » "USA", "внутренних", "международных") + "тарифов доставки"
Если вы посмотрите на предыдущую формулу, то обнаружите много одинаковых фрагментов кода (одни только проверки I f повторяются три раза). Это дублирование можно устранить, создав один оператор If-Then-Else, но при этом поместив в конструкции Then и Else несколько действий, разделив их точками с запятой и заключив в круглые скобки. Вот как та же самая формула будет выглядеть при использовании такого подхода:
NumberVar GroupBonus;
NumberVar GroupFollowUpCount;
NumberVar ReportBonus;
NumberVar ReportFollowUpcount;
SrtingVar GoodCustomer;
If {Orders.Order Amount} > 5000 Then
(GroupBonus := GroupBonus +1;
ReportBonus := ReportBonus +1;
GoodCustomer := {Customer. Customer Name})
Else
(GroupFollowUpCount := GroupFollowUpCount =1;
ReportFollowUpcount := ReportFollowUpcount = 1;
GoodCustomer := "")
Внимание! В показанном выше примере в формулу обязательно должен быть включен оператор, присваивающий в конструкции Else переменной GoodCustomer значение пустой строки. В противном случае вы получите следующее сообщение об ошибке “A string is required there” СНеобходима строка”). Причина та же — конструкции Then и Else должны возвращать один и тот же тип данных. Если в конструкции Else переменной GoodCustomer не будет присвоено значение пустой строки, конструкция Then будет возвращать строковое значение (присваивая значение строковой переменной), а конструкция Else — числовое (присваивая значение числовой переменной).
Полезные встроенные функции для формул If-Then-Else
Если вы заглянете в окно Function Tree в редакторе Formula Editor, то обнаружите там категорию Print State (Состояние печати). Развернув ее, вы увидите множество встроенных функций, которые можно использовать в формулах If-Then-Else (а также в других формулах) для повышения степени гибкости своих отчетов. Например, здесь будут доступны все отображаемые в окне проводника Field Explorer специальные поля, такие как Page Number (Номер страницы), Total Page Count (Общее количество страниц), Print Date and Time (Дата и время печати), Record Number (Номер записи), Group Number (Номер группы) и так далее. А также там будут доступны и другие специальные функции, которые можно применять для проверки наличия значения null в текущей, следующей и последней записи, для проверки, является текущая запись базы данных первой или последней, либо для проверки, появляется ли заданная формула в повторяющемся заголовке группы. С помощью этих специальных встроенных функций вы сможете создавать формулы, которые будут делать ваши отчеты более содержательными и удобочитаемыми.
Давайте рассмотрим несколько примеров:
• Функция isNull
If IsNull({Customer.Region}) Then
II n
Else
", " + {Customer.Region}
При необходимости сделать так, чтобы включенные в формулу поля базы данных проверялись на наличие значений null, без функции IsNull никак не обойтись. Используя If-Then-Else вместе с функцией IsNull, мы можем проверить, содержит ли поле региона значение null. Если да, то формула возвратит пустую строку (которую мы обозначили с помощью пары двойных кавычек). В противном случае она вернет запятую, пробел и имя региона. Эта формула затем может быть объединена с полями города и почтового адреса в другой формуле для создания строки полного адреса (то есть адреса, который будет состоять из названия города, названия штата и почтового индекса). Если поле региона в базе данных будет содержать null, то вторая формула возвращать null не будет.
Совет. Значения null и способы избежать их появления в отчетах более подробно рассматривались ранее в этой главе, во врезке иРешение вопроса со значениями NULL”.