SSRS 矩阵列单元格中的动态格式

问题描述 投票:0回答:1

我有以下未透视的数据集

Select
    *
From
    (
        Values
            (1,'name','article 1','nvarchar')
            ,(1,'price','123.00','decimal')
            ,(1,'warrenty','2026-01-01','date')
            ,(1,'amount','10','int')
            ,(2,'name','article 2','nvarchar')
            ,(2,'price','12.45','decimal')
            ,(2,'warrenty','2026-12-01','date')
            ,(2,'amount','13','int')
            ,(3,'name','article 3','nvarchar')
            ,(3,'price','00.99','decimal')
            ,(3,'warrenty','2026-06-15','date')
            ,(3,'amount','2','int')
    ) As a(number,col,val,coltype)

并将其输出到具有行组 number 和列组 col 的矩阵 tablix 中,如下所示: Unformatted results

我现在想根据 coltype

中的类型设置某些列的格式

我尝试了自定义格式表达式

=Switch(
    Fields!coltype.Value = "int"
        ,"0"
    ,Fields!coltype.Value = "decimal"
        ,"0.###"
    ,Fields!coltype.Value = "date"
        ,"dd/MM/yyyy"   
)

但是格式会被忽略。我认为因为日期和数字格式只能识别日期和数字字段而不是字符串。

因此我在文本字段表达式中添加了相应的转换

=Switch(
    Fields!coltype.Value = "int"
        ,CInt(Fields!val.Value)
    ,Fields!coltype.Value = "decimal"
        ,CDbl(Fields!val.Value) 
    ,Fields!coltype.Value = "date"
        ,CDate(Fields!val.Value)
    ,1=1
        ,Fields!val.Value
) 

结果: All values are error

因此我删除了自定义格式并尝试直接使用此格式表达式来格式化文本字段的值:

=Switch(
    Fields!coltype.Value = "int"
        ,Format(Fields!val.Value,"0")
    ,Fields!coltype.Value = "decimal"
        ,Format(Fields!val.Value,"0.###")   
    ,Fields!coltype.Value = "date"
        ,Format(Fields!val.Value,"dd/MM/yyyy")
    ,1=1
        ,Fields!val.Value
)

Formatting string becomes field value

我尝试使用 Nn 表示 int,使用 Dd 表示小数,但唯一的结果是格式化字符串成为单元格值。 有趣的是,字符串 ShortDateLong date 适用于日期格式。不幸的是格式错误。

Formatting string for long date works

那么如何动态格式化 SSRS 矩阵单元中的值,还是必须在数据集查询中执行此操作?

reporting-services formatting ssrs-tablix
1个回答
0
投票

你们非常接近!您需要将值转换和格式化结合起来。

您的值转换失败,因为即使由于

SWITCH()
中的条件而将其排除,每个值也在评估中,因此所有数字都无法转换为日期等...(无法将“10”转换为日期) .

所以,矩阵“cell”的值表达式应该是...

=Switch(
     Fields!coltype.Value = "int" , VAL(Fields!val.Value)
    ,Fields!coltype.Value = "decimal" , VAL(Fields!val.Value)
    ,Fields!coltype.Value = "date" , CDATE(IIF(Fields!coltype.Value = "date", Fields!val.Value, "1900-01-01"))
    , True,  Fields!val.Value
)

注意两件事。

  1. CDATE()
    中,我们检查 coltype 是否为“date”,如果不是,我们将值交换为任意有效日期(在本例中为 1900-01-01)。这个值永远不会被看到,所以任何日期就足够了。

您可能想知道为什么我们不对数字数据类型做类似的事情?我使用

VAL()
转换为数值,这很高兴转换日期字符串等,即使结果不是您所期望的(例如 VAL("2029-12-01") 将返回 2026),没关系,因为这些值永远不会被看到。

  1. 最后的
    True
    充当 else 的角色与您对
    1=1
    所做的相同,只是更整洁一点(恕我直言)

好的,这就是排序后的值,

格式表达式与您所拥有的差不多,我只是使用了速记格式代码。我使用

N
显示千位分隔符,如果您不需要它们,只需将其交换为
F
即可。

=Switch(
     Fields!coltype.Value = "int" ,"n0"
    ,Fields!coltype.Value = "decimal" ,"n3"
    ,Fields!coltype.Value = "date" ,"dd/MM/yyyy"   
)

希望这能让你感到惊讶。

这是我的示例的输出。蓝色阴影列是转换后的版本,白色列是用于比较的原始数据库值。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.