Reporting报表开发知识合并[个人原创]

时间:2024-01-25 07:05:59

Reporting报表开发知识合并[个人原创]

[个人原创] ,转发请声明原文链接

了解

a)      SSRS全称 SQL Server Reporting Services,是依赖于数据库运行的,是微软开发的重量级别的BI产品

b)      上手容易,开发简单,有数据库服务器就可以了,不需要依赖于IIS运行

c)      可扩展性比较低, 对比那些其他报表来说,确实比较好

d)      可独立的在SqlServer服务器上运行,也可以内嵌到项目中

 

报表结构

通过查看Reporting的报表,一个完整的报表,包含报表的一些配置(默认字体样式,自动刷新,语言,容器空白,报告单元类型,报表ID),数据源,数据集,报告部分(相当于容器),报表参数,报表参数布局这几个主要组成部分,根据报表样式的不同会有不同的组成部分,比如在报表中内嵌了一个图片,那么会多一个内嵌式图片的结构

 

报表版式

限于页眉页脚的数据,不能用于主体,比如页码,会导致报表报错

 

  在报表数据的内置字段,是全部可以放在页眉和页脚中,部分可以放在主体中

限于主体的数据,不能直接放在页眉和页脚,可以通过聚合来实现现在在页眉,比如求和,平均值等等

 

  在分组数据中,不能直接放到页眉和页脚,可以对分组进行分页,然后显示First(字段名)显示到页眉页脚中

 

 

 

 

 

报表样式

  下面是分页报表的所有布局控件

  

 

 

 

 

开发工具

a)      开发报表有两种方式。一种是SSRS,这个是利用报表服务直接创建报表;另外一种是SSDT,是独立的开发工具,

 

b)      在SqlServer2012版本以前(包括SqlServer2012),安装数据库的时候可以安装SQL Server Business Intelligence Development Studio和Sql Server Reporting Service. 在SqlServer 2012以后,SSDT是需要独立安装的

 

 

配置SSRS

a)      先配置SSRS服务器,打开Reporting Server 配置管理器,选择报表服务器实例

 

 

b)     配置本地服务器,用内置账户就可以了,要是给别人用的,选择配置其他账户,在其他账户里,注意用户名是域/用户名的格式,不知道是什么的可以看看你的系统说明,保存秘钥,确认

 

 

c)      选择Web服务URL点击高级,可以添加,可以修改

 

 

d)     更改数据库, 本地服务器的话,默认就好,远程服务器的话,需要报表模式为Sql账户,凭据也是

 

 

e)      Web门户URL: 是你SSRS报表管理页面的配置,配置完成的话,现在就可以访问了

创建一个简单的报表

SSRS方式

                i.          打开你的SSRS管理页面,在右上角点击加号(新建)新建文件夹与报表,在SqlServer2012之前,点击添加报表,在2016以及2016之后,区分了移动报表,分页报表

               ii.          点击加号(新建),可以新建文件夹,KPI报表,移动报表,分页报表,数据源,数据集

       

 

              iii.          分页报表

              iv.          新建分页报表会打开Reporting Builder,没有的话在弹出的页面选择获取Reporting Builder;

               v.          在Reporting Builder首先会给你弹出一个向导,有表格矩阵,图表,地图向导,空白报表

       

 

              vi.          首先,选择创建数据集(可以使用共享数据集),

            vii.          然后,创建数据源,点击新建,输入连接字符串,或是生成字符串

           viii.          第三步,通过Sql完成数据集的创建,可以通过可视化操作,也可以点击编辑为文本输入sql

(在这里需要的是,字段名称不能有重复的,不能同时写两个以上的查询语句或不能包含函数操作类的语句)

              ix.          第四部,分组

      

 

               x.          第五步:选择布局

              xi.          SqlServer2012之前会有第六步选择样式外观

            xii.          最后点击完成,这样,一个最简单的报表就出来了

SSDT方式(支持中文)

           xiii.          Sqlserver2012(包含)之前的版本,打开SQL Server Business Intelligence Development Studio,选择商业智能项目,创建报表服务项目

           xiv.          VS2017(包含)之后,打开VS,打开VS2017或VS2017 SSDT,选择商业智能项目,创建报表服务项目

你的电脑数据库为2016/2017的,VS为2017以下的,抱歉了,只能通过SSRS创建报表

            xv.          选择项目路径以及名称

           xvi.          打开解决方案资源管理器,右击报表,选择添加新报表

          xvii.          选择或新建数据源,点击编辑可以生成连接字符串

        xviii.          输入查询的sql语句

           xix.          选择表格或矩阵

            xx.          分组

           xxi.          输入报表名称

