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所示。

转载于:https://blog.51cto.com/zhjjzhjj/469078

报表中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. 报表中表达式的全局集合(Visual Studio 报表设计器)

    为在 ReportViewer 控件中处理的报表定义编写的表达式可包含对全局对象集合的引用.有五种全局对象集合可供使用:Fields.Globals.Parameters.ReportItems 和 ...

  3. python中label函数_图像分析函数:skimage.measure中的label、regionprops

    算法解释详细,有算法执行过程动态GIF图的:https://blog.csdn.net/icvpr/article/details/10259577 算法文字解释的简介易懂的:https://www. ...

  4. c语言向表格内存入数据,怎么实现横向到存入多个单元格,在列数固定的报表中逐格横向填充数据并折行...

    在很多需要打印的报表中,受限于纸张的大小,往往会限制行数或者固定列数.我们在<单据类报表的制作>一文中,曾经介绍了限制了行数的情况如何实现,现在,我们再来看一下,在固定了列数的情况下,如果 ...

  5. 填报表中也可以添加 html 事件

    在实际的项目开发中,填报表的应用十分广泛. 多数情况下,填报表会作为整个项目的一部分配合需求灵活使用,但有时也会受大项目环境的影响,产生一些特别的要求.比如,通常报表单元格的数据类型大多是文本,有时却 ...

  6. 使用ROW_NUMBER 和partition by 解决报表中的查询问题

    在报表中遇到一个查询问题: 原始数据如下: Id cust_id call_date call_result 1 1 2012-03-15 09:00:00 fail 2 1 2012-03-15 0 ...

  7. SAP MM ME81N PO Value Analysis报表中Net Value 为负数是怎么回事?

    SAP MM ME81N PO Value Analysis报表中Net Value 为负数是怎么回事? ME81N 报表中,如下PO的net value为负数, 怎么回事? 经查这些PO都是退货采购 ...

  8. SAP MM 采购报表中Delivery Date的显示

    SAP MM 采购报表中Delivery Date的显示 经反复研究与测试,得知ME2L/ME2N/ME2M等报表是无法很友好的显示Delivery Date. 以ME2L为例, Scope of l ...

  9. 报表中利用隐藏列对扩展格显示值求和

    在润乾报表中,获取报表中单元格显示值的函数是disp(),然而这个函数却无法计算扩展单元格的显示值.从而无法直接对扩展个显示值求和. 在下图中,需要计算D3单元格的显示值之和. D3值为:ds1.再订 ...

最新文章

  1. 面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!
  2. python迷宫小游戏大全_C课程设计迷宫小游戏
  3. Undo TableSpace ②.回滚段研究
  4. Windbg学习 (0x0001) 安装与基本配置
  5. 文件上传案例优化(文件命名循环接收多线程提高效率)
  6. 解决Ubuntu 16.04下提示boot分区空间不足的办法
  7. junit 测试 dao_JUnit测试Spring Service和DAO(带有内存数据库)
  8. 【qduoj】最长公共子串
  9. 重磅发布!36氪中国新基建之王「大数据领域」TOP50企业揭晓
  10. 128x64液晶驱动(添加详细)
  11. tkinter 实现简单登录窗
  12. 模拟人生 4:如何在游戏中生成收藏品
  13. EasyCVR通过Ehome协议接入设备,获取RTSP流地址异常如何解决?
  14. word中写出打对号的框
  15. 如果你35岁恐慌了,那你真的该反思自己了···
  16. linux启动分区丢,Linux装机因为分区丢失引导解决办法
  17. 数列 COGS1048:[Citric S2] 一道防AK好题
  18. c--scanf()函数详解
  19. 基于DSP/BIoS设备驱动模型的视频驱动程序开发
  20. ORACLE sqlplus命令

热门文章

  1. html 怎么显示在投影下面,投影仅底部css3
  2. Golang——数据类型转换(Sprintf、Format、Append方式转换)
  3. 给图片下方加水印_别再看不起美图秀秀啦,想要做长图,批量加水印,用它超级方便...
  4. 外星人台式机无盘服务器,可以拎走的“台式机” Alienware Area-51m评测
  5. java selenium教程_Selenium3 Java自动化测试完整教程
  6. rpm的mysql安装_MySQL 5.7.22 rpm 安装方式
  7. Java为xml跟节点添加子节点_如何将xml节点作为第一个子节点插入Java中的另一个xml文档中?...
  8. 物联网生态品牌白皮书
  9. 输出平均成绩最高的学生成绩以及该学生的序号
  10. 十三种技术文档模板_在线文档,知多少?