SSRS和SSAS是支持VB的,而且自定义Code其实也是只支持VB,或者其他语言可以编码成DLL再用咯。下面是官方VB函数库,基本上都能用,保存起来妥妥的。
https://msdn.microsoft.com/en-us/library/ms157328.aspx
https://msdn.microsoft.com/library/c157t28f.aspx
其实我们一般都在SSRS和SSAS里面用得比较多都是一些字符函数,日期函数,判断函数,如果真心有很复杂的处理,建议在数据里面做比较好。下面贴出官方的函数例子。
您可以使用 Visual Basic 函数来处理文本框中所显示的数据,或者处理参数、属性或报表其他区域中所用的数据。 本部分举例说明了其中的一些函数。 有关详细信息,请参阅 Visual Basic Runtime Library Members(Visual Basic 运行时库成员)。
.NET Framework 提供了许多自定义格式选项,例如,特定日期格式。 有关详细信息,请参阅 MSDN 上的 格式化类型。
-
Round 函数可用于将数字舍入为最接近的整数。 下面的表达式将 1.3 舍入为 1:
= Round(1.3)
您也可以编写表达式以将某个值舍入到您指定的倍数,类似于 Excel 中的 MRound 函数。 用某个生成整数的因子乘以该值,对数字进行舍入,然后除以同一因子。 例如,若要将 1.3 舍入到 .2 (1.4) 的最接近的倍数,请使用下面的表达式:
= Round(1.3*5)/5
-
Today 函数可提供当前日期。 此表达式可用在文本框中以在报表上显示日期,或用在参数中以根据当前日期筛选数据。
=Today()
-
若要基于单个参数提供日期范围,可使用 DateAdd 函数。 下面的表达式提供名为 StartDate 的参数日期之后六个月的日期。
=DateAdd(DateInterval.Month, 6, Parameters!StartDate.Value)
-
Year 函数可显示某个特定的日期的年份。 您可以使用此表达式将日期组合在一起,或者将年份显示为一组日期的标签。 此表达式可以提供一组给定的销售订单日期的年份。 Month 函数和其他函数也可用于日期操作。 有关详细信息,请参阅 Visual Basic 文档。
=Year(Fields!OrderDate.Value)
-
您可以在表达式中组合函数,以自定义格式。 下面的表达式将“月-日-年”的日期格式更改为“月-周-周数”。 例如,将“12/23/2009”更改为“December Week 3”:
=Format(Fields!MyDate.Value, "MMMM") & " Week " &
(Int(DateDiff("d", DateSerial(Year(Fields!MyDate.Value),
Month(Fields!MyDate.Value),1), Fields!FullDateAlternateKey.Value)/7)+1).ToString当此表达式在数据集中用作计算字段时,您可以在图表上使用该表达式来按每个月内的周聚合值。
-
以下表达式将 SellStartDate 值的格式设置为 MMM-YY。 SellStartDate 字段为 datetime 数据类型。
=FORMAT(Fields!SellStartDate.Value, "MMM-yy")
-
以下表达式将 SellStartDate 值的格式设置为 dd/MM/yyyy。 SellStartDate 字段为 datetime 数据类型。
=FORMAT(Fields!SellStartDate.Value, "dd/MM/yyyy")
-
CDate 函数将值转换为日期。 Now 函数根据您的系统返回包含当前日期和时间的日期值。 DateDiff 返回一个指定两个日期值之间的时间间隔数的长整型值。
以下示例显示了当前年份的开始日期
=DateAdd(DateInterval.Year,DateDiff(DateInterval.Year,CDate("01/01/1900"),Now()),CDate("01/01/1900"))
-
以下示例显示了基于当前月的上一个月的开始日期。
=DateAdd(DateInterval.Month,DateDiff(DateInterval.Month,CDate("01/01/1900"),Now())-1,CDate("01/01/1900"))
-
以下表达式生成介于 SellStartDate 和 LastReceiptDate 之间的间隔年。 这些字段在两个不同的数据集内,即 DataSet1 和 DataSet2。 First 函数(报表生成器和 SSRS) 是一个聚合函数,它返回 DataSet1 中 SellStartDate 的第一个值和 DataSet2 中 LastReceiptDate 的第一个值。
=DATEDIFF(“yyyy”, First(Fields!SellStartDate.Value, "DataSet1"), First(Fields!LastReceiptDate.Value, "DataSet2"))
-
DatePart 函数返回一个整型值,该值包含给定日期值的指定组件。以下表达式返回 DataSet1 中 SellStartDate 的第一个值的年份。 指定数据集作用域是因为报表中有多个数据集。
=Datepart("yyyy", First(Fields!SellStartDate.Value, "DataSet1"))
-
DateSerial 函数返回一个代表指定年、月和日的日期值,其时间信息设置为午夜。 以下示例显示了基于当前月的上一个月的结束日期。
=DateSerial(Year(Now()), Month(Now()), "1").AddDays(-1)
以下表达式基于用户选定的日期参数值显示不同日期。
示例说明 |
示例 |
---|---|
昨天 |
=DateSerial(Year(Parameters!TodaysDate.Value),Month(Parameters!TodaysDate.Value),Day(Parameters!TodaysDate.Value)-1) |
两天前 |
=DateSerial(Year(Parameters!TodaysDate.Value),Month(Parameters!TodaysDate.Value),Day(Parameters!TodaysDate.Value)-2) |
一个月前 |
=DateSerial(Year(Parameters!TodaysDate.Value),Month(Parameters!TodaysDate.Value)-1,Day(Parameters!TodaysDate.Value)) |
两个月前 |
=DateSerial(Year(Parameters!TodaysDate.Value),Month(Parameters!TodaysDate.Value)-2,Day(Parameters!TodaysDate.Value)) |
一年前 |
=DateSerial(Year(Parameters!TodaysDate.Value)-1,Month(Parameters!TodaysDate.Value),Day(Parameters!TodaysDate.Value)) |
两年前 |
=DateSerial(Year(Parameters!TodaysDate.Value)-2,Month(Parameters!TodaysDate.Value),Day(Parameters!TodaysDate.Value)) |
-
使用串联运算符和 Visual Basic 常量可将多个字段组合在一起。 以下表达式返回两个字段,它们分别位于同一文本框的不同行中:
=Fields!FirstName.Value & vbCrLf & Fields!LastName.Value
-
使用 Format 函数可设置字符串中日期和数字的格式。 下面的表达式以长日期格式显示 StartDate 和 EndDate 参数的值:
=Format(Parameters!StartDate.Value, "D") & " through " & Format(Parameters!EndDate.Value, "D")
如果文本框仅包含日期或数字,则应使用文本框的 Format 属性来应用格式设置,而不应在文本框中使用 Format 函数。
-
Right、Len 和 InStr 函数对于返回子字符串十分有用,例如将 DOMAIN\username 剪裁为用户名。 下面的表达式从名为 User 的参数返回反斜杠 (\) 字符右侧的字符串部分:
=Right(Parameters!User.Value, Len(Parameters!User.Value) - InStr(Parameters!User.Value, "\"))
下面的表达式使用 .NET Framework SystemString 类的成员而不是 Visual Basic 函数,可得到与上一个表达式相同的值:
=Parameters!User.Value.Substring(Parameters!User.Value.IndexOf("\")+1, Parameters!User.Value.Length-Parameters!User.Value.IndexOf("\")-1)
-
显示多值参数的所选值。 下面的示例使用 Join 函数,将参数 MySelection 的所选值串联到单个字符串中,该字符串可设置为报表项中文本框值的表达式:
= Join(Parameters!MySelection.Value)
以下示例的作用与上面的示例相同,另外在所选值列表之前显示文本字符串。
=”Report for “ & JOIN(Parameters!MySelection.Value, “ & “)
-
.NET Framework System.Text.RegularExpressions 中的 Regex 函数对更改现有字符串的格式很有用,例如设置电话号码格式。 以下表达式使用 Replace 函数将字段中的十位电话号码格式从“nnn-nnn-nnnn”更改为“(nnn) nnn-nnnn”:
=System.Text.RegularExpressions.Regex.Replace(Fields!Phone.Value, "(\d{3})[ -.]*(\d{3})[ -.]*(\d{4})", "($1) $2-$3")
注意 验证 Fields!Phone.Value 的值没有多余的空格并且类型为 String。
-
通过指定键字段,您可以使用 Lookup 函数为一对一关系(例如键值对)从数据集检索值。 下面的表达式通过提供用于匹配的产品标识符,显示来自数据集(“Product”)的产品名称:
=Lookup(Fields!PID.Value, Fields!ProductID.Value, Fields.ProductName.Value, "Product")
-
通过指定键字段,您可以使用 LookupSet 函数为一对多关系从数据集检索一组值。 例如,一个人可以有多个电话号码。 在下面的示例中,假定数据集 PhoneList 在每一行中包含一个人员标识符和电话号码。 LookupSet 返回值的数组。 下面的表达式将返回值合并到单个字符串中,并且显示 ContactID 指定的人士的电话号码的列表:
=Join(LookupSet(Fields!ContactID.Value, Fields!PersonID.Value, Fields!PhoneNumber.Value, "PhoneList"),",")
使用 Visual Basic 函数可以将字段从一种数据类型转换为另一种不同的数据类型。 转换函数可用于将字段的默认数据类型转换为计算所需的数据类型或用于组合文本。
-
以下表达式将常量 500 转换为十进制类型,以便将其与筛选表达式值字段中的 Transact-SQL money 数据类型进行比较。
=CDec(500)
-
下面的表达式显示为多值参数 MySelection 选择的值的数目。
=CStr(Parameters!MySelection.Count)
-
Iif 函数可根据表达式的计算结果(True 或 False)返回两个值中的一个。 下面的表达式使用 Iif 函数在 LineTotal 的值超过 100 时返回布尔值 True。 否则,它将返回 False:
=IIF(Fields!LineTotal.Value > 100, True, False)
-
使用多个 IIF 函数(也称为“嵌套 IIF”)可以根据 PctComplete 的值返回三个值中的一个。 下面的表达式可放置在文本框的填充颜色中,从而根据文本框中的值更改背景色。
=IIF(Fields!PctComplete.Value >= 10, "Green", IIF(Fields!PctComplete.Value >= 1, "Blue", "Red"))
值大于或等于 10 时,显示绿色背景;介于 1 和 9 之间时,显示蓝色背景;小于 1 时,显示红色背景。
-
还有另一种方法可以实现相同功能,即使用 Switch 函数。 如果您要测试三个或更多条件,Switch 函数将非常有用。 Switch 函数可返回与序列中计算结果为 True 的第一个表达式相关联的值:
=Switch(Fields!PctComplete.Value >= 10, "Green", Fields!PctComplete.Value >= 1, "Blue", Fields!PctComplete.Value = 1, "Yellow", Fields!PctComplete.Value <= 0, "Red",)
值大于或等于 10 时,显示绿色背景;介于 1 和 9 之间时,显示蓝色背景;等于 1 时显示黄色背景;小于或等于 0 时,显示红色背景。
-
测试 ImportantDate 字段的值,如果该值大于一周,则返回“Red”;否则返回“Blue”。 此表达式可用于控制报表项中的文本框的 Color 属性:
=IIF(DateDiff("d",Fields!ImportantDate.Value, Now())>7,"Red","Blue")
-
测试 PhoneNumber 字段的值,如果为 null(在 Visual Basic 中为 Nothing),则返回“无值”;否则返回电话号码值。 此表达式可用于控制报表项中的文本框的值。
=IIF(Fields!PhoneNumber.Value Is Nothing,"No Value",Fields!PhoneNumber.Value)
-
测试 Department 字段的值,然后返回子报表名称或 null(在 Visual Basic 中为 Nothing)。 此表达式可用于条件性钻取子报表。
=IIF(Fields!Department.Value = "Development", "EmployeeReport", Nothing)
-
测试字段值是否为空。 此表达式可用于控制图像报表项的 Hidden 属性。 在下面的示例中,字段 [LargePhoto] 指定的图像仅当字段值非空时才会显示。
=IIF(IsNothing(Fields!LargePhoto.Value),True,False)
-
MonthName 函数返回一个包含指定月的名称的字符串值。 以下示例在“月”字段(当该字段包含的值为 0 时)中显示 NA。
IIF(Fields!Month.Value=0,"NA",MonthName(IIF(Fields!Month.Value=0,1,Fields!Month.Value)))
在表达式中,您可以添加对使用报表中数据的附加报表函数的引用。 本部分举例说明了其中两个函数。 有关报表函数和示例的详细信息,请参阅 聚合函数引用(报表生成器和 SSRS)。
-
Sum 函数可以对某个组或数据区域中的值求和。 此函数在组的组头或组尾中非常有用。 下面的表达式显示 Order 组或数据区域中的数据之和:
=Sum(Fields!LineTotal.Value, "Order")
-
还可以使用 Sum 函数进行条件聚合计算。 例如,如果数据集包含名为 State 的字段,其可能的值为 Not Started、Started、Finished,则将下列表达式放置在组头中时将只计算 Finished 值的聚合总数。
=Sum(IIF(Fields!State.Value = "Finished", 1, 0))
-
RowNumber 函数,如果用在数据区域内的文本框中,则显示表达式所在文本框中的每个实例的行号。 此函数可用于为表中的各行编号。 还可以用于更复杂的情况,如根据行数插入分页符。 有关详细信息,请参阅本主题中的分页符。
为 RowNumber 指定的作用域可控制开始重新计数的时间。 Nothing 关键字表示该函数将从最外面的数据区域中的第一行开始计数。 若要在嵌套数据区域中开始计数,可使用该数据区域的名称。 若要在某个组中开始计数,可使用该组的名称。
=RowNumber(Nothing)