报表数据

a)     报表数据在窗口的左侧,要是找不到了,没关系,在工具栏-视图-最下面的报表数据

 

 

 

b)     在实际工作中,我们有很多要带条件的报表,这就是报表参数

报表参数在Report报表中生成一个供用户输入数据的框,比如下面这个例子

 

 

 

参数对接到Sql,在Sql中就是不带声明的局部变量

SELECT @NAME NAME,@SEX SEX,@AGE AGE,@LIKE [LIKE],@BRITHDAY BRITHDAY

报表分组分页

分组

a)     在Report中,分组方式有行组和列祖,一般的分组分页指的是行组

以下方数据做分页报表

 

 

b)     通过创建报表导航添加报表分组,SSRS分组和SSDT分组通过导航分组的时候有点差异,需要区别一下

          xxii.          SSDT方式

  1. 选择表格

 

 

 

  1. 把相应的字段放入对应的位置中

 

 

  1. 选择样式和是否包含小计

  

 

        xxiii.          SSRS通过导航来分组

  1.  输入Sql,然后把字段放入对应的字段(SSRS没有直接的分页)

 

 

c)     高手操作手动分组

                i.          上面的分组是最简单的,一下才是分组分页的核心

               ii.          下面是对报表数据的分组分页,先展示一下分组前的报表

 

 

              iii.          右击表格左框,点击添加组

 

 

在这里看到了有子组和父组,子组是在当前下的组内部的数据再次分组;

父组是对于一类型的数据放在一起组合起来的分组

              iv.           因为我们是要从小往大分,对于苹果,香蕉这一类的数据进行分组,所以点击添加父组

               v.           在分组依据中选择对应的分组字段 CLASS3,添加组尾以方便我们显示小计

组头相当于表格的标题头,组尾就是表格最后用于汇总的尾

 

 

 

 

              vi.          分组效果如下

 

 

            vii.          组内排序

 

 

分页

分页是在分组属性中选中分页符,勾选分页,那么一组就会分一页

常用的报表函数

时间日期类

                i.          获取当前时间日期,Now(),使用方法 =Now()

               ii.          获取当前日期,Today() 例子: =Today()

              iii.          格式化字符串,Format(时间,格式) 例子:=Format(Now(),”MM/dd/yyyy hh:mm:ss tt”)

数学类

                i.          加减乘除  +  -  *  /

               ii.          列(组)求和Sum() 例子 =Sum(Parameters!Quantity.Value)

              iii.          列(组)平均值Avg() 例子 =Avg (Parameters!Quantity.Value)

              iv.          列(组)最大值最小值 例子 =Max(Parameters!Quantity.Value)

=Max(Parameters!Quantity.Value)

               v.          求余 Mod 例子 = 5 Mod 2

 

              vi.          列(组)第一个值First() 和 最后一个值Last() 例子

=First(Parameters!Quantity.Value)

=Last(Parameters!Quantity.Value)

            vii.          计数Count()和CountDistinct()

记录数据的数量,包含重复不包含NULL的 Count()

记录不重复数据的数量,不包含NULL的CountDistinct()

表格类

                i.           行号 RowNumber() 返回当前组内第几条数据

               ii.           报表开始运行时间 Globals!ExecutionTime

              iii.           报表总页码 Globals!OverallPageNumber ,只能用于页眉和页脚

              iv.           当前页码 Globals!PageNumber,只能用于页眉和页脚

流程

                i.          判断 IIF

IIF(1>2,”正确”,”错误”)

               ii.          流程控制

Switch(Fields!FirstName.Value = “Sue","Susan",

Fields!FirstName.Value = "Bob","Robert")

字符串处理

                i.          字符串切割 Split()函数

a)     返回包含指定数量子字符串的以零为基的一维数组。

b)     常用成员

                         i.          获取切割后返回数组中某个下标值的Value值  GetValue(下标值)

例子: = Split(“12^34^56”,”^”). GetValue(0)   返回值为 12

                        ii.          获取切割后返回数组的长度 Length

例子: = Split(“12^34^56”,”^”). Length    返回值为 3

 

支持的Html元素

在Report报表中支持部分的html元素的显示

标签

                i.          支持常用的标签

