一、取送货管理项目需求

该系统的业务背景如下:客户是一个针织半成品生产加工作坊,有很多生产加工人员从客户工厂那里取走半成品,加工成成品后送回来。客户根据加工每种半成品的加工单价和完成数量,付费用给生产加工人员。系统的需求很简单,要求统计出每个加工人员取走和送回半成品的数量,时间。以及统计加工人员的应付费用和已付费用。

师傅之前开发的是单机版的(所谓单机版就是数据库独立,不能连接庞大的数据库,这是我的理解,不知道准不准确)界面如下,进行增删改查,我演示的是微软C#所带控件的开发过程。

二、取送货WinForm项目开发过程

(一)取送货数据库的构建

此项目的开发最开始的是构建数据库,经分析需要建立六个表和六个视图,分别是产品分类表,产品分类表,取送货人表,取货信息表,送货信息表和加工费支付信息表,视图主要是建立表与表连接的关系临时表,数据库命名为TakeSendMisCSDB,命名要有实际意义,建立表和视图代码如下:

 --产品分类表
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'CK_ProductType')
DROP TABLE CK_ProductType
CREATE TABLE dbo.CK_ProductType(
CK_ProductTypeID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
CK_ProductTypeName VARCHAR() NOT NULL DEFAULT ''
); --产品信息表
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'CK_Product')
DROP TABLE CK_Product
CREATE TABLE dbo.CK_Product(
CK_ProductID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
CK_ProductTypeID INT NOT NULL FOREIGN KEY REFERENCES CK_ProductType(CK_ProductTypeID) ON UPDATE CASCADE,
CK_ProductName VARCHAR() NOT NULL DEFAULT '',
CK_ProductPrice DECIMAL(,) NOT NULL DEFAULT
);
--取送货人表
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'CK_People')
DROP TABLE CK_People
CREATE TABLE dbo.CK_People(
CK_PeopleID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
CK_PeopleName VARCHAR() NOT NULL DEFAULT '',
CK_PhoneNo VARCHAR() NOT NULL DEFAULT '',
CK_Comment VARCHAR() NOT NULL DEFAULT ''
); --取货信息表
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'CK_TakeGoods')
DROP TABLE CK_TakeGoods
CREATE TABLE dbo.CK_TakeGoods(
CK_TakeGoodsID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
CK_PeopleID INT NOT NULL FOREIGN KEY REFERENCES CK_People(CK_PeopleID) ON UPDATE CASCADE,
CK_ProductID INT NOT NULL FOREIGN KEY REFERENCES CK_Product(CK_ProductID) ON UPDATE CASCADE,
CK_TakeGoodsNo VARCHAR() NOT NULL DEFAULT '',
CK_TakeGoodsAmount INT NOT NULL DEFAULT ,
CK_TakeGoodsDate DATETIME not NULL DEFAULT ''
); --送货信息表
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'CK_SendGoods')
DROP TABLE CK_SendGoods
CREATE TABLE dbo.CK_SendGoods(
CK_SendGoodsID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
CK_PeopleID INT NOT NULL FOREIGN KEY REFERENCES CK_People(CK_PeopleID) ON UPDATE CASCADE,
CK_ProductID INT NOT NULL FOREIGN KEY REFERENCES CK_Product(CK_ProductID) ON UPDATE CASCADE,
CK_SendGoodsNo VARCHAR() NOT NULL DEFAULT '',
CK_SendGoodsAmount INT NOT NULL DEFAULT ,
CK_SendGoodsDate DATETIME not NULL DEFAULT ''
); --加工费支付信息表
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'CK_Payment')
DROP TABLE CK_Payment
CREATE TABLE dbo.CK_Payment(
CK_PaymentID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
CK_PeopleID INT NOT NULL FOREIGN KEY REFERENCES CK_People(CK_PeopleID) ON UPDATE CASCADE,
CK_PayDate DATETIME NOT NULL DEFAULT '',
CK_PayMoney DECIMAL(,) NOT NULL DEFAULT ,
CK_PayComment VARCHAR() NOT NULL DEFAULT ''
);

建立数据库

 CREATE VIEW [dbo].[v_listPayDetailInfo]
