Проблема оценки выражений SSRS Вложенный IIF/Switch

Многолетний читатель, первый постер.

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

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

ForecastMovementCurrentPeriod ActualMovementCurrentPeriod

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

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

Если ForecastMovementCurrentPeriod = 0 И 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod'>0, вернуть "-100%"

Если ForecastMovementCurrentPeriod = 0 И 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod'<0, вернуть "+100%"

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

Если ForecastMovementCurrentPeriod <> 0 и If 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' не является ошибкой, а ABS((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod) / ForecastMovementCurrentPeriod) < 20%, вернуть "Minor"

Если 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)
    )

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

Интересно то, что если я удаляю последние 3 строки в своем операторе SWITCH, то у меня есть только:

=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 будет возвращать первое значение, равное TRUE, в зависимости от порядка, в котором они находятся. Почему он не вернет "-100%" или "+100%", если критерии соблюдены и последние 3 строки моего оператора SWITCH также присутствуют?

Любая помощь будет потрясающей!

РЕДАКТИРОВАТЬ:

Я понял проблему.

Мне удалось это выяснить в конце концов. Даже несмотря на то, что оператор SWITCH вернул бы истинное значение для первого выражения, похоже, что оператор SWITCH фактически не вернет это значение до тех пор, пока не будет выполнено КАЖДОЕ выражение в выражении. Когда он пытался оценить последние 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"
    )

Я все еще нахожу странным, что SWITCH не прекращает оценку всего блока, когда находит первое истинное значение - для меня это пустая трата вычислений.

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

1 ответ

Я думаю, что в вашем последнем утверждении 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)
Другие вопросы по тегам