Доставка через 1 дня

Оценить
(0 голоса)

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

If {0Ship Days} = 0 Then "Доставка в тот же день"

Else

If {0Ship Days} = 1 Then "Доставка через 1 день"

Else

"Доставка через " + ToText({0Ship Days}. 0) + " дня"

Это пример составного, или вложенного, оператора If-Then-Else. Обратите внимание на то, что количество конструкций If, Then и Else в формуле может быть любым.

Доставка через 1 дня 

Вы можете сделать второй оператор 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”.

Функция Next
Оператор Select Case
Цикл For
Цикл While Do
Булевские формулы

Добавить комментарий


Защитный код
Обновить