Типы данных в формулах If-Then-Else

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

Когда вы создаете формулы If-Then-Else, вы обязательно должны обращать особое внимание на то, какие типы данных вы используете. Не забывайте удостовериться в том, вы применили одинаковые типы данных во всех операциях сравнения, которые включили в часть If. Например, выражение, проверяющее, является ли США (USA) страной, в которой проживает заказчик (Customer. Country), должно выглядеть так:

If {Customer.Country} = "USA"

Поскольку Customer. Country — это строковое поле, сравниваться оно может только со строковым литералом, заключенным в кавычки или апострофы (в синтаксисе Basic это должны быть кавычки). Если проверяемое поле является числовым, использовать следует числовую константу (как было показано в примере с Orders .Order Amount). В случае несоответствия типов данных наподобие:

If {Orders.Order Amount} > "5000"

на экране появится сообщение об ошибке.

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

If {Customer.Country} = "USA" And { Orders.Order Amount} > "5000"

В данном случае различные типы данных в части I f формулы допустимы, главное, чтобы с каждой “стороны” операции сравнения данные были одинакового типа.

Например, в вашем отчете уже может использоваться формула @Ship Days, которая вычисляет количество дней, необходимых для доставки заказа. Однако поскольку @ShipDays является числовой формулой, она будет отображать ноль в вашем отчете, если заказ был размещен и выполнен в один и то же день. Чтобы исправить эту ситуацию и сделать так, чтобы, когда @ShipDays возвращает 0, в отчете отображалась строка “В тот же день”, а во всех остальных случаях — просто содержимое самой формулы, можно было бы создать такую формулу If-Then-Else:

If {@Ship Days} = 0 Then "В тот же день" Else {@Ship Days}

Однако если вы щелкните на кнопке Check в редакторе Formula Editor, чтобы проверить синтаксис этой формулы, то получите сообщение об ошибке, показанное на рис. 5.15.

Проблема заключается в том, что Crystal Reports не знает, какой тип данных присвоить этой формуле. Если проверка даст в результате значение true, формула возвратит строку для слов “В тот же день”. Однако если результатом проверки окажется false, формула возвратит значение @ShipDays, которое является числом. Crystal Reports должен присвоить формуле тип данных в момент ее создания — он не может ждать до тех пор, когда начнется выполнение отчета. Поэтому, хотя часть I f формулы и может содержать различные типы данных, части Then и Else обязательно должны содержать одни и те же типы данных.

Помните функцию, которая позволяет преобразовывать различные типы данных в строки? Так вот как может быть разрешена эта проблема:

If {QShip Days} = 0 Then "В тот же день”

Else

ToText({0Ship Days})

Теперь формула выглядит уже лучше, поскольку она не будет отображать в отчете ноль в качестве количества дней доставки. Но мы хотим пойти еще дальше, чтобы сделать отчет даже еще более удобочитаемым. Взгляните-ка на улучшенную версию этой формулы:

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

Else

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

Такая версия будет смотреться лучше в отчете, особенно, если в нем не используются одни только колонки. Возможно, вы захотите поместить эту формулу в заголовок группы заказа, до появления в разделе подробностей отдельных видов товаров, включенных в этот заказ. Но тогда возникает еще одна проблема. Что возвратит эта формула, если на доставку будет затрачен всего лишь один день?

Доставка через 1 дня
Функция Next
Оператор Select Case
Цикл For
Цикл While Do

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


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