2013-07-02 28 views
8

我遇到問題,我嘗試過的所有內容都無法使用。我有一個電話號碼數據字段,返回沒有格式'3055558798'的數字,但我希望它看起來像這樣'(305)555-8798'。我可以用這個表達式來完成:返回爲空格式電話號碼並隱藏#ERROR SSRS

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

唯一的問題是,當返回爲空時,我在空間中得到#ERROR。我發現一個表達式可以擺脫#ERROR,但仍然沒有運氣把它們放在一起。我將不得不挖掘我的報告來找到表達,但希望有人可以幫助我。我已經做了幾個月的報告,但我仍然不太擅長所有的表達。我只需要格式化電話號碼,如果返回爲空,則不顯示任何內容。在同一個網站上也有這樣的情況,我發現了這個表達,但它不起作用,所以我不知道爲什麼這個人說他爲他工作。

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

這只是不適合我,我相信語法是錯誤的,但我不知道該怎麼改變來解決它。謝謝。

+0

我試過這種基於簡單的DataSet'選擇MyFieldName =「3055558798」聯盟的所有選擇MyFieldName = null'第二個表達式按要求工作,沒有錯誤;似乎表達式本身沒有內在的錯誤。 –

回答

22

您得到的錯誤與格式無關,它是轉換爲Double即失敗。所以只要你的領域完全由數字字符組成,你的表達就完美了。但是,您的某些數據中包含非數字字符,導致Convert.ToDouble()函數發生錯誤。

可惜這不能與IIF表達不能解決的,因爲IIF是一個函數,而不是一種語言結構,因此被傳遞給函數不管布爾條件參數的值的前兩個真假參數得到評估。這意味着:

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

將始終嘗試轉換不管IsNumeric函數的結果的一倍。有兩種方法來解決這個問題:

使用瓦爾代替ToDouble

ToDouble的問題是它錯誤時,要轉換的字符串是不合適的形式; Val沒有這個問題 - 它只是抓住任何數字。所以,現在我們可以使用表達式:

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

該表達式返回Nothing如果該字段是Null,檢查,看它是否是數字,如果是將其轉換爲數字和格式它,否則它只是返回無論是在該領域。

請注意,即使該字段不是數字,Val函數仍在運行,但此表達式成功,因爲Val函數不會引發像ToDouble這樣的錯誤。我們只是進行計算並丟棄結果。

自定義代碼

Report菜單上,單擊Report Properties...並轉到Code標籤。插入下面的代碼:

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 

使用您的電話號碼電池下面的表達式:

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

克里斯感謝你的措辭非常好,並解釋了答覆。不幸的是,我們正在避免在報告中放置代碼,所以我可能無法做到你所說的,儘管我可以看到如何解決我的問題。我不得不再看一次,因爲我認爲我總是返回數字值,但它們並不總是10位數,格式化表達式會照顧它,不過不會拋出#ERROR for null,所以也許該空返回碼有助於導致問題。我仍然會嘗試一下你的想法,讓自己更好地熟悉這一點。非常感謝你。 –

+0

當格式少於或多於10位時,格式不會引發錯誤。根據你的模式,'30555587'將給予(3)055-5587'和'305555879800'給出'(30555)587-9800',使其從右邊填充並且將出租者或更大的數字放在左邊部分的格式。它只能是由於無效字符而導致錯誤的雙倍轉換。 –

+1

我不確定爲什麼您對自定義代碼區域中的VBA代碼有偏見,而不是VBA代碼中的值表達式 - VBA無論在哪裏都是VBA。但是,我發現我們可以使用的Val轉換函數不會拋出錯誤,因此您可以使用表達式。我已經添加了這個答案。 –