一、前言

最近做的项目需要单据批量打印的功能,优先想到用RDLC来实现。经过Visual Studio几个版本的发展后,RDLC愈发成熟,操作方式也变得简洁,相比vs2005的版本,有质的提升,不过仍有一下几点缺憾:

1、内置函数不支持C#,只支持Visual Basic

2、不支持Asp.net MVC,支持webForm和winForm

3、VS2008及以下版本开发WebForm时,不建议使用RDLC,因为生成的报表样式不兼容chrome浏览器。

如果未来时间充裕,我将会把RDLC一系列应用实例分享出来。闲话少说,言归正传。

二、测试数据

--订单表
create table fcwOrder
(
id int identity(1,1),
ordercode varchar(50),--订单号
ordername varchar(50),--订单名字
opername varchar(50),--经手人
comname varchar(50),--客户名称
createtime datetime,--订单日期
barcode image--条形码,预留字段。
)
--订单明细
create table fcwOrderDetails
(
id int identity(1,1),
ordercode varchar(50),--订单号
procode varchar(50),--产品编号
proname varchar(50),--产品名称
promodel varchar(50),--产品型号
pronum int --订购数量
)
--测试数据
insert into fcwOrder(ordercode,ordername,opername,comname,createtime) values('order001','订单一','张三一','客户一','2014-07-01')
insert into fcwOrder(ordercode,ordername,opername,comname,createtime) values('order002','订单二','张三二','客户二','2014-07-02')
insert into fcwOrder(ordercode,ordername,opername,comname,createtime) values('order003','订单三','张三三','客户三','2014-07-03')

insert into fcwOrderDetails(ordercode,procode,proname,promodel,pronum) values('order001','pro0011','产品一一','长1宽1',11)
insert into fcwOrderDetails(ordercode,procode,proname,promodel,pronum) values('order001','pro0012','产品一二','长1宽2',12)
insert into fcwOrderDetails(ordercode,procode,proname,promodel,pronum) values('order002','pro0021','产品二一','长2宽1',21)
insert into fcwOrderDetails(ordercode,procode,proname,promodel,pronum) values('order002','pro0022','产品二二','长2宽2',22)
insert into fcwOrderDetails(ordercode,procode,proname,promodel,pronum) values('order003','pro0031','产品三一','长3宽1',31)
insert into fcwOrderDetails(ordercode,procode,proname,promodel,pronum) values('order003','pro0032','产品三二','长3宽2',32)
insert into fcwOrderDetails(ordercode,procode,proname,promodel,pronum) values('order003','pro0033','产品三三','长3宽3',33)
--统一订单明细
select o.id as orderid,o.ordercode,o.opername,o.ordername,o.comname,o.createtime,o.barcode,
      d.id as detailid,d.ordercode detailordercode,d.procode,d.proname,d.promodel,d.pronum
      from fcwOrder o
      join fcwOrderDetails d on d.ordercode=o.ordercode

三、编码实现

提示:本案例是属于winform程序,原理上操作RDLC部分后台代码也可用于webform      开发环境:Visual Studio 2012 , Sql server 2012

1、【创建项目】打开VS2012,新建项目Fcw.RDLC

2、【创建数据集】右击项目“Fcw.RDLC”,添加新建项,选择数据集,创建数据集Order.xsd


3、【配置数据集】将工具箱中的TableAdapter拖入到数据集设计器中,配置数据库连接后,并将以下语句装载到表中:

select o.id as orderid,o.ordercode,o.opername,o.ordername,o.comname,o.createtime,o.barcode,
      d.id as detailid,d.ordercode detailordercode,d.procode,d.proname,d.promodel,d.pronum
      from fcwOrder o
      join fcwOrderDetails d on d.ordercode=o.ordercode

右键单击已经生成的TableAdapter,选择属性,将名称改为Order



4、【新建报表】,选择Fcw.RDLC,右键选择添加新建项,选择报表。创建order.rdlc

5、【配置报表数据源】双击打开Order.RDLC设计器,在报表数据源,点击新建---》数据集,选择已有的数据源或新建新数据源,名称也改成Order
6、【设计报表】将工具箱中的列表拖拽到rdlc界面设计器上,并指定列表的数据名称Order

6.1 选中列表,在行组中,用鼠标右键点击详细信息,添加组,父组。分组依据为ordercode (订单编号),右击ordercode分组,选中在组的各实例之间分页,作用是每个订单页显示。


6.2 删除自动添加的列ordercode及 详细信息组

6.3,依次拖入 表、文本框、图像,在报表数据源,新建参数。根据需求界面完成设计。
注:列表内默认包含矩形,也可以根据需要手动添加。矩形可实现循环数据内的排版。满足个性化需求。

7【winform代码】.winform 拖入ListBox,Button,ReportViewer等步骤,不再赘述。
ListBox的selectMode设为 MultiSimple,
为ReportView设定RDLC文件
重要代码:

private void Form1_Load(object sender, EventArgs e)
        {
            //绑定list_order
            DataTable dtorder = SQLHelper.GetDataTable(@"select o.id as orderid,o.ordercode,o.opername,o.ordername,o.comname,o.createtime,o.barcode  from fcwOrder o");
            list_order.DataSource = dtorder;
            list_order.DisplayMember = "ordercode";
            list_order.ValueMember = "ordername";
        }

