2016-08-15 270 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"))