回顾与说明
首先给大家说声抱歉,上一周忙了一些其他的事,博客也就差不多一周没有更新,让关注AgileEAS.NET平台的朋友们久等了,希望大家能继续关注AgileEAS.NET平台,关注AgileEAS.NET平台所采用的架构设计实践和AgileEAS.NET平台背后的一些软件工程实践思考。
前面我用了至少两篇直接的文章对“商品入库”模块进行了详细的说明,我想大家已经很清楚的知道商品入库处理的流程、技术特别以及特别查询的缓存查询技术。为什么我要在这么一个简单的模块费多少大的口舌呢?
因为,“商品入库”是一个在管理信息系统(MIS)之中非常典型的应用场景,在这个很小的应用场景之中,我们涉及到了字典信息查询、中间结果保存、事务处理以及马上要进行的“票据打印”,可以说基本是一个信息系统中在线事务处理或者数据采集应用的一个缩影,当我们能熟练的能使用AgileEAS.NET平台开发这样的应用的时候,那么MIS系统将在我们面前没有一些难度。
本文的内容
前面的文章,我已经把“商口入库”模块之中的字典查询以及其中使用的缓存技术、中间数据记录、业务的处理及事务等进行了详细的介绍,今天本文的重点是入库单(票据)打印业务。
那么这是一个什么场景呢,当我们点击“入库”按钮完成入库今年的保存之后,我们需要点击“打印”按钮完成入库票据的打印,或者当我们完成入库按钮之后完成入库之后即打印本次业务的业务票据,操作界面上有“直接输出打印机”的选项,如果选中则不显示打印预览对话框。
准备报表,以备调用
首先我们制做报表,打开报表设计器ReportDesigner.Start.exe,通过菜单“文件”-->“新建”-->“对象报表”,打开“新建数据对象报表”对话框,然后选择“数据对象”Tab页,点击“浏览”选择编译目标目录中的“Product.DAL.SQLServer.dll”,在类型下接列表之选择Product.DAL.SQLServer.ProductInList:
现在我们单击“确定”按钮,使用报表设计器调整报表格式,达到以下样式:
我们可以在报表设计器中预览一下,注意:
因为是基于数据对象的报表不能连接数据库,所以数据都是随机生成的,用于模拟显示。
现在报表已经做好,我们把报表定义保存在编译目标目录的Report文件夹中,名称为“商品入库单据.rdl”。
修改程序,控制打印
报表已经制作好了,现在的任务就是在程序中加载报表,并且绑定要打印的数据,那么数据从那来呢,我们已经完成了商品的入库并且我们知道刚刚完成的入库单号,我们可以通过入库单号来查询入库表,从来得到指定入库单中的入库记录,要达到这样的需求,我们需要在DAL层接口项目Product.DAL.Interface中的IProductInList中增加一个方法:
1
///
<summary>
2 /// 表接口 IProductInList(产品入库)。
3 /// </summary>
4 public partial interface IProductInList
5 {
6 /// <summary>
7 /// 根据入库票据号查询入库明细。
8 /// </summary>
9 /// <param name="billCode"> 入库票据号。 </param>
10 void GetProductInList( string billCode);
11 }
2 /// 表接口 IProductInList(产品入库)。
3 /// </summary>
4 public partial interface IProductInList
5 {
6 /// <summary>
7 /// 根据入库票据号查询入库明细。
8 /// </summary>
9 /// <param name="billCode"> 入库票据号。 </param>
10 void GetProductInList( string billCode);
11 }
1
///
<summary>
2 /// 表对象 ProductInList(产品入库)。
3 /// </summary>
4 public partial class ProductInList:EAS.Data.ORM.Table, IProductInList
5 {
6 public void GetProductInList( string billCode)
7 {
8 Condition condition = this .CreateCondition();
9 condition.AddElement( " BILLCODE " , billCode);
10 this .Query(condition);
11 }
12 }
2 /// 表对象 ProductInList(产品入库)。
3 /// </summary>
4 public partial class ProductInList:EAS.Data.ORM.Table, IProductInList
5 {
6 public void GetProductInList( string billCode)
7 {
8 Condition condition = this .CreateCondition();
9 condition.AddElement( " BILLCODE " , billCode);
10 this .Query(condition);
11 }
12 }
接下来我们来写“打印”按钮的事件处理代码,实现数据提取与报表打印:
1
private
void
btnPrint_Click(
object
sender, EventArgs e)
2 {
3 IProductInList productInList = DALHelper.DALManager.CreateProductInList();
4 productInList.GetProductInList( this .previouBillCode);
5
6 if (productInList.Rows.Count == 0 )
7 {
8 MessageBox.Show( " 没有需要打印的数据! " , " 提示 " , MessageBoxButtons.OK, MessageBoxIcon.Information);
9 return ;
10 }
11
12 if ( this .printForm == null )
13 this .printForm = new RDLViewDialog();
14
15 //
16 System.IO.TextReader textReader = null ;
17 try
18 {
19 string fileName = Path.Combine(Application.StartupPath, " Reports\\商品入库单据.rdl " );
20 textReader = new System.IO.StreamReader(fileName);
21 this .printForm.SourceRdl = textReader.ReadToEnd();
22 }
23 finally
24 {
25 if (textReader != null )
26 textReader.Close();
27 }
28
29 this .printForm.DataObject = productInList;
30
31 if ( this .cbPrinter.Checked)
32 this .printForm.Print(); // 直接打印
33 else
34 this .printForm.PrintPreview(); // 打印预览
35 }
2 {
3 IProductInList productInList = DALHelper.DALManager.CreateProductInList();
4 productInList.GetProductInList( this .previouBillCode);
5
6 if (productInList.Rows.Count == 0 )
7 {
8 MessageBox.Show( " 没有需要打印的数据! " , " 提示 " , MessageBoxButtons.OK, MessageBoxIcon.Information);
9 return ;
10 }
11
12 if ( this .printForm == null )
13 this .printForm = new RDLViewDialog();
14
15 //
16 System.IO.TextReader textReader = null ;
17 try
18 {
19 string fileName = Path.Combine(Application.StartupPath, " Reports\\商品入库单据.rdl " );
20 textReader = new System.IO.StreamReader(fileName);
21 this .printForm.SourceRdl = textReader.ReadToEnd();
22 }
23 finally
24 {
25 if (textReader != null )
26 textReader.Close();
27 }
28
29 this .printForm.DataObject = productInList;
30
31 if ( this .cbPrinter.Checked)
32 this .printForm.Print(); // 直接打印
33 else
34 this .printForm.PrintPreview(); // 打印预览
35 }
现在,商品入库单-票据打印就解决了,我们来看一下效果吧:
注意:
在实际应用中,在需要频繁的使用单根打印的过程之中会直接输出到打印机而不会使用打印预览对话框,比如在银行、电信、电力、医疗等各行业的窗口业务模块。
至此,“商品入库”模块的相关处理就此结束,接下来演示两个查询类模块“库存查询”与“入库信息查询”。对这东西感兴趣的朋友呢,可以下载了完整代码之后自己看看,有问题请及时的和我联系。
有关本例所涉及的数据表结构请参考
基于AgileEAS.NET平台基础类库进行应用开发-总体说明及数据定义一文,有关数据对象模型定义文件、文档、DDL脚本请下载:
http://files.cnblogs.com/eastjade/demo.db.doc.sql.rar,本例完整代码下载:
Product.Demo.rar。
链接
QQ群:116773358
本文转自 agilelab 51CTO博客,原文链接:http://blog.51cto.com/agilelab/603067