本文转自:http://www.cnblogs.com/waxdoll/archive/2006/09/02/493350.html

Crystal Report在报表向导中提供了三种向导类型给用户进行选择——Standard、Cross-Tab和Mail Label,而Visual Studio/BIDS报表向导只有两种——表格格式和矩阵,这是和Crystal Report的前两种报表类型相对对应的,那么怎么在Visual Studio/BIDS中实现Mail Label呢?

先来看一下什么是Mail Label。Mail Label如果直译成中文的话,就是“邮件标签”,这是一个有歧义的名词,一些邮箱(如Gmail)和客户端邮件工具(如Foxmail)将“邮件标签”作为一种将邮件进行分类以方便信息管理的工具。而本篇随笔讨论的显然无关“电子”邮件,而是一种比较常用的报表。设想如下的场景:如果一个组织(比如一家出版社)需要向一批客户发一份比较正式的书面信件(比如征订启事)。而这些客户的通信地址、收件人邮政编码等又以某种形式(数据库、平面文件等)存储在计算机中,工作人员显然不希望在每一个信封上手工书写这些信息,他/她要做的无非是把这些打印出来并粘贴到信封上就可以了。这样的话,一个普通的报表也可能就已经能够满足他/她的需求了,尽管我们知道邮政编码、通信地址、收件人三个字段之间是需要换行的。但是,如果他/她恰巧使用的是常见的如A4之类的纸张,而同时他/她又不希望浪费纸张,那么他/她希望要的报表可能就是如图1所示的报表了。这就是所谓的“邮件标签”报表了,当然“邮件标签”报表不仅仅局限于多个信件通信地址的一次打印,凡是具有类似结构的报表都可以被称为“邮件标签”报表。

图1 Access的Northwind示例数据库中的“邮件标签”报表(点击小图看大图)

正如图1的标题所示,Access是支持“邮件标签”报表的,不过在报表设计上只是让标签中涉及到的字段纵向排列而已,真正实现多列标签打印是通过对报表的“页面设置”来完成的,如图2所示。


图2 Access中“邮件标签”报表的“页面设置”

在进行报表设计之前,我们先为本文的邮件标签进行数据准备。本文的示例报表的数据来源于SQL Server 2005的示例数据库AdventureWorks,在AdventureWorks数据库中使用以下SQL语句建立视图Production.MailLabel:

