SSRS # Ошибка в сочетании с IIF и Cdbl - PullRequest
0 голосов
/ 08 ноября 2018

надеюсь, что кто-то более опытный может дать мне ответ / решение моей проблемы. В базе данных у меня есть два столбца, один для контроля, показываем ли мы данные, а данные, которые должны быть показаны, находится во втором столбце. У меня есть данные и выражение, как показано ниже:

ShowPriceOnMatrix | RSP
-------------------------------
0                 | 1.48
1                 | 10.26 euro    -> This one fails with #Error
1                 | 4.59
0                 | 7.12


=IIF(Fields!ShowPriceOnMatrix.Value = 1, CDbl(Fields!RSP.Value), "")

Это выражение иногда дает мне #Error. Проблема в том, что поле RSP было определено как nvarchar , и я не могу изменить его сейчас, поэтому я пытаюсь преобразовать в число и показать как. Некоторые пользователи при вводе цены в поле также набирают текст ex. «12,45 евро» или аналогичный. Когда выражение достигает значения с текстом, весь IIF завершается с ошибкой #Error, даже если в первом столбце указано, что цена не отображается.

Проблема с IIF заключается в том, что он не пропускает второй параметр, если первый оценивается как false, и, следовательно, выдает #Error в моем случае.

Я пытался использовать

IsNumeric(Cdbl(Fields!RSP.Value))

и

IsError(Cdbl(Fields!RSP.Value))

но оба они тоже дают #Error. Из объяснения SSRS для этих функций они должны возвращать логическое значение, но каким-то образом я получаю #Error:)

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Просто преобразуйте поле в числовое значение, используя

VAL(Fields!RSP.Value)

Кроме того, вы можете рассмотреть возможность использования SWITCH вместо IIF. SWITCH останавливается на первом выражении, которое оценивается как True, тогда как IIF будет оценивать все выражения независимо от того, будут они использоваться или нет.

В вашем случае, с одним IIF, SWITCH не имеет значения, но в тех случаях, когда используются вложенные IIF, или в ситуациях, когда вы можете получить ошибку деления на ноль, SWITCH часто легче читать / отлаживать. Так что-то вроде этого, где у нас есть гипотетическая ситуация, которую мы хотим проверить на деление на ноль и возврат на ноль, или если вещь, на которую мы делим, отрицательна, мы хотим вернуть -1, в противном случае выполните вычисление ...

=IIF(Fields!MyDivisor.Value = 0, 0, IIF(Fields!MyDivisor.Value <0, -1,  Fields!MyNumber.Value/ Fields!MyDivisor.Value))

станет

=SWITCH (
    Fields!MyDivisor.Value =0, 0,
    Fields!MyDivisor.Value <0, -1,
    True, Fields!MyNumber.Value/ Fields!MyDivisor.Value
    )

каждая пара выражение / результат оценивается по порядку, пока не достигнет первого выражения True, поэтому, если MyDivisor был равен нулю, он вернул бы 0 и остановился, если он был отрицательным, он вернул бы -1 и остановился. Последний True действует как else (так как True всегда возвращает True!), Поэтому он будет выполнять вычисления только в том случае, если все другие выражения вернут false.

0 голосов
/ 08 ноября 2018

Вы можете использовать это выражение для извлечения ваших числовых значений:

=System.Text.RegularExpressions.Regex.Replace(Fields!RSP.Value, "[^0-9,]", "")

Но вы должны позаботиться о . в 1.48. С , и языком DE у меня сработало. С . это будет:

=System.Text.RegularExpressions.Regex.Replace(Fields!RSP.Value, "[^0-9.]", "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...