Долгосрочный читатель, впервые плакат.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"
)
Я все еще нахожу странным, что ПЕРЕКЛЮЧАТЕЛЬ не прекращает вычисление всего блока, когда он находит первое истинное значение - кажется тратой вычислений для меня.
В любом случае, спасибо, ребята!
звучит как проблема типов данных. Что говорит ошибка? – APH
Попробуйте применить все поля в выражении и убедиться, что деление на 0 не произойдет. –
Спасибо, ребята, мне удалось разобраться в этом. Несмотря на то, что инструкция SWITCH вернет истинное значение для первого выражения, похоже, что инструкция SWITCH фактически не вернет это значение до тех пор, пока не будет оценено выражение EVERY в инструкции. Когда он пытался оценить последние 3 оператора, произошел деление на нуль, и именно поэтому оно вернет #ERROR, хотя первое выражение оценивается как true. Странное поведение, потому что я бы подумал, что, как только оператор SWITCH найдет истинное значение, он не стал бы оценивать другие. – Michael