SSRS 中并没有直接提供本地化的配置方式,因此在 SSRS 中实现本地化,比如有英文标题还有可选的中文标题,就需要通过其它的方式来解决。

比如默认是这样的英文标题 -

但是本地中方用户可能比较喜欢看到这样的标题 -

我们可以通过以下方式来实现 -

创建一张翻译表,这张翻译表将配置所有需要本地化的中文和英文标签。

--------------------------------------------------------------------------
-- http://www.cnblogs.com/biwork
--------------------------------------------------------------------------
USE BIWORK_SSIS
GO IF OBJECT_ID('dbo.TRANSLATION','U') IS NOT NULL
DROP TABLE dbo.TRANSLATION
GO CREATE TABLE dbo.TRANSLATION
(
ID INT,
LANGUAGE_TYPE NVARCHAR(25),
LANGUAGE_DESC NVARCHAR(255)
CONSTRAINT [PK_TRANSLATION] PRIMARY KEY CLUSTERED(ID,LANGUAGE_TYPE)
) INSERT INTO dbo.TRANSLATION VALUES
(1,'en-US','Employee ID'),
(1,'zh-CN',N'员工 ID'),
(2,'en-US','Full Name'),
(2,'zh-CN',N'名称'),
(3,'en-US','Title'),
(3,'zh-CN',N'职位') SELECT ID,
LANGUAGE_TYPE,
LANGUAGE_DESC
FROM dbo.TRANSLATION

注意上面的主键部分,是 ID 和 LANGUAGE_TYPE 共同组成。 en-US 英文,zh-CN 中文

报表默认的语言我们可以看看 SSRS Report 的内置字段 Language - 把这个字段拖放到报表上然后预览一下看看,我的默认的就是 en-US,后面会用到这个内置字段。

创建一个 DataSet - DS_LABELS, 在 BIDS 工具中,如果在查询时写好了这个参数,创建完 DataSet后,这个参数就会被直接创建出来,不需要预先定义。

再创建一个 Dataset - DS_LANGUAGES 用来作为报表上的语言参数 -

同时给 @LANGUAGE 变量赋值可用的值 -

Default Value 也可以像上面一样选中 DS_LANGUAGES 来给定值,当然也可以让这个参数在显示的时候按照报表自身的默认语言来显示,使用 Build-In 内置字段。

还要再创建一个隐藏的可多选的参数 - LABELS

可用的值 -

默认值 -

在报表区域右键属性,然后在 Code 里添加一段 VB 代码 -

Public Function GetLabel(P as Parameter, Label as String) as String
Dim i As Integer For i = to Ubound(P.Value)
If (P.Value(i) = Label) Then Return P.Label(i)
Next i
Return Label
End Function

这段代码的作用就是将参数 LABELS 对象(注意第一个参数的类型是 Parameter) 传入,然后循环遍历这个参数对象的所有 VALUE 值,如果某一个 VALUE 值即表中的 ID 列正好等于第二个参数的值,那么就将这个参数的 VALUE 所对应的 LABEL 返回。

这个代码是最核心的代码!

好了,这样就可以在页面上根据数据翻译表中的 ID 来获取对应的 LABEL 了。

需要的地方全都修改,并指定相应的 ID。

预览报表,可以根据相应的语言查看报表。

在网上看到不止这一种解决方法,也有使用自定义的 Code 来解决的,但我认为这种方式还是相对要容易管理一些,并且所有的标签内容在数据库表中进行管理,很方便。

当然,在实际使用的时候要考虑到可重用性,也就是说不同的报表中字段,标签名称相同的情况下应该使用同一个标签而不应该重复创建字段。因此在检查字段标签是否重复存在的时候可以对 LANGUAGE_DESC 进行排序然后检查。

并且,如果为了更好的管理报表的标签的话,应该再增加一个Report表和ReportLabel表。即需要知道哪些报表使用了哪些标签,这样一来就可以根据报表名称快速排查哪些标签被使用了,要改的时候也知道要改哪些标签。


更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)

如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。


