2013-07-02 19 views
8

Mam problem i wszystko, co próbowałem, nie działa. Mam pole danych z numerem telefonu, które zwraca numery bez formatowania "3055558798", ale chcę, aby wyglądało to tak "(305) 555-8798". Mogę to zrobić z tym wyrażeniem:Formatuj numer telefonu i ukryj nr #ERROR, gdy zwrot jest pusty. SSRS

= Format(Convert.ToDouble(Fields!MyFieldName.Value), "(###)###-####") 

Jedynym problemem jest to, że gdy zwrot jest null ja dostać #Error w przestrzeni. Znalazłem wyrażenie, które pozbyło się #ERROR, ale wciąż nie było szczęścia, łącząc je razem. Musiałbym przejrzeć moje raporty, aby znaleźć wyrażenie, ale mam nadzieję, że ktoś może mi pomóc. Robię raporty od kilku miesięcy, ale nadal nie jestem dobry z wszystkimi wyrażeniami, które istnieją. Potrzebuję tylko sformatować numer telefonu, a jeśli zwrot jest zerowy, nic nie pokażę. Jest to również na tej samej stronie, na której znalazłem wyrażenie, ale nie działa, więc nie wiem, dlaczego facet powiedział, że działa dla niego.

=Iif (Fields!MyFieldName.Value Is Nothing, Nothing, 
Format(Convert.ToDouble(Fields!MyFieldName.Value), "(###)###-####")) 

To po prostu nie działa dla mnie, uważam, że składnia jest błędna, ale nie wiem, co zmienić, aby to naprawić. Dzięki.

+0

Próbowałem to na prostym zestawie danych w oparciu o 'wybrać MyFieldName = unii '3055558798' all select MyFieldName = null' a drugie wyrażenie działało zgodnie z wymaganiami bez błędu; wydaje się, że nie ma nic z natury nie w porządku z samym wyrażeniem. –

Odpowiedz

22

Błąd, który otrzymałeś, nie ma nic wspólnego z formatowaniem. Konwersja na Double kończy się niepowodzeniem. Twoja ekspresja działa idealnie, o ile twoje pole składa się wyłącznie ze znaków numerycznych. Jednak masz w nim dane z nieliczbowymi znakami, co powoduje, że funkcja Convert.ToDouble() wyświetla błąd.

Niestety ten nie może być rozwiązany z wyrazem IIF ponieważ IIF jest funkcją, a nie konstrukcja język więc zarówno prawdziwe i fałszywe parametry ocenia się przed przekazywany do funkcji, niezależnie od wartości parametru stan logicznej. Oznacza to, że:

=IIF(IsNumeric(Fields!Phone.Value), Format(Convert.ToDouble(Fields!Phone.Value), "(###)###-####"), Fields!Phone.Value) 

zawsze będą próbować konwersję podwoić niezależnie od wyniku funkcji IsNumeric. Istnieją dwa sposoby, aby rozwiązać ten problem:

Zastosowanie Val zamiast ToDouble

Problem z ToDouble Jest on błędy, gdy łańcuch zostanie zamienione jest nieodpowiednie forma; Val nie ma tego problemu - po prostu chwyta dowolne numery. Więc teraz możemy użyć wyrażenia:

=IIF(Fields!Phone.Value Is Nothing, 
    Nothing, 
    IIF(IsNumeric(Fields!Phone.Value), 
    Format(Val(Fields!Phone.Value), "(###)###-####"), 
    Fields!Phone.Value) 
) 

To wyrażenie zwraca Nothing jeśli pole jest Null, sprawdza, czy jest numeryczny, a jeśli tak konwertuje go do numeru i formatów, w przeciwnym razie po prostu powraca co jest w polu.

Należy pamiętać, że funkcja Val jest nadal uruchamiana, nawet jeśli pole nie jest numeryczne, ale to wyrażenie się powiedzie, ponieważ funkcja Val nie powoduje wystąpienia błędów, takich jak ToDouble. Po prostu wykonujemy obliczenia i odrzucamy wynik.

kod klienta

W menu Report, kliknij Report Properties... i przejdź do zakładki Code.Wstaw następujący kod:

Function FormatPhone(Phone AS String) AS String 
    IF (Phone Is Nothing) Then 
    Return Nothing 
    Else If (IsNumeric(Phone)) Then 
    Return Format(Convert.ToDouble(Phone), "(###)###-####") 
    Else 
    Return Phone 
    End If 
End Function 

Użyj następującego wyrażenia w numer telefonu komórkowego:

=Code.FormatPhone(Fields!Phone.Value) 
+0

Chris dziękuję za tę bardzo dobrze sformułowaną i wyjaśnioną odpowiedź. Niestety unikamy umieszczania kodu w raportach, więc może nie być w stanie zrobić tego, co powiedziałeś, chociaż widzę, jak to rozwiązałoby mój problem. Muszę się jeszcze raz przyjrzeć, ponieważ myślę, że zawsze zwracam wartości numeryczne, ale nie zawsze są to 10 cyfr, wyrażenie formatujące zajmuje się nim niezależnie, ale powoduje, że #ERROR ma wartość zerową, więc być może kod dla tego zerowego zwrotu pomaga przyczyną problemu. Wciąż próbuję twojego pomysłu tylko po to, by lepiej się z tym zapoznać. Dziękuję Ci bardzo. –

+0

Format nie spowoduje błędu, gdy jest mniejszy niż lub więcej niż 10 cyfr. Na podstawie Twojego wzorca, '30555587' poda' (3) 055-5587' i '305555879800' poda' (30555) 587-9800', więc wypełnia się z prawej strony i umieszcza w lewej ręce lewę lub wyższą cyfrę formatu. Może to być tylko konwersja do wartości podwójnej, która powoduje błąd z powodu nieprawidłowych znaków. –

+1

Nie jestem pewien, dlaczego masz uprzedzenia przeciwko kodowi VBA w niestandardowym obszarze kodu, w przeciwieństwie do kodu VBA w wyrażeniu Value - VBA to VBA bez względu na to gdzie jest. Jednak znalazłem funkcję konwersji Val, której możemy użyć, która nie spowoduje błędu, więc możesz mieć wyrażenie, które działa. Dodałem to do odpowiedzi. –