VS2012報表(RDLC)系列應用之單據批量打印


一、前言

        image

        image

       最近做的項目需要單據批量打印的功能,優先想到用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

image
2、【創建數據集】右擊項目“Fcw.RDLC”,添加新建項,選擇數據集,創建數據集Order.xsd

image
image
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


image
image
image
4、【新建報表】,選擇Fcw.RDLC,右鍵選擇添加新建項,選擇報表。創建order.rdlc

image
5、【配置報表數據源】雙擊打開Order.RDLC設計器,在報表數據源,點擊新建---》數據集,選擇已有的數據源或新建新數據源,名稱也改成Order
image
6、【設計報表】將工具箱中的列表拖拽到rdlc界面設計器上,並指定列表的數據名稱Order

image

6.1 選中列表,在行組中,用鼠標右鍵點擊詳細信息,添加組,父組。分組依據為ordercode (訂單編號),右擊ordercode分組,選中在組的各實例之間分頁,作用是每個訂單頁顯示。

image
image

6.2 刪除自動添加的列ordercode及 詳細信息組
image
image

6.3,依次拖入 表、文本框、圖像,在報表數據源,新建參數。根據需求界面完成設計。
注:列表內默認包含矩形,也可以根據需要手動添加。矩形可實現循環數據內的排版。滿足個性化需求。

image
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、【最終效果】

image
 
 

 

四、總結

本篇文章從基礎開始搭建一個基本的單據批量打印應用,涉及數據集的使用,RLDC中列表、表、文本框、矩形、參數、組分頁的使用方式。

RDLC中表用來實現類似表格數據之類的需求,包含分組統計匯總、分頁等。

文本框用來實現單個字段的顯示或者用來處理部分線條等。

參數用來接收固定值。

矩形用來方便排版,當其他方式設計和最終呈現出現布局不同時,可用矩形把布局錯亂的部分包圍起來。

列表,可以用來處理循環中的單條數據下的各種樣式排版。實現自定義需求。

傳送門:批量打印單據批量單據打印 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM