一、前言

最近做的项目需要单据批量打印的功能,优先想到用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. 从gitbook将书籍导入到github中

    gitbook自己的导出工具经常出问题,可直接使用git. 从gitbook中clone下书 $ git clone https://git.gitbook.com/username/name_of_ ...

  2. Android Layout_Gravity和Gravity

    简单来说layout_gravity表示子控件在父容器的位置,gravity表示控件内容在控件内的位置. 上面图片的xml代码 <?xml version="1.0" enc ...

  3. 处理Oracle中杀不掉的锁

    一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不 ...

  4. C++ struct与class

    1.相对于C中struct,C++做了很大的扩充.基本上和class 差不多.只有一些细节上的差别. 2.对于成员的默认访问权限,class是private,struct是public.需要注意的是, ...

  5. POJ1463:Strategic game(树形DP)

    Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot f ...

  6. alternatives命令使用方法

    alternatives命令使用方法 alternatives是Linux下的一个功能强大的命令.仅仅能在root权限下运行.如系统中有几个命令功能十分相似,却又不能任意删除,那么能够用 altern ...

  7. DOS命令生成文件列表

    DOS命令窗口,生成文件列表命令格式:dir xmlFiles /b >list.txt dir 文件列表相关命令 xmlFiles 待生成文件所在文件夹,在dos命令窗口根目录下,省略前缀.别 ...

  8. iOS开发——UI篇&ScrollView详解

    创建方式 1:StoryBoard/Xib 这里StoarBoard就不多说,直接拖就可以,说太多没意思,如果连这个都不会我只能先给你跪了! 2:代码: CGRect bounds = [ [ UIS ...

  9. Ruby on Rails Tutorial 第一章 之 Git项目管理

    1.安装和设置 (1)git的安装(略) (2)初始化设置 $ git config --global user.name "LihuaSun" $ git config --gl ...

  10. 网络IPC:套接字之寻址

    在学习用套接字做一些有意义的事情之前,需要知道如何确定一个目标通信进程. 进程的标识有两个部分:计算机的网络地址可以帮助标识网络上想与之通信的计算机,而服务可以帮助标识计算机上特定的进程. 1.字节序 ...