private void button1_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            //构造多选的order列表
            foreach (object obj in list_order.SelectedItems)
            {
                DataRowView drv = (DataRowView)obj;
                if(drv!=null)
                {
                    sb.Append("'" + drv.Row["ordercode"].ToString() + "',");
                }
            }
            //为report绑定数据源
            if (sb.ToString().Length > 2)
            {

string orderwhere = sb.ToString().Substring(0, sb.ToString().Length - 1);
                string strsql = @"select o.id as orderid,o.ordercode,o.opername,o.ordername,o.comname,o.createtime,o.barcode,
      d.id as detailid,d.ordercode detailordercode,d.procode,d.proname,d.promodel,d.pronum
      from fcwOrder o
      join fcwOrderDetails d on d.ordercode=o.ordercode where o.ordercode in (" + orderwhere + ")";

DataTable dtorder2 = SQLHelper.GetDataTable(strsql);
                reportViewer1.LocalReport.DataSources.Clear();
                reportViewer1.LocalReport.EnableExternalImages = true;
                reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("Order",dtorder2));
                reportViewer1.LocalReport.SetParameters(new ReportParameter("para_Total",dtorder2.Rows.Count.ToString()));
                reportViewer1.RefreshReport();

}
        }

8、【最终效果】

 
 

四、总结

本篇文章从基础开始搭建一个基本的单据批量打印应用,涉及数据集的使用,RLDC中列表、表、文本框、矩形、参数、组分页的使用方式。

RDLC中表用来实现类似表格数据之类的需求,包含分组统计汇总、分页等。

文本框用来实现单个字段的显示或者用来处理部分线条等。

参数用来接收固定值。

矩形用来方便排版,当其他方式设计和最终呈现出现布局不同时,可用矩形把布局错乱的部分包围起来。

列表,可以用来处理循环中的单条数据下的各种样式排版。实现自定义需求。

传送门:批量打印单据批量单据打印

VS2012报表(RDLC)系列应用之单据批量打印的更多相关文章

  1. vs2017使用rdlc实现批量打印

    接着上一篇:上一篇写了安装,这篇直接搞定批量打印,A4纸横版竖版页面设计,正式开始.(我的表达不怎么好,我尽量发图片都是程序员一点就通) 一.界面展示 忽略界面设计丑 查看预览界面,因为有数据就不截全 ...

  2. 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器

    1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...

  3. RDLC系列之一 简单示例

    参照文章:http://www.cnblogs.com/waxdoll/archive/2006/07/24/458409.html#!comments 一.效果图

  4. 【MM系列】SAP里批量设置采购信息记录删除标记

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP里批量设置采购信息记录删除标记 ...

  5. RDLC系列之一 简介和入门

    一.简介 RDLC报表,通过Report Viewer Control来实现,制作微软RDLC报表由以下三部分构成:1.制作自己的DateSet集合(就是报表的数据集):2.制作自己的报表文件.rdl ...

  6. 润乾V4报表批量打印

     背景说明 在应用中,经常遇到,批量打印的需求,批量打印,顾名思义,就是点击一次打印按钮,能打印多张报表. 下面,我们来介绍一下怎么样实现批量打印的 应用举例: Jsp代码 <% //rep ...

  7. 个人永久性免费-Excel催化剂功能第50波-批量打印、导出PDF、双面打印功能

    在倡导无纸化办公的今天,是否打印是一个碍眼的功能呢,某些时候的确是,但对于数据的留存,在现在鼓吹区块链技术的今天,仍然不失它的核心价值,数据报表.单据打印出来留存,仍然是一种不可或缺的数据存档和防篡改 ...

  8. (转: daifubing的博客 )Delphi二维码中文支持、分组、批量打印经验小结

    一直也没接触到什么复杂的报表,都是一些简单的报表,在DelphI下使用QuickReport一般也就能满足需要了,由于公司现在需求的变化,对条码扫描提出了新的要求,主要是扫码要包含更多地内容,以前的一 ...

  9. winfrom 实现条形码批量打印以及将条形码信息生成PDF文件

    最近,老大让给客户做个邮包管理程序.其中,包括一些基本信息的增.删.查和改,这些倒不是很难搞定它分分钟的事.其主要难点就在于如何生成条形码.如何批量打印条形码以及将界面条形码信息批量生成以其各自的 b ...

随机推荐

  1. How Much Work Does it Take to be a Successful Mathematician?

    http://mathoverflow.net/questions/9799/how-much-work-does-it-take-to-be-a-successful-mathematician# ...

  2. linux下为php添加mongodb扩展

    基于本博客yum安装的lamp环境,phpize 位于 /usr/bin,php-config 位于/usr/bin,php.ini 位于/etc/ 1.首先从http://pecl.php.net/ ...

  3. 在 SUSE 11 sp2 上安装 freeradius

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  4. java泛型的讲解

    java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指 ...

  5. tomcat启动很慢的原因

    启动后tomcat显示的代码如下: 2014-4-3 10:50:15 org.apache.catalina.core.AprLifecycleListener init 信息: The APR b ...

  6. 2013年中国区Skyline软件价格体系

    < 2013年中国区Skyline软件价格体系                         序号 产品名称 描述 市场报价         1 TerraExplorer Pro 5.1 对 ...

  7. delphi 自动滚动到最底端scroll

    自动滚动到最底端scrollUses MSHTML;{$R *.dfm}var  ScrollPos: integer=0;procedure TForm1.Button1Click(Sender: ...

  8. Crouton

    https://github.com/keyboardsurfer/Crouton https://github.com/GBouerat/Crouton https://github.com/ouy ...

  9. 【每日一摩斯】-Index Skip Scan Feature (212391.1)

    INDEX Skip Scan,也就是索引快速扫描,一般是指谓词中不带复合索引第一列,但扫描索引块要快于扫描表的数据块,此时CBO会选择INDEX SS的方式. 官方讲的,这个概念也好理解,如果将复合 ...

  10. slots - Python的结构体 转

          上个月看了篇文章 “SAVING 9 GB OF RAM WITH PYTHON’S __SLOTS__”,原来Python也有类似结构体的东东.拖了一个月才写这篇,是因为太久没看pyth ...