0

Долгосрочный читатель, впервые плакат.SSRS Expression Evaluation Issue Nested IIF/Switch

У меня сложная ситуация с выражением SSRS, с которым я хочу получить помощь.

меня есть, среди прочего, 2 колонки внутри таблицы с именем:

ForecastMovementCurrentPeriod ActualMovementCurrentPeriod

У меня 5 критериев, которые должны быть применены в выражении в третьей колонке.

Они заключаются в следующем:

Если ForecastMovementCurrentPeriod = 0 и 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod'> 0, возвращение "-100%"

If ForecastMovementCurrentPeriod = 0 и «ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod '< 0, возврат "+ 100%"

Если ForecastMovementCurrentPeriod <> 0 И если 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' не является ошибка, и ABS ((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod)/ ForecastMovementCurrentPeriod)> 100%, возврат "Large"

Если ForecastMovementCurrentPeriod <> 0 И если 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' не является ошибки, и АБС ((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod)/ ForecastMovementCurrentPeriod) < 20%, возвращение "Минор"

Если ForecastMovementCurrentPeriod <> 0 и если 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' не является ошибки и АБС ((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod)/ForecastMovementCurrentPeriod) < 100% и> 20%, возвращение (ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod)/ForecastMovementCurrentPeriod)

Это те критерии, которые необходимо вернуть выражениям. Я пробовал сочетание операторов SWITCH и операторов IIF, но я не могу заставить его работать.

Ниже мой код:

=SWITCH 
    (
     SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) > 0.00, "-100%", 
     SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) < 0.00, "+100%", 
     SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.99123131414) AND (ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)))/ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)) > 1.00, "Large", 
     SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND (ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)))/ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)) < 0.20, "Minor", 
     SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND ((ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)))/ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)) > 0.20 AND (ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)))/ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value))) < 1.00, (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value))/SUM(Fields!ForecastMovementCurrentPeriod.Value) 
    ) 

Это возвращает правильно для «Большой», «Minor» и окончательный критерий, который будет% значение 2 колонки. Проблема, с которой я сталкиваюсь, заключается в том, что она возвращает ошибку, когда удовлетворяются первые 2 критерия, например, ForecastMovementCurrentPeriod = 0 И ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod приводит к словам «5» - он должен возвращать «-100%», но вместо этого возвращает #Error ,

Интересно то, что если я удалить последние 3 строки в моем ПЕРЕКЛЮЧАТЕЛЬ заявлении, так что я только, скажем:

=SWITCH 
(
    SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) > 0.00, "-100%", 
    SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) < 0.00, "+100%" 
    ) 

возвращает правильные значения для одних и тех же строк, которые возвращают в #Error когда остальные 3 линии находятся там! Я не могу для жизни понять это. Я пробовал вложенные заявления IIF безрезультатно.

Может ли кто-нибудь сказать мне, что я могу делать неправильно? Насколько я знаю, инструкция SWITCH вернет первое значение, которое является ИСТИННЫМ, на основе порядка, в котором содержатся эти утверждения. Почему он не будет возвращать «-100%» или «+ 100%», когда критерии будут соблюдены, а также последние 3 строки моего оператора SWITCH?

Любая помощь была бы замечательной!

EDIT:

Я понял вопрос.

Мне удалось разобраться в этом. Несмотря на то, что инструкция SWITCH вернет истинное значение для первого выражения, похоже, что инструкция SWITCH фактически не вернет это значение до тех пор, пока не будет оценено выражение EVERY в инструкции. Когда он пытался оценить последние 3 оператора, произошел деление на нуль, и именно поэтому оно вернет #ERROR, хотя первое выражение оценивается как true.

Странное поведение, потому что я бы подумал, что как только оператор SWITCH найдет истинное значение, он не стал бы оценивать другие.

Моим решением было обернуть заявления IIF вокруг последних 3 выражений, чтобы избежать деления на ноль.

код ниже:

=SWITCH 
    (
     SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) > 0.00, "-100%", 
     SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) < 0.00, "+100%", 
     SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.99123131414) AND IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))/IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) > 1.00, "Large", 
     SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))/IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) < 0.20, "Minor",  
     SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND (IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))/IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) > 0.20 AND IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))/IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))) < 1.00, IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))/IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))), 
    TRUE, "Error" 
    ) 

Я все еще нахожу странным, что ПЕРЕКЛЮЧАТЕЛЬ не прекращает вычисление всего блока, когда он находит первое истинное значение - кажется тратой вычислений для меня.

В любом случае, спасибо, ребята!

+0

звучит как проблема типов данных. Что говорит ошибка? – APH

+0

Попробуйте применить все поля в выражении и убедиться, что деление на 0 не произойдет. –

+0

Спасибо, ребята, мне удалось разобраться в этом. Несмотря на то, что инструкция SWITCH вернет истинное значение для первого выражения, похоже, что инструкция SWITCH фактически не вернет это значение до тех пор, пока не будет оценено выражение EVERY в инструкции. Когда он пытался оценить последние 3 оператора, произошел деление на нуль, и именно поэтому оно вернет #ERROR, хотя первое выражение оценивается как true. Странное поведение, потому что я бы подумал, что, как только оператор SWITCH найдет истинное значение, он не стал бы оценивать другие. – Michael

ответ

0

Я думаю, что ваш последний оператор switch имеет скобки в неправильном месте. Это то, что я вижу, если я разбить его:

SUM(cpv) <> 0 
    AND (SUM(mcp) - SUM(cpv) <> 0.9912313141) 
    AND 
    (
     (ABS(SUM(mcp)) - ABS(SUM(cpv)))/ABS(SUM(cpv)) > 0.20 
     AND (ABS(SUM(mcp)) - ABS(SUM(cpv)))/ABS(SUM(cpv)) -- This is not valid calculation 
    ) < 1.00, 
     (SUM(mcp) - SUM(cpv))/SUM(cpv) 

Это шестая строка не является допустимым расчет, потому что вы закрыли скобки слишком рано. вам нужно поставить последние парсеры после «< 1.00». Как это:

SUM(cpv) <> 0 
    AND (SUM(mcp) - SUM(cpv) <> 0.9912313141) 
    AND 
    (
     (ABS(SUM(mcp)) - ABS(SUM(cpv)))/ABS(SUM(cpv)) > 0.20 
     AND (ABS(SUM(mcp)) - ABS(SUM(cpv)))/ABS(SUM(cpv)) < 1.00 
    ), -- close the parens after 
     (SUM(mcp) - SUM(cpv))/SUM(cpv) 

Для дальнейшего упрощения, я хотел бы попробовать с помощью BETWEEN заявления вместо этого, поскольку он устраняет дублирование:

SUM(cpv) <> 0 
    AND (SUM(mcp) - SUM(cpv) <> 0.9912313141) 
    AND 
    (
     ((ABS(SUM(mcp)) - ABS(SUM(cpv)))/ABS(SUM(cpv))) between 0.20 and 1.00 
    ), 
     (SUM(mcp) - SUM(cpv))/SUM(cpv)