Иногда будут возникать ситуации, когда сказать, в каком именно порядке Crystal Reports будет вычислять операции в формуле, будет невозможно. Например, если требуется добавить налог на продажу к расширенной цене, вы могли бы воспользоваться следующей формулой, которая добавляет восьмипроцентный налог на продажу к расширенной цене заказа (уже подсчитанной в формуле ©Extended Price):
{©Extended Price} + {©Extended Price} * .08
Вопрос о том, в каком порядке Crystal Reports будет вычислять эту формулу, имеет решающее значение. Будет ли сначала выполняться операция сложения, а потом — операция умножения, или же наоборот? Порядок вычисления операций очень сильно повлияет на возвращаемые результаты. Предположим, что значением Extended Price является $100 и при этом операция сложения выполняется первой:
100 + 100 = 200 200 * .08 = 16.00
теперь представим, что первой выполняется операция умножения:
200 * .08 = 8.00 100 + 8 = 108.00
Хотя ваш заказчик, конечно, будет приятно удивлен, если в его счет-фактуру будет занесена сумма, получившаяся в первый раз, все-таки правильным является значение, полученное во второй раз. Но, посмотрев на формулу, вы увидите, что операция умножения идет в формуле второй. Значит ли это, что и вычисляться она тоже будет второй?
Ответ — нет. Почему? Из-за порядка старшинства операций. И хотя эта концепция, возможно, и звучит как сугубо компьютерная, она должна быть знакома еще со средней школы. В рассматриваемой формуле операции умножения и деления выполняются первыми слева направо; после этого выполняются операции сложения и вычитания, слева направо.
Как в синтаксисе Crystal, так и в синтаксисе Basic принят следующий порядок старшинства операций:
• Возведение в степень (А).
• Отрицание (-).
• Умножение, деление, слева направо (*,/).
• Только для синтаксиса Crystal: процент (%) вычисляется одновременно с умножением и делением.
• Целочисленное деление (\ ).
• Модуль (Mod).
• Сложение и вычитание, слева направо (=, -).
Исходя из этого, мы можем сделать вывод, что рассмотренная выше формула, добавляющая к расширенной стоимости налог с продаж, будет работать корректно. Однако, как же быть, если по той или иной причине необходимо, чтобы первой выполнялась операция сложения, а не умножения? Опять-таки вспомним математику из средней школы и заключим ту часть формулы, которая должна вычисляться первой, в круглые скобки. В показанной ниже формуле операция сложения будет выполняться раньше, чем операция умножения:
({©Extended Price} * {©Extended Price}) * .08
На заметку! Если вы используете одну формулу внутри другой, как в данном примере, Crystal Reports вычисляет сначала вложенную формулу (на основании принципа старшинства операций), и только потом вычисляет внешнюю формулу.