Деление на ноль в формуле кросс-таблицы

У меня есть кросс-таблица с полем формулы. Запрос возвращает что-то вроде

 CategoryID   Company       MarketValue   PaymentMode
  1            ABC             1000         H
  1            xyz             2000         H
  3            efg             9800         H

Режим оплаты раз в полгода обозначается буквой «H». Я сделал поле формулы для оценки режима оплаты по

WhileReadingRecords;
numberVar mode;  
         if({PaymentMode}='H') then mode:=2 else mode:=12

Затем я сделал еще одно поле формулы

WhileReadingRecords;
numberVar mode;
numberVar result:={MarketValue}/mod;
result

Однако он возвращает ошибку деления на ноль. Почему моя формула для режима оплаты не оценивается должным образом. Я попытался поместить формулу режима оплаты в заголовок отчета, а кросс-таблица - 2-й заголовок, но все равно выдает ту же ошибку.


person Zo Has    schedule 20.01.2011    source источник


Ответы (2)


Две проблемы.

Первая синтаксическая ошибка - а точнее опечатка, отсутствует последняя буква "е" :)

numberVar result:={MarketValue}/mode;

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

EvaluateAfter({@calc_mode});
person Arvo    schedule 20.01.2011
comment
Спасибо, Арво, EvaluateAfter() исправила мне проблему =) - person Zo Has; 20.01.2011

Я рад, что вы уже нашли ответ Арво, но у меня есть несколько предложений по упрощению вашего кода:

  1. Mode — это встроенная функция Crystal (см. файлы справки Crystal). Поэтому, когда я увидел, что вы используете это слово в качестве имени пользовательской переменной, мой мозг сделал сальто назад. Как насчет того, чтобы вместо этого назвать его «numPayPeriods»?

  2. Поскольку формула вашего примера включает значения полей, Crystal реализует WhileReadingRecords по умолчанию (опять же, см. файлы справки Crystal). Так что добавление в данном случае излишне. Вы можете убрать это полностью.

  3. В вашем примере нет необходимости в двух отдельных формулах. Кроме того, ваша переменная Result не нужна в синтаксисе Crystal. Вы можете упростить все это до одной формулы:

    if({PaymentMode}='H') then
    {MarketValue}/2
    else
    {MarketValue}/12;

person PowerUser    schedule 20.01.2011
comment
Привет PowerUser. Большое спасибо за всю эту информацию и полезные советы. Я сделал отдельную переменную и поместил ее в заголовок отчета, потому что думал, что она будет оцениваться снова и снова для каждой записи. Вы, вероятно, правы насчет части имени переменной, потому что у меня было ноль для некоторых строк по какой-то странной причине, которую я не мог понять. С такими парнями, как вы, stackoverflow — отличное место, чтобы пообщаться. Еще раз большое спасибо, Дэмиен. - person Zo Has; 21.01.2011
comment
Иногда становится немного сложно понять работу кристалла без встроенного отладчика. - person Zo Has; 21.01.2011
comment
Спасибо, Дэмиен. Кстати, у него есть встроенный компилятор, который вы можете использовать для отладки. Когда вы либо сохраняете формулу, либо используете Alt-C, вы получите всплывающее окно с любыми ошибками компиляции. - person PowerUser; 21.01.2011