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

Давний читатель, первый раз плакат.

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

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

ForecastMovementCurrentPeriod ActualMovementCurrentPeriod

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

Вот они:

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

Если ForecastMovementCurrentPeriod = 0 И 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' ‹0, возвращается" + 100% "

Если ForecastMovementCurrentPeriod ‹> 0 и если 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' не является ошибкой, и ABS ((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod) / ForecastMovementCurrentPeriod)> 100%, верните« Large »

Если ForecastMovementCurrentPeriod ‹> 0 и если 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' не является ошибкой, а ABS ((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod) / ForecastMovementCurrentPeriod)‹ 20%, верните «Minor»

Если ForecastMovementCurrentPeriod ‹> 0 и если 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' не является ошибкой и ABS ((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod) / ForecastMovementCurrentPeriod)‹ 100% и> 20%, return (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 вернет первое значение, которое будет ИСТИНА, в зависимости от порядка, в котором находятся операторы. Почему он не возвращает «-100%» или «+ 100%», если критерии соблюдены и последние 3 строки моего оператора SWITCH также присутствуют?

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

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

Я разобрался в проблеме.

В конце концов, мне удалось разобраться. Несмотря на то, что оператор SWITCH вернет истинное значение для первого выражения, похоже, что оператор SWITCH фактически не вернет это значение до тех пор, пока не будет оценено КАЖДОЕ выражение в операторе. Когда он пытался оценить последние 3 оператора, произошло деление на ноль, и поэтому он возвращал #ERROR, даже если первое выражение было оценено как истинное.

Странное поведение, потому что я бы подумал, что как только оператор 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 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 не прекращает оценку всего блока, как только находит первое истинное значение - мне это кажется пустой тратой вычислений.

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


person Michael    schedule 14.05.2015    source источник
comment
Похоже на проблему типов данных. Что говорит ошибка, которую вы получаете?   -  person APH    schedule 14.05.2015
comment
Попробуйте преобразовать все поля в выражение и убедитесь, что деление регистра на 0 не происходит.   -  person Chanom First    schedule 14.05.2015
comment
Спасибо, ребята - в итоге удалось разобраться. Несмотря на то, что оператор SWITCH вернет истинное значение для первого выражения, похоже, что оператор SWITCH фактически не вернет это значение до тех пор, пока не будет оценено КАЖДОЕ выражение в операторе. Когда он пытался оценить последние 3 оператора, произошло деление на ноль, и поэтому он возвращал #ERROR, даже если первое выражение было оценено как истинное. Странное поведение, потому что я бы подумал, что как только оператор SWITCH найдет истинное значение, он не потрудится оценить другие.   -  person Michael    schedule 14.05.2015


Ответы (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)
person Greg    schedule 14.05.2015