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

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:

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语句:

SELECT
Name,
Color,
ThumbNailPhoto
FROM Production.MailLabel

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

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的评论,是他提出了这个问题,不然我不会想到要去做一个邮件标签报表,谢谢!

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

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

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

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

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

  3. RDL(C) Report Design Step by Step

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

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

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

  5. Design POX controller step by step

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

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

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

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

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

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

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

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

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

最新文章

  1. 【模拟退火】解决【TSP】问题
  2. 第五人格pcmac_第五人格:未上线,勘探员已经让庄园内的CP乱了分寸,祭司最绝...
  3. 转:iOS-CoreLocation:无论你在哪里,我都要找到你!
  4. 2k16显示miui停止服务器,MIUI11停止内测,MIUI12真的来了,与小米MIX4同天发布,与ios13一样流畅丝滑...
  5. 计算机操作系统原理教程与实训(目录)
  6. 6.6.1最优二叉树(赫夫曼树)
  7. navicat为什么收费,用的人还是不少
  8. 彩色手绘元宵节插画风素材图片
  9. 前端系统化学习【JS篇】:(四-1)基本数据类型之Number篇
  10. python循环怎么跳过开始循环,如果循环内部调用的函数执行时间太长,你怎么能跳过python中的循环迭代?...
  11. 运维架构师-并不遥远的彼岸
  12. 如何禁止特定用户使用sqlplus或PL/SQL Developer等工具登陆?
  13. ssm-学子商城-项目第十三天最后一天完成项目
  14. 批量部署windows和linux系统,使用Cobbler批量部署Linux和Windows:Windows系统批量安装(三)...
  15. mysql源码编译安装
  16. Linux下移动硬盘,创建windows,ntfs分区并挂载
  17. 用尽可能多的字数介绍Leaky ReLU激活函数
  18. hadoop之mapreduce教程+案例学习(二)
  19. 在线炒股天载分析市场呈现出一片跌势
  20. Python jupyter notebook Katex|Latex

热门文章

  1. zabbix-3.0.4安装部署
  2. Strike price
  3. 今天我开通了51cto的博客
  4. 如何优化WebAPP性能:从五个层面上彻底优化前端项目性能
  5. 面试官系统精讲Java源码及大厂真题 - 18 场景集合:并发 List、Map的应用场景
  6. Nginx根据路径设置静态资源
  7. Codeforces Round #617 (Div. 3) String Coloring(E1.E2)
  8. Linux系统学习 八、SSH服务—SSH远程管理服务
  9. 【Python】Python库之图形艺术
  10. C#LeetCode刷题之#633-平方数之和( Sum of Square Numbers)