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