<b>b</b> <p>p</p> <h1>h1</h1> <h2>h2</h2> <h3>h3</h3> <h4>h4</h4> <h5>h5</h5> <h6>h6</h6> <span>span</span> <strong>strong</strong> <i>i</i> <div>div</div> <a href=>a</a> 等等

支持ul li 无序列表

支持ol li 有序列表 不支持定义样式

不兼容自定义列表

               ii.          不支持表单类标签

不支持 table tr td 标签

不支持 from 等等

 

样式

              iii.          支持常用的字体样式,

比如字体加粗,字体倾斜,字体颜色

              iv.          不支持块元素样式

比如边框,图片,背景色,宽高

 

Report支持VB语言

报表中插入代码

在报表外空白处右击,选择报表属性,

 

 

点击代码,输入代码

 

 

 

代码例子

切割字符串代码,第一个参数要切割的字符串,第二个参数要分割的分隔符,第三个是下标值,

 

Function SplitStr(Str As String, S As String, Index As Int32) As String

    Dim Temp

    Temp = Split(Str, S)

    Dim Len

    Len = UBound(Temp) - LBound(Temp) + 1

    If Len <= Index Then

        Return ""

    End If

    Return Temp(Index)

End Function

 

在报表中调用代码

在报表中使用代码是 Code.代码方法名(参数para)

 

 

 

报表图片

支持的格式

Report仅支持 image/bmp,image/jpeg, image/gif, image/png和image/x-png格式

其他格式的图片会无法识别

图片的使用

添加外部图像

外部图像就是通过地址来访问的图像,外部图像可以存在于报表服务器上,也可以存在于其他网站上.url支持 http://,https://,ftp://,file,mailto

 

操作:

  1. 右击报表设计视图,选择 ”插入” – “图像”
  2. 在图像选项的”常规”中,输入图像名称,选择”图像源”为”外部”
  3. 在使用此图像中输入url
  4. 设置其他属性

 

  1. 点击确定

 

  1. 调整大小

在报表中嵌入图像

嵌入图像是直接把图片转换成base64直接内嵌到Report中,会增大报表的文件大小

 

 

操作:

  1. 右击报表设计视图,选择 ”插入” – “图像”
  2. 在图像选项的”常规”中,输入图像名称,选择”图像源”为”嵌入”
  3. 在使用此图像后面点击导入
  4. 悬着你要导入的图片
  5. 设置其他属性
  6. 点击确定
  7. 调整大小

 

 

导入后的图片存放于报表内部的EmbeddedImage 的节点下

      

通过数据库导入图片

注意:这个方式只支持base64字符串的,而且不包含base64数据头的

 

 

操作:

  1. 右击报表设计视图,选择 ”插入” – “图像”
  2. 在图像选项的”常规”中,输入图像名称,选择”图像源”为”数据库”
  3. 在使用此字段后面选择字段
  4. 在使用此MIME类型后面选择base64的图片格式

 

  1. 悬着你要导入的图片

 

  1. 设置其他属性

 

  1. 点击确定

 

  1. 调整大小

 

 

条形码

使用第三方控件

查阅了国内外大多数网站,Reporting 报表条形码控件做的不错的是Barcode Professional for Reporting Services

下载安装好后再SSDT工具栏添加安装后得到的Dll文件,这时,工具箱里会多一个Barcode Professional for Reporting Services,拖进报表中就可以使用了

使用条形码字体

这里使用了最常用的Code128,由于完整的Code128包括头尾和校验码,所以对数据进行处理

处理数据的Code128 代码

Public _evenRow As Boolean

 

Public Function EvenRow() As Boolean

   _evenRow = Not _evenRow

 return _evenRow

End Function

 

Function Azalea_Code_128_A(ByVal yourData As String) As String

' C128Tools 16mar09 jwhiting

' Copyright 2009 Azalea Software, Inc. All rights reserved. www.azalea.com

 

' Creating a Code 128 code set A barcode in Excel 2003

' Your input, yourData, is a string to be encoded as a Code 128 code set A symbol.