AS
select ck_people.ck_peoplename ,PayMoney as needPayMoney ,coalesce(PayedMoney,) as PayedMoney,(PayMoney - coalesce(PayedMoney,)) as unPayedMoney
from (select ck_peopleid,sum(CK_Product.ck_ProductPrice*ck_SendgoodsAmount) PayMoney from ck_Sendgoods
LEFT join CK_Product on CK_Product.ck_ProductID = CK_SendGoods.ck_ProductID
group by ck_peopleid) tab1
left join
(select ck_peopleid,sum(ck_paymoney) PayedMoney from ck_payment group by ck_peopleid) tab2
on tab1.[ck_peopleid] = tab2.ck_peopleid
left join ck_people on tab2.ck_peopleid = ck_people.ck_peopleid CREATE VIEW [dbo].[v_listPaymentInfo]
AS
select ck_payment.ck_paymentid, ck_people.ck_peoplename, ck_paymoney, ck_paydate, ck_paycomment from ck_payment
join ck_people on ck_payment.ck_peopleid = ck_people.ck_peopleid CREATE VIEW [dbo].[v_listProductInfo]
AS
select ck_productid,ck_productname, ck_productprice, ck_productType.ck_productTypename from ck_product
join ck_productType on ck_product.ck_productTypeid = ck_productType.ck_productTypeid CREATE VIEW [dbo].[v_listSendGoodsInfo]
AS
select ck_sendgoods.ck_sendgoodsid
, ck_sendgoods.ck_sendgoodsno
, ck_sendgoods.ck_sendgoodsdate
,ck_people.ck_peoplename,ck_producttype.ck_producttypename
,ck_product.ck_productname , ck_sendgoods.ck_sendgoodsAmount
,ck_product.ck_productprice
,ck_sendgoods.ck_sendgoodsAmount * ck_product.ck_productprice as totalfee
from ck_sendgoods
join ck_product on ck_product.ck_productid = ck_sendgoods.ck_productid
join ck_producttype on ck_producttype.ck_producttypeid = ck_product.ck_producttypeid
join ck_people on ck_people.ck_peopleid = ck_sendgoods.ck_peopleid CREATE VIEW [dbo].[v_listTakeGoodsInfo]
AS
select ck_takegoods.ck_takegoodsid, ck_takegoods.ck_takegoodsno, ck_takegoods.ck_takegoodsdate
,ck_people.ck_peoplename,ck_producttype.ck_producttypename
, ck_product.ck_productname , ck_takegoods.ck_takegoodsAmount from ck_takegoods
join ck_product on ck_product.ck_productid = ck_takegoods.ck_productid
join ck_producttype on ck_producttype.ck_producttypeid = ck_product.ck_producttypeid
join ck_people on ck_people.ck_peopleid = ck_takegoods.ck_peopleid CREATE VIEW [dbo].[v_listTakeSendGoodsInfo]
AS
select CK_People.ck_PeopleName ,CK_ProductType.CK_ProductTypeName
,CK_Product.CK_ProductName,tab1.sum takenum,coalesce(tab2.sum,) backnum,tab1.sum - coalesce(tab2.sum,) diffnum from
(select CK_PeopleID,CK_ProductID,sum(ck_takegoodsAmount) sum from ck_takegoods group by CK_ProductID,CK_PeopleID) tab1
left join
(select CK_PeopleID,CK_ProductID,sum(ck_sendgoodsAmount) sum from ck_sendgoods group by CK_ProductID,CK_PeopleID) tab2
on tab2.CK_PeopleID =tab1.CK_PeopleID and tab2.CK_ProductID = tab1.CK_ProductID
left join CK_Product on CK_Product.CK_ProductID = tab1.CK_ProductID
left join CK_ProductType on CK_ProductType.CK_ProductTypeID = CK_Product.CK_ProductTypeID
left join CK_People on CK_People.CK_PeopleID = tab1.CK_PeopleID

建立视图

(二)用动软代码生成器三层导入到WinForm项目开发中

命名空间为TSM,选择要导入的数据库,操作如图:

将生成代码中的BLL,DAL,MODEL,DBUtility文件夹复制到解决方案同层工作目录下。