微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换的更多相关文章

  1. 微软BI 之SSRS 系列 - 如何让报表在一页显示,两种常用的技巧

    通常情况下,SSRS 报表在页面内容过多的时候会自动分页.但有的时候当页面内容不是很多,大概最多2页的情况下,或者客户要求所有内容必须在一页显示时,应该如何设置. 实际上,要考虑两种情况:第一种情况是 ...

  2. 微软BI 之SSRS 系列 - 如何实现报表导航 Navigation 和钻取 Drill Down 的效果

    开篇介绍 如何在 SSRS 报表中实现标签导航 Navigation 和向下钻取 Drill Down的效果? 如同下面这个例子一样 - 在页面第一次加载的时候,默认显示是全部地区的销售总和情况,上面 ...

  3. 微软BI 之SSRS 系列 - 巧用 RunningValue 函数在分组中排序并设置 RANK 排名

    开篇介绍 经常有像类似于这样的排序需求,以及设置分组下的排序序号.比如此图中要求城市 City 在省份下按照 Internet Sales Amount 总销售额进行排序,并标识在各省份下的排名. 实 ...

  4. 微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计

    来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现?   SSRS 2008.2 ...

  5. 微软BI 之SSRS 系列 - 报表邮件订阅中 SMTP 服务器匿名访问与 Windows验证, 以及如何成功订阅报表的实例

    这篇文章源于在上一篇博文中有园友提出订阅 SSRS 报表时的一个问题,  于是就好好总结了一下,把有关 SSRS 报表订阅的要点和容易出现问题的地方写出来,希望对大家有所帮助! 参看上一篇博文 - S ...

  6. 微软BI 之SSRS 系列 - 在 Cube 中通过 MDX 查询实现基于父子递归关系的汇总报表

    之前我写了一篇在 SSRS 开发中处理这种父子关系的汇总与聚合的文章 (SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表),示例中的查询是基于 SQL Server 关系型 ...

  7. 微软BI 之SSRS 系列 - 基于时间段参数的 MDX 查询以及时间日历 Date Picker 的时间类型参数化

    今天在天善问答里看到一个问题,如果我没有理解错的话,它应该是指比如在一个报表中选取一个时间段,然后求出这个时间段的某个 Measure 的 SUM 和.并且同时求出这两个时间点对应的上一年的时间点之间 ...

  8. 微软BI 之SSRS 系列 - 使用带参数的 MDX 查询实现一个分组聚合功能的报表

    基于数据仓库上的 SSRS 报表展示,一般可以直接通过 SQL 查询,存储过程,视图或者表等多种方式将数据加载并呈现在报表中.但是如果是基于 Cube 多维数据集的数据查询,就不能再使用 SQL 的语 ...

  9. 微软BI 之SSRS 系列 - 使用 LookupSet 和 Adjacent Group 等高级技巧在报表中跨 Dataset 分组查询

    SSRS 报表中有一些高级的技巧,平常很少用到,下面我通过这个案例来展现一下如何在实际开发中使用它们,并且如何解决一些实际的需求. 这张报表分别统计了不同的 Product 产品在不同的月份的 Ord ...

随机推荐

  1. TStream实现多表提交

    TStream实现多表提交 function TynFiredac.SaveDatas(const ATableName, ATableName2: string; ADeltas: TStream; ...

  2. Unity5.x shader打包AssetBundle总结

    最近比较忙,好久没有更新博客了,新项目切换到unity5.x后使用了新的打包机制,在打包shader的时候遇到了一些问题,这里来记录一下吧. 在上一个项目中,我们使用unity4.7,对于shader ...

  3. 将CAGradientLayer当做mask使用

    将CAGradientLayer当做mask使用 效果 源码 https://github.com/YouXianMing/Animations // // CAGradientView.h // M ...

  4. 使用 STHTTPRequest 框架解析 Soap1.2 教程

    1.STHTTPRequest框架地址 https://github.com/nst/STHTTPRequest 将 STHTTPRequest .h  STHTTPRequest.m 文件拖入工程中 ...

  5. android BitmapDrawable的使用

    <span style="font-size:18px;"> //功能:显示缩略图,大小为40*40 //通过openRawResource获取一个inputStrea ...

  6. vim去除行显示;vim全部复制命令

    行显示和隐藏: set nu set nu! 直接上命令: ggVG*y 解释一下上面的命令: ggVG   ——全选 *y  —— 复制到剪贴板 gg 是光标定位到文件首行 V  是进入可视模式 G ...

  7. 突发奇想之:源码及文档,文档包括源码---xml格式的源码,文档源码合并;注释文档化,文档代码化;

    目前源码和文档一般都是分开的,我在想为什么 源码不就是最好的文档么? 但是一般源码都是文本text的,格式化需要人为统一规范,所以源码中的文档在现实中不是那么的易于实践. 而且 源码 不能包括图片.附 ...

  8. C++对带有分隔符的字符串 分割为数字的通用解决方案

    需求: 数据库取出的字段类似于 "1,3,4" 然后用数字处理后,,比如 "1,2,3" 再存回去 #include<stdio.h> #inclu ...

  9. rank,dense_rank,row_number使用和区别

    rank,dense_rank,row_number区别 一:语法(用法):     rank() over([partition by col1] order by col2)      dense ...

  10. c++字符串split 函数实现

    - 经常遇到字符串分割问题,但是相对于c++而言实现比较麻烦,直接遍历一遍也很冗余 - 另外也适用于,在字符串中找到某个字符的所有位置 //函数功能:将输入字符串s,以字符串c(;)进行拆分,拆分结果 ...