' yourData must be the Code 128 code set A character set. Input error checking is your responsibility.

 

  Dim temp As String                 ' a temporary placeholder

  Dim chunk As String                ' loop chunk

  Dim i As Integer                   ' our loop counter

  Dim checkDigitSubtotal As Integer  ' a check digit throwaway

  Dim e As Integer                   ' a placeholder variable

   

  ' seed the variables

  temp = Chr(181)                   ' code set A start glyph

  checkDigitSubtotal = 103                ' code set A start checkdigit value

 

  ' map the input string into the C128Tools character set

  For i = 1 To Len(yourData) Step 1

    chunk = Mid(yourData, i, 1)

    Select Case Asc(chunk)

      ' map from above ASCII 182 placeholders to the font's character assignments

      Case Is > 95

        temp = temp & Chr(Asc(chunk) - 66)

      Case Is = 32 ' move the space character

        temp = temp & Chr(206)

      Case Else

        temp = temp & chunk

    End Select

  Next i

 

  ' Calculate the Code 128 mod 103 check digit

  For i = 1 To Len(yourData)

    e = Asc(Mid(yourData, i, 1)) - 32

    If e <> 142 Then

      checkDigitSubtotal = checkDigitSubtotal + (e * i)

    End If

  Next i

  checkDigitSubtotal = checkDigitSubtotal Mod 103

 

  ' Put together the final output string

  ' code set A start bar, the encoded string, check digit, stop bar

  Select Case checkDigitSubtotal

    Case 0

      ' Mark Presley bug fixed 19jan09

      Azalea_Code_128_A = temp & Chr(206) & Chr(196)

    Case 1 To 93

      Azalea_Code_128_A = temp & Chr(checkDigitSubtotal + 32) & Chr(196)

    Case Is > 93

      Azalea_Code_128_A = temp & Chr(checkDigitSubtotal + 103) & Chr(196)

  End Select

 

  ' The output, Azalea_Code_128_A, needs to be formatted in one of Azalea Software's Code 128 fonts.

 

  ' Excel: B1=Azalea_Code_128_A(A1)

  ' Or put another way, yourContainer.text=Azalea_Code_128_A(yourInputString)

 

End Function

 

Function Azalea_Code_128_B(ByVal yourData As String) As String

' C128Tools 29may12 jwhiting

' Copyright 2012 Azalea Software, Inc. All rights reserved. www.azalea.com

 

' Creating a Code 128 code set B barcode using C128Tools.

' Your input, yourData, is a string to be encoded as a Code 128 code set B symbol.

' yourData must be the Code 128 code set B character set. Input error checking is your responsibility.

 

  Dim temp As String                 ' a temporary placeholder

  Dim chunk As String                ' loop chunk

  Dim i As Integer                   ' our loop counter

  Dim checkDigitSubtotal As Integer  ' a check digit throwaway

  Dim e As Integer                   ' a placeholder variable

   

  ' seed the variables

  temp = Chr(182)                   ' code set B start glyph

  checkDigitSubtotal = 104          ' code set B start checkdigit value

 

  ' map the input string into the C128Tools character set

  For i = 1 To Len(yourData) Step 1

    chunk = Mid(yourData, i, 1)

    Select Case Asc(chunk)

      ' map from above ASCII 200 to the actual character assignments

      Case Is > 200

        temp = temp & Chr(Asc(chunk) - 35)

        ' The space character is at ASCII 194 because TrueType

        ' doesn't allow a glyph in the ASCII 32 slot

      Case Is = 32

        temp = temp & Chr(206)

      Case Else

        temp = temp & chunk

    End Select

  Next i

 

  ' Calculate the Code 128 mod 103 check digit

  For i = 1 To Len(yourData)

    e = Asc(Mid(yourData, i, 1)) - 32

    If e <> 142 Then

      checkDigitSubtotal = checkDigitSubtotal + (e * i)

    End If

  Next i

  checkDigitSubtotal = checkDigitSubtotal Mod 103

 

  ' Put together the final output string

  ' code set A start bar, the encoded string, check digit, stop bar

  Select Case checkDigitSubtotal

    Case 0

      Azalea_Code_128_B = temp & Chr(206) & Chr(196)

    Case 1 To 93

      Azalea_Code_128_B = temp & Chr(checkDigitSubtotal + 32) & Chr(196)

    Case Is > 93

      Azalea_Code_128_B = temp & Chr(checkDigitSubtotal + 103) & Chr(196)

  End Select

 

End Function

 

Code 128字体的使用

从网上下载Code 128字体

 (公司内部文件,解压请联系)

 

报表 中的设置

 

  1. 调用Code128A的代码给数据添加头尾合校验码
  2.  

  b.设置字体为Code128,更改字体大小

 

 

需要注意的是,报表的语言不能为zh-cn,我直接给清空了

posted on 2019-07-30 13:01 linjierd 阅读(...) 评论(...) 编辑 收藏