系列回顾

     WinForm篇前面我用了两篇文章实例演示了一个基于AgileEAS.NET实现一个简单的增加、删除、修改、查询与打印的典型的简单应用案例,这应该是一个典型的MIS系统的应用场景。
     在前一篇文章 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-在UI中应用DataUIMapper组件完成了商品字典编辑界面中的代改造,由原来的显示与写回代码改成DataUIMapper组件的DataObject<==>UI控件的映射方式。
     结合前面的两篇文章,示例中的第一个模块“产品字典”可以说是告一段落了,接下来的工作,我们将开始第二个模快“商品入库”的开发。

本文内容

     “商品入库”模块将是一个典型的业务处理模块,在产品入库的过程中,我们要求“一张入库单可以包含1-N个入库记录,并且在同一入库单中不得存在两条同品种的商品记录”,在本模块中,我们将会涉及到入库业务的票价打印、事务处理、业务层编码、缓存查询等一些技术专注点。
     下面我就以视频的方式展现一下我们要达到的目标(截取案例的运行结果)【第一次弄这玩意,效果比较差,大家理解一下】: 

关于表的ID列和入库单据号

      在这个简单的应用案例中,一共定义了三个表,产品字典db.PRODUCT,产品库存表dbo.PSTORE,产品入库记录表dbo.PIN,在三个表中都定义了一个与业务无关的列ID,产品表的主键为商品编码[Code],产品入库表的主键为单据号+商品编码[BillCode+Code],库存表为商品编码+价格[Code+Price]。所有表中的ID字段的取值参考 DotNET企业架构应用实践-数据库表记录的唯一性设计的设计兼议主键设定原则一文,入库单位号由日期(yyyyMMdd)+6位最大序列号组成,所有最大号当前值记录由一个单独表存放,AgileEAS.NET平台中存储在表eas.IDENTITYVALUES中,在本示例中存储在表dbo.IDENTITYVALUES,取值和更新由过程dbo.GetIdentityValue/dbo.GetIdentityValue完成,在程序中采用以下方式读取最大号:
 1          ///  
 2          ///  取记录号。
 3          ///  

 4          ///  
 5          public   int  GetMaxNewIdn()
 6         {
 7             ParameterCollection pc  =   new  ParameterCollection();
 8             pc.Add( " ITEMKEY " this .DbTableName);
 9              return  ( int ) this .DataAccessor.Query( " exec dbo.GetIdentityValue @itemkey=? " , pc);
10         }
11 
12          ///  
13          ///  取单据号。
14          ///  

15          ///  
16          public   string  GetMaxBillCode()
17         {
18             ParameterCollection pc  =   new  ParameterCollection();
19             pc.Add( " ITEMKEY " " ProductInBillCode " );
20              int  code  =  ( int ) this .DataAccessor.Query( " exec dbo.GetIdentityValue @itemkey=? " , pc);
21              return  DateTime.Now.ToString( " yyyyMMdd " +  code.ToString( " D6 " );
22         }
       注:本案例的Product.UI项目中增加了一个“唯一键值更新sql语句.sql”包含了本案例所需要上述的sql脚步,请自行更新到数据库。

实现商品入库

      要实现产品入库,我们需要在Product.UI项目中增加两个新的窗体ProductInForm和SelectDictForm,其中ProductInForm为产品入库的业务运行界面,SelectDictForm为其附加界面,用于完成从产品字典中检索产品信息,我们分别来看一下这两个界面,ProductInForm:
 
ProductInForm为产品入库模块的主界面,操作员通过在产品编辑输入框输入产品编码的拼音简码,比如:青霉素(QMS)然后按回车键打开SelectDictForm窗体:
 
SelectDictForm会根据操作员输入产品拼音简码检索数据库并列出与之匹配的所有字典记录供操作员选择,操作选择一条记录按回车键或者空格键或者点击“选择”按钮跳转回ProductInForm,操作中输入产品价格及数量之后回车,系统会把刚才的输入结果暂存在界面下边的ListView控件中,一个单据可以输入多条产品入库记录,也可以选择入库列表记录通过delete键删除入库记录,最后通过“入库”按钮完成一次入库业务。

关于业务处理

     对于本示例的商品入库处理,我提出了独立的业务对象处理其输入,在项目Product.BL中定义了ProductInBL业务层对象,代码请自己参考,关于业务分层请参考 DotNET企业架构应用实践-实例架构设计中的业务分层-提取独立的业务层一文。

关于代码/下载

      本文今天就到这儿,“商品入库”业务模块中的详细代码我就不在这贴了,太多,大家下载了完整代码之后自己看吧,在接下的文章中我将介绍缓存查询的应用。
      有关本例所涉及的数据表结构请参考 基于AgileEAS.NET平台基础类库进行应用开发-总体说明及数据定义一文,有关数据对象模型定义文件、文档、DDL脚本请下载: http://files.cnblogs.com/eastjade/demo.db.doc.sql.rar,本例完整代码下载: Product.Demo.rar。
      最后,声明一句,不欢迎“巴克球”!我不想再说什么,别来凑热闹了。

链接

一步一步教你使用AgileEAS.NET基础类库进行应用开发-系列目录
AgileEAS.NET平台开发指南-系列目录
AgileEAS.NET应用开发平台介绍-文章索引
AgileEAS.NET平台应用开发教程-案例计划
AgileEAS.NET官方网站
敏捷软件工程实验室
QQ群:116773358