65.9K
CodeProject 正在变化。 阅读更多。
Home

SSRS 中的多语言报表

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2009年3月31日

CPOL

4分钟阅读

viewsIcon

56350

介绍如何在 SSRS 中制作多语言报表

多语言标签

您可能已经知道,SSRS 本身并不支持多种语言。我即将演示的内容不适用于数据,仅适用于报表中预先填充的标签和文本。

我所做的是使用数据库驱动的报表文本。我用标签文本填充一个参数,然后使用代码检索标签。由于参数只不过是一个键/值列表,因此这种方法非常有效。通过在数据库中进行设置,您可以允许您的业务用户维护您的标签,并且如果您需要添加新语言,则无需对代码或报表进行任何更改!

首先,我创建一个主 Label 表。这将是我可以使用的标签列表。我还有另一个名为 Language 的表。该表显然包含我的可用语言列表。我还有一个名为 LabelText 的第三个表。该表包含将放置在报表上的不同语言的实际文本。

这是脚本

CREATE TABLE [dbo].[Label](
[LabelID] [int] IDENTITY(1,1) NOT NULL,
[Description] [varchar](900) NOT NULL)

CREATE TABLE [dbo].[Language](
[LanguageID] [int] IDENTITY(1,1) NOT NULL,
[Language] [varchar](100) NOT NULL,
[Active] [bit] NOT NULL)

CREATE TABLE [dbo].[LabelText](
[LanguageID] [int] NOT NULL,
[LabelID] [int] NOT NULL, 
[LabelText] [nvarchar](max) NOT NULL)

我将 LabelText 设置为 NVARCHAR 以支持 Unicode 字符集。

然后我使用我将需要在报表上的所有标签填充 Label 表。 这是一个简短的例子

71 % Total
75 Account
120 Address 1
121 Address 2
122 Address 3

我还使用可用语言填充 Language

1 English 1
2 Spanish 0

LabelText 表实际上完成了所有工作。 它包含所选语言的标签文本。

我很幸运,拥有非常好的软件开发背景,所以我创建了一个网页来填充这两个表和 LabelText 表。 我让业务部门填充此表,因为我对其他语言的掌握不是很好。

一旦这些设置并填充完毕,就该转向报表设计了。

创建一个名为 Languages 的数据集。 使用它来检索 Language 表中的行。

Select LanguageID,
Language
From Language
Where Active = 1

由于使用新语言填充所有标签可能需要一些时间,因此我们只想加载设置为 Active 的语言。 这为业务部门提供了加载文本的时间,而不会让用户在报表上选择该语言。

创建一个名为 Language 的参数。 使用 Languages 数据集中的值填充它。 如果需要,选择一个默认值。

现在创建一个名为 Labels 的数据集。 该数据集将从所选语言的标签文本中提取行

Select LabelID,
LabelText
From LabelText (NOLOCK)
Where LanguageID = @Language

union

Select LabelID,
LabelText
from LabelText lt (NOLOCK)
Where LanguageID = 1
and Not Exists ( Select 1
From LabelText z (NOLOCK)
Where LanguageID = @LanguageID
and z.LabelID = lt.LabelID)

此 SQL 提取所选语言的所有标签,然后,对于该语言中缺少的任何标签,联合语言 1 中的标签(在我的例子中,ID 1 是英语)。 这样,您将始终返回一个标签。

返回报表参数屏幕并创建一个名为 Labels 的新参数。 此参数应为内部、多值且为整数。

对于可用值,从 Labels 数据集填充,并对默认值执行相同的操作。 这为我们提供了一个填充了标签 ID 和文本的参数,默认情况下全部选中。 由于您只能在报表内部“看到”选定的参数值,而看不到填充的值,所以这是一个重要的步骤。

在报表属性窗口的“代码”选项卡下,添加类似于此的代码,以循环浏览 Labels 参数中选定的值,并返回传入的 ID 的文本。 由于此参数已加载翻译版本,因此这将填充您的标签。

Public Function GetLabel(Parm as Parameter, LabelID as Integer, _
                Optional AddColon as Boolean=False) as String

Dim t as Integer

For t = 0 to Ubound(Parm.Value)
   If (Parm.Value(t) = LabelID) Then
      if AddColon = true then
         Return Parm.Label(t) & ":"
      else
         Return Parm.Label(t)
      End if
   End if
Next t

Return ""

End Function

注意 AddColon 参数。 我把它放进去是因为我的报表中有很多字段的设置就像一个数据输入表单:Label: Value。 由于我不希望在每个文本框中键入 +":",因此我只是将其添加到例程中。 您可以在此处添加任意数量的自定义代码。 从长远来看,这将使您的工作更轻松。

最后一步是使用您的标签表作为查找 (我通常将其加载到 Excel 中并按字母顺序排序) 并将此公式添加到每个 label 文本框

=Code.GetLabel(Parameters!Labels, 105)

如果您需要冒号

=Code.GetLabel(Parameters!Labels,2, True)

就是这样! 现在您有了多语言报表标签! 我也有这方面的内容记录在我的 博客 上。

您可以在这里查看我的博客.

© . All rights reserved.