如何将其包含在项目中?步骤如下:右击“解决方案”——添加——现有项——找到BLL文件夹下BLL.csproj文件——完成,其它三个也一样导入。截图如下:

 

之后在项目上右击——添加引用——项目——将四个全选(BLL,DAL,MODEL,DBUtility)——确定。还有一点DAL层也要添加DBUtility的引用,方法同上。

这时还不能连接数据库,需要编写一个App.config文件,App.config是通过在项目名称上右键,然后添加新项,在弹出来的对话框中,找到“应用程序配置文件”,选中,确定就会添加进去了,App.config文件中的代码如下:

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ConStringEncrypt" value="false"/>
<!--数据库连接字符串-->
<add key="ConnectionString" value="Data Source=WIN7-20140110BZ\SQLEXPRESS;database = TakeSendMisCSDB;Integrated security = true" />
</appSettings>
</configuration> //Data Source=自己的数据库服务名称
//database=数据库名,此项目数据库我命名为TakeSendMisCSDB

App.config代码

(三)基本信息管理的界面设计与代码实现

以基本信息下的产品分类管理为例进行展开,

界面设计如下:(主要包括Button,panel,TextBox和DataGridView等控件)

代码实现,首先定义几个全局变量:

        //定义静态变量实例化产品类别数据库逻辑层,进而进行增删改查操作
private static TSM.BLL.CK_ProductType m_bllCK_ProductType = new TSM.BLL.CK_ProductType();
//标记是修改还是添加
public string m_strOperationType = "";
//定义主键的字段
private int m_CK_ProductTypeID;

全局变量

双击[显示全部]触发buttonShowAll_Click事件,程序代码如下:

         private void ShowAllRecords(string strWhere)
{
this.dataGridView1.DataSource = null;
DataSet ds = m_bllCK_ProductType.GetList(strWhere);//用到CK_ProductType的BLL业务逻辑层的GetList方法,间接调用DAL层的GetList方法
if (ds.Tables.Count > && ds.Tables[].Rows.Count > )
{
this.dataGridView1.DataSource = ds.Tables[];
this.dataGridView1.Columns[].Visible = false;
}
} private void buttonShowAll_Click(object sender, EventArgs e)
{
ShowAllRecords(m_strWhere);//调用自己编写的显示全部记录方法
}

运行程序则可以查看到产品种类的所有信息,开始由于数据库里没有信息,检查程序运行结果,可以先在数据库的CK_ProductType表中插入几条信息。显示结果如下图:

属性列是英文,看起来不直观,不能满足用户需求。可以跟踪代码的GetList方法,快捷键F12,一层一层的改写DAL层,BLL层的GetList方法,说是改写其实就是Select语句的重命名,就把DAL层代码展示如下:

         /// <summary>
/// 获得数据列表
/// </summary>
public DataSet GetList(string strWhere)
{
StringBuilder strSql=new StringBuilder();
strSql.Append("select CK_ProductTypeID as 产品类别编号,CK_ProductTypeName as 产品类别名称");
strSql.Append(" FROM CK_ProductType ");
if(strWhere.Trim()!="")
{
strSql.Append(" where "+strWhere);
}
return DbHelperSQL.Query(strSql.ToString());
}
//就是添加了中文别名

运行结果图如下:

今天就做到这里,后续会添加其它按钮事件的实现和其它设计模块的编写,写的很简单,但是我认为说明挺详细,希望和有志之士共同进步,也希望博友多多提出宝贵意见和多多鼓励。

