Получение "#ERROR" в определенных полях при использовании функции Split в SSRS - PullRequest
0 голосов
/ 27 августа 2018

Я использую функцию разделения для разделения столбца с двумя адресами улиц.

Информация отделяется ,.

С некоторыми строками связан только один адрес.

В этих строках для моего адреса 2 я получаю #ERROR, когда хочу, чтобы оно было null.

Я попробовал выражение IIF() для выражения, но у меня возникли проблемы с ним.

Split(Fields!Street.Value, ",").GetValue(2)

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

(Используйте пользовательскую функцию для каждого адреса.
Адаптировано из: Split String

     Public Function GetAddress1(ByVal a as String)
            Dim b() as string
            b=Split(a,",")
            Dim str_1(b.Length) As String
            Dim i As Integer
            For i = 0 To b.Length - 1
                str_1(i) = b(i).Split(",")(0)
            Next
       return str_1
    End Function

    Public Function GetAddress2 (ByVal a as String)
         Dim b() as string
         b=Split(a,",")
         Dim str_1(b.Length) As String
         Dim i As Integer
         For i = 0 To b.Length - 1
              str_1(i) = b(i).Split(",")(1)
         Next
        return str_1
End Function
0 голосов
/ 27 августа 2018

В отличие от оператора If, операторы IIf оценивают все пути кода, даже если используется только один путь кода. Это означает, что ошибка в неиспользуемом пути кода будет пузыриться до ошибки в операторе IIf, мешая его правильному выполнению.

Чтобы исправить это, вам нужно использовать функции, которые не будут выдавать ошибку, когда нечего разбивать.

Вот пример кода, который должен делать то, что вы хотите:

=IIf(
InStr(
    InStr(
        Parameters!Street.Value
        , ","
        ) + 1
    , 
    Parameters!Street.Value
    , ","
    ) = 0
, Nothing
, Right(
    Parameters!Street.Value
    , Parameters!Street.Value.ToString().Length - (
        InStr(
            InStr(
                Parameters!Street.Value
                , ","
                ) + 1
            , 
            Parameters!Street.Value
            , ","
            )
        )
    )
)

Давайте разберемся с этим.

Я использовал комбинацию функций InStr (), Right (), Length () и IIf () для разделения строки без выдачи ошибки.

InStr () используется для определения положения строки "," в адресе. Это возвращает 0, а не ошибку, если не может найти строку.

InStr(Parameters!Street.Value, ",")

Поскольку вы, похоже, ищете вторую запятую в своей функции разделения, вам нужно будет вложить функцию InStr. Используйте местоположение первой запятой в качестве начального местоположения для поиска второй запятой. Не забудьте +1, или вы снова найдете первую запятую.

InStr(InStr(Parameters!Street.Value, ",") + 1, Parameters!Street.Value, ",")

Теперь вы можете найти вторую запятую, не выдавая ошибку, даже если запятых не существует.

В зависимости от расположения второй запятой используйте функцию Right (), чтобы захватить все символы справа от второй запятой. Поскольку Right () нужно знать, сколько символов в конце, а не в начале, вам необходимо вычесть расположение запятой из Length () строки. Это эффективно разбивает строку через запятую.

Right(
    Parameters!Street.Value
    , Parameters!Street.Value.ToString().Length - (
        InStr(InStr(Parameters!Street.Value, ",") + 1, Parameters!Street.Value, ","))
    )
)

Если у вас более 2 запятых, вы можете просто взять строку между 2-й и 3-й запятой, выполнив функцию Left (), которая находит местоположение 3-й запятой.

Теперь вы можете использовать вашу функцию IIf () для возврата NULL (Nothing), если нет второй запятой. Функция вверху показывает, как все это сочетается.

Это можно исправить с помощью функций, но предоставленный код показывает, как это можно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...