2016-08-15 299 views
1

我想找到一種方法將SSRS中的字段四捨五入到小數位的動態數字。我知道我可以動態地對其進行格式化,並且最終可能會這樣做,但我的許多用戶將直接將此報告發送到Excel,並且希望具有實際的數字字段。四捨五入SSRS中的可變小數位數

我的T-SQL代碼包括這些聲明的變量:

 NumLong01     DECIMAL(23,8) 
    , NumLongDP01    INTEGER 

第一組在該表中的條目是用於報頭和舍入參數。所以我添加值,這兩個爲:

NULL 
,4 

,然後我添加了實際的表值:

987654321.87654321 
,NULL 

這樣,我可以把一個全系列的數字到表中,但它們都有以相同的方式格式化。

運行此查詢產生:

enter image description here

當我去報表製作,我場有這樣的表達:

=Fields!NumLong01.Value

如果我想格式化某個小數位數,我可以這樣做:

=Round(Fields!NumLong01.Value,2)或其他一些。我試圖這樣做,雖然是使之動態:

=Round(Fields!NumLong01.Value,First(Fields!NumLongDP01.Value, "DataSet1"))

這結束了四捨五入到0位小數。後來我學會了 - 僅僅使用我的領域的後半部分 - 這是一個NULL值。所以我嘗試了Sum而不是First - 再次,只是在我的領域 - 得到了我期望的4。太好了,所以現在我有我的號碼,我只是把在爲我取整:

=Round(Fields!NumLong01.Value,Sum(Fields!NumLongDP01.Value, "DataSet1"))

唯一的問題是,這會產生一個錯誤。接下來我問自己是否因爲某種原因沒有把它看作一個數字。所以我只是把它添加到我的領域。沒問題。所以我真的不知道它在做什麼。它是否認爲這個領域可能會變得很長,以至於會導致非法的小數位數?現在

,我可以這樣做:

=IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 8,Round(Fields!NumLong01.Value,8),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 7,Round(Fields!NumLong01.Value,7),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 6,Round(Fields!NumLong01.Value,6),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 5,Round(Fields!NumLong01.Value,5),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 4,Round(Fields!NumLong01.Value,4),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 3,Round(Fields!NumLong01.Value,3),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 2,Round(Fields!NumLong01.Value,2),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 1,Round(Fields!NumLong01.Value,1),Round(Fields!NumLong01.Value,0))))))))) 

...這工作。但它似乎是這樣一個荒謬的方式去做。

我也很自然地只傳遞了t-SQL中的舍入數字。但後來我遇到了在報表上只顯示一定數量的小數的問題,因爲在數字格式中,出於某種原因,它不允許有一個動態的小數位數。

任何想法,將不勝感激。

+0

繼這篇文章中,我試圖用「N4」的格式,它實際上在Excel工作就我可以告訴。過去,我修改其他報告的情況並非總是如此,但我不知道爲什麼。所以如果我可以讓它像那樣工作,我很滿意。但我仍然有興趣知道爲什麼我最初的四捨五入方法不符合我的期望。 – DaveX

+0

新的更新:仍然有我以前在Excel中的相同問題。只有一行,我沒有任何加起來,所以我只是加了一個像4的固定數字,這給了我一筆錢。因此,它一定是Excel中的數字字段,對吧?錯誤。當我做多行時,我會在右下角得到一個數(不是總和),我的數字總和爲0.所以我回到了我的瘋狂的IIf集。 – DaveX

+0

在我提出解決方案之前,只需進行一些簡要的查詢。必須將小數點位置指定爲數據集的第一行,並且允許您更改表格結構嗎?最後,爲什麼你特別需要有一個變量(動態)的小數位數?是否避免0填充? –

回答

1

這不是完整的動態舍入或數字格式化方法的列表,因爲您可以使用報告中的自定義代碼或通過修改數據集的SQL查詢來實現這一點。

使用舍入:

第一組在該表中的條目是用於報頭和舍入參數。這樣我可以將一系列數字放入表格中,但它們都必須以相同的方式進行格式化。

爲了避免在您的報告生成表達式需要聚合函數,例如FirstSum,併產生一個空白行,你則必須刪除,考慮剛進入小數數的每一行,而不是使用標題行。即使看起來多餘,成本(存儲和表達評估)也很低。

這意味着,而不是使用:=Round(Fields!NumLong01.Value,First(Fields!NumLongDP01.Value, "DataSet1"))您可以使用=Round(Fields!NumLong01.Value,Fields!NumLongDP01.Value)無論是作爲表達或作爲計算領域DataSet1或任何你的數據集被調用。

使用數字格式:

但後來我碰上只顯示一定數量的報告小數的問題,因爲在數字格式它不允許的動態數由於某些原因小數位。

您可以爲報表中的NumLong01字段定義自定義格式,並使用表達式將其設置爲動態以構建自定義格式字符串。

  1. 打開文本框屬性爲NumLong01文本框或表矩陣場
  2. 打開數字選項卡,並從類別列表中
  3. 自定義選擇點擊FX按鈕,使用下面的表達式="0." + StrDup(First(Fields!NumLongDP01.Value, "DataSet1"), "0")

使用您的示例數據,此表達式將生成自定義格式字符串0.0000,將987654321.87654321更改爲987654321.8765。爲了您的信息,StrDup重複指定的字符串X次。

如果數字的小數部分小於所需的小數精度,則此格式字符串將填充0。如果不需要,請將要複製的字符串更改爲"#",如下所示:StrDup(First(Fields!NumLongDP01.Value, "DataSet1"), "#")

您還可以使用此方法作爲計算領域數據集中,但只有當你已刪除標題行和前面提到的正在進入的每一行的小數位。這是因爲您不能在計算的字段表達式中使用聚合函數。

要做到這一點,一個計算領域添加到您的數據集的表達:=Format(Fields!NumLong01.Value, "0." + StrDup(Fields!NumLongDP01.Value, "0"))