WinForm开发之取送货管理1的更多相关文章

  1. WinForm开发之取送货管理2

    写的有点慢,但都是一步步操作的,希望这些能成为以后宝贵的财富,话不多说,续上次取送货基本信息管理之产品分类管理,下面进行增删改的编写. 增加产品分类管理信息记录,双击[新增]按钮(其新增可让用户在Te ...

  2. 手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统系列博文索引

    近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座,来讲解如何利用FineUI快速开 ...

  3. 手把手教你使用FineUI+动软代码生成器开发一个b/s结构的取送货管理信息系统(附源码)之开篇

    一 本系列随笔概览及产生的背景 近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座, ...

  4. WinForm开发中通用附件管理控件设计开发参考

    1.引言 在WinForm开发中,文件附件的管理几乎在任何一个应用上都会存在,是一个非常通用集中的公共模块.我们日常记录会伴随着有图片.文档等附件形式来展现,如果为每个业务对象都做一个附件管理,或者每 ...

  5. winform快速开发平台 -> 通用权限管理之动态菜单

    这几个月一直忙APP的项目,没来得及更新项目,想想该抽出时间整理一下开发思路,跟大家分享,同时也希望得到宝贵的建议. 先说一下我们的权限管理的的设计思路,首先一个企业信息化管理系统一定会用到权限管理, ...

  6. RDIFramework.NET V2.8版本 ━ 开发实例之产品管理(WinForm)

    RDIFramework.NET V2.8版本 ━ 开发实例之产品管理(WinForm) 现在,我们使用.NET快速开发整合框架(RDIFramework.NET)来开发一个应用,此应用皆在说明如何使 ...

  7. SNF开发平台WinForm之四-开发-主细表管理页面-SNF快速开发平台3.3-Spring.Net.Framework

    4.1运行效果: 4.2开发实现: 4.2.1          有了第一个程序的开发,代码生成器的配置应该是没有问题了,我们只要在对应的数据库中创建我们需要的表结构就可以了,如下: 主表结构如下: ...

  8. SNF开发平台WinForm之二-开发-单表表单管理页面-SNF快速开发平台3.3-Spring.Net.Framework

    2.1运行效果: 2.2开发实现: 2.2.1 这个开发与第一个开发操作步骤是一致的,不同之处就是在生成完代码之后,留下如下圈红程序,其它删除. 第一个开发地址:开发-单表表格编辑管理页面 http: ...

  9. Winform开发框架之通用附件管理模块 --SNF快速开发平台3.3-Spring.Net.Framework

    最近项目太多都没有时间写文章了,实际项目需求一,CS端和windows平板都需要附件上传管理功能.以前做的都是BS的附件管理和上传功能.本来计划在Winform上嵌套一个浏览器直接用bs的附件上传功能 ...

随机推荐

  1. NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)

    摘要 这一篇文章介绍在NHibernate 3.2里引入的Query Over查询,Query Over查询跟Criteria查询类似.首先创建IQueryOver对象,然后通过调用该对象的API函数 ...

  2. Verilog $random用法

    “$random函数调用时返回一个32位的随机数,它是一个带符号的整形数...”,并给出了一个例子: _________________________________________________ ...

  3. 读《JavaScript DOM编程艺术》

    国庆假期花了三四天看了这本书,书很薄,因为是入门书,干货也不是很多. 4. childNodes nodeType nodeValue firstChild lastChild childNodes返 ...

  4. JavaScript 数组 length 属性获取数组长度或设置数组元素的数目

    JavaScript 数组 length 属性 JavaScript 数组 length 属性可返回或设置或组中元素的数目,语法如下: array_object.length 利用 length 属性 ...

  5. 操作系统 页面置换算法LRU和FIFO

    LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...

  6. MySQL的btree索引和hash索引的区别

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...

  7. Servlet学习五——流的分发

    在上一节中有提到,流的传输,可以考虑Stream,但如果需要同时分发流和其它信息,,就需要再考虑其它方式了. 在coding中,服务端查询结果都是以gson进行传输,当需要传输一个语音并且同时需要传输 ...

  8. 又是一天String

    (1) Length of Last Word 解题思路:使用length记录最后一个单词的长度.从最后一个字符开始,如果是空字符,length不变.如果不是空字符,length++,直到再次遇到空字 ...

  9. 循序渐进Python3(十)-- 3 -- SqlAlchemy

    使用sqlalchemy 创建外键关联 ), ), ) host_user = Column(String(), ), ), ]).first()for item in works.workinfo: ...

  10. 阿里巴巴Java招聘

    大家好: 我是阿里巴巴B2B的应用架构师,现在大量招聘Java工程师,对自己技术有信心的兄弟姐妹,请联系我吧. 版权声明:本文为博主原创文章,未经博主允许不得转载.