代码1:创建视图Production.MailLabel USE [AdventureWorks] GO /**//****** 对象:  View [Production].[MailLabel]    脚本日期: 08/26/2006 16:05:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW [Production].[MailLabel] AS SELECT     Production.Product.Name, Production.Product.Color, Production.ProductPhoto.ThumbNailPhoto FROM         Production.Product INNER JOIN                       Production.ProductProductPhoto ON Production.Product.ProductID =  Production.ProductProductPhoto.ProductID INNER JOIN                       Production.ProductPhoto ON Production.ProductProductPhoto.ProductPhotoID =  Production.ProductPhoto.ProductPhotoID WHERE     (Production.Product.Color IS NOT NULL) GO

打开视图,我们可以得到如图3所示的示例数据,这将是本文示例所使用的报表数据。

图3 示例使用数据

也就是说,本文的示例演示的邮件标签中展示的数据是AdventureWorks生产的自行车的名称、颜色以及缩略图。

既然是邮件标签,我们要将Name、Color以及ThumbNailPhoto这三个一行中字段纵向显示,这个比较容易实现;我们还需要将指定行数的数据作为一列显示在报表中,这就涉及到行到列的转换问题。事实上,可以说行列转换问题是邮件标签报表面临的最大的问题,要解决这个问题,一种可行的方案是使用SQL语句中出现在FROM子句中的PIVOT关系运算符将表结构进行转换,然后使用Table控件显示数据。另外,我们知道标准控件中的Matrix控件的功能其实就是一个Pivot Table(数据透视表),我们可以清楚地在控件工具栏上看到对Matrix控件的提示是“用于任何多列样式报表的行列布局”,该控件对数据的处理其实是和PIVOT运算符是相通的,就是说使用该控件可以避免使用PIVOT运算符而实现一个交叉表的结构,所以本文选择使用这种方案来实现邮件标签报表。

1、创建报表服务器项目RDLML。

2、新建共享数据源DataMailLabel,设置到数据库AdventureWorks的连接,并为报表指定相应的访问凭据。

3、不使用向导新建报表rptMailLabel,在报表设计器的“数据”选项卡,新建数据集MailLabel,使用工具栏按钮切换到通用查询设计器,在“关系图”窗格中使用右键菜单“添加表”并选择视图Production.MailLabel,选择Name、Color、ThumbNailPhoto三列作为输出,这样我们在SQL窗口中可以看到以下SQL语句:

代码2:选择数据的SQL语句 SELECT      Name,      Color,      ThumbNailPhoto FROM Production.MailLabel

4、在SQL窗格中修改代码2中的SQL语句如代码3所示。

代码3:修改代码2得到的SQL语句 SELECT      (ROW_NUMBER() OVER (ORDER BY Name) - 1) / 4 + 1 AS TitleRow,      (ROW_NUMBER() OVER (ORDER BY Name) - 1) % 4 + 1 AS TitleColumn,      Name,      Color,      ThumbNailPhoto FROM Production.MailLabel

代码3中,ROW_NUMBER()用于为返回数据的行号,需要和OVER关键字结合使用,使用OVER关键字可能会导致图4所示提示信息的出现,这是由于通用查询设计器不支持OVER关键字所导致的,而事实上T-SQL是支持该关键字的,可以忽略此信息的出现。

图4 使用OVER关键字出现的提示信息

代码3选择出的数据如图5所示。

图5 代码3选择出的数据

5、按照图6的方式进行报表布局设计。

图6 报表布局设计

其中,拖动图像控件到报表布局时会出现“图像向导”,在“选择图像源”页面中选中“数据库”,并在接下来的“指定图像字段”页面中,进行如图7所示的设置。

图7 指定图像字段(点击小图看大图)

6、选中值为“=Fields!TitleRow.Value”的文本框,右键“属性”,在“文本框属性”对话框的“可见性”选项卡中,选择“初始可见性”为“隐藏”,同样设置值为“=Fields!TitleColumn.Value”的文本框。

7、为了明显区分邮件标签列表中的各个项目,可以选中列表框控件,F4调出属性浏览器,设置BorderColor为LightGray,设置BorderStyle为Dashed;另外,为了使报表看起来更美观,可以在列表框中微调控件的位置。

OK,到此为止,一个邮件标签报表就设计完成了,其预览效果如图8所示。

图8 预览效果(点击小图看大图)

至于在这些步骤中隐藏的设计思路,请朋友们自己总结。

DEMO下载

感谢jimmyhell在本Blog的评论,是他提出了这个问题,不然我不会想到要去做一个邮件标签报表,谢谢!

Life is like a boat, and I'm at sea.

[转]RDL(C) Report Design Step by Step 3: Mail Label相关推荐

  1. RDL(C) Report Design Step by Step 3: Mail Label

    RDL(C) Report Design Step by Step 3: Mail Label Crystal Report在报表向导中提供了三种向导类型给用户进行选择--Standard.Cross ...

  2. RDL(C) Report Design Step by Step 2: SubReport

    RDL(C) Report Design Step by Step 2: SubReport 前两天,有网友在Blog上评论要求将子报表的配置贴出来,由于这两天有些别的事情,所以耽搁了:另外,自己也比 ...

  3. RDL(C) Report Design Step by Step 1: DrillThrough Report

    RDL(C) Report Design Step by Step 1: DrillThrough Report 前一段时间,发了几篇关于RDLC报表的随笔,由于这些随笔中没有关于报表设计方面的内容, ...

  4. RDL(C) Report Design Step by Step

    RDL(C) Report Design Step by Step 1: DrillThrough Report 前一段时间,发了几篇关于RDLC报表的随笔,由于这些随笔中没有关于报表设计方面的内容, ...

  5. (转 蜡人张)RDL(C) Report Design Step by Step 1: DrillThrough Report

    前一段时间,发了几篇关于RDLC报表的随笔,由于这些随笔中没有关于报表设计方面的内容,于是不少网友和我联系,问了一些关于报表设计方面的问题,最近准备写几篇关于RDLC报表设计的随笔. 这篇随笔主要描述 ...

  6. Design POX controller step by step

    Design POX controller step by step In this article, I'll describe how to understand the POX controll ...

  7. 数据库设计Step by Step (10)——范式化

    引言:前文(数据库设计Step by Step (9)--ER-to-SQL转化)讨论了如何把ER图转化为关系表结构.本文将介绍数据库范式并讨论如何范式化候选表.我们先来看一下此刻处在数据库生命周期中 ...

  8. 数据库设计Step by Step (9)——ER-to-SQL转化

    2019独角兽企业重金招聘Python工程师标准>>> 引言:前文(数据库设计 Step by Step (8)--视图集成)讨论了如何把局部ER图集成为全局ER图.有了全局ER图后 ...

  9. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core-使用.Net Core + Entity FrameWor ...

  10. python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输 ...

最新文章

  1. XingXingMVC页面跳转处理
  2. 超融合服务器虚拟化优缺点,超融合是什么 意思?为什么必须是软硬件一体?...
  3. python代码案例详解-Python之入门基础字典案例详解,新手必学
  4. Android学习视频
  5. 解决nginx+php二级页面显示空白的问题
  6. AlertDialog(对话框)的基本使用
  7. android音乐编辑器汉化版,WaveEditor手机版
  8. 高并发学习(二)安全发布对象/不可变对象/线程封闭
  9. 如何在 ASP.Net Core 中使用 MiniProfiler
  10. linux网络编程之广播详细代码及文档说明 -,Linux网络编程之广播
  11. 观察者模式-Observer Pattern
  12. html自定义js程序,JS中微信小程序自定义底部弹出框
  13. 第一个OpenCV读取图像并显示
  14. 29_海星资讯9月29日报
  15. UAC在注册表中的对应位置
  16. 2016TI杯——寻迹小车
  17. 开机自启动——修改注册表
  18. 时隔三月,再次向你推荐这款公文排版插件
  19. java版12306抢票_J12306
  20. 在Excel中选取一行中的最大数值进行标题匹配

热门文章

  1. Spring Boot 2.1.2配置文件参考配置项官方谷歌翻译版本
  2. 响应式 BootStrap 媒体查询 栅格 组件 scss
  3. CentOS7.X安装部署Glassfish4.1.2
  4. 小学计算机课题研究方案,小学语文课题研究方案
  5. linux内存高但是top进程不高,在Linux中通过Top运行进程查找最高内存和CPU使用率...
  6. C++ 学生信息管理系统课程设计报告
  7. token 自动续期的方案
  8. 当div的宽度为百分比时,如何设置成为一个正方形?
  9. 填核酸采样资料,手机号填错了,身份证号码没错。
  10. 性能调优需要考虑的三大方面