基于C#技术的企业进销存管理系统开发

  1. 要: 进销存管理系统采用.NET技术和大型数据库SQL Server 2005开发,主要是处理商业企业商品的采购、库存和销售各个环节的活动,具有良好的人机界面;考虑到系统的使用对象可能较多,权限管理良好;数据查询方便,支持多条件查询;系统支持良好的数据备份和还原操作,有效保护数据,减少意外损失;在相应的权限下,可方便地删除数据;数据计算自动完成,尽量减少人工干预;报表分析商品进货、商品销售情况;强大的报表打印功能;报表基本信息查询时,可根据查询条件动态显示查询结果。

    • 进销存管理系统; .NET开发环境; C#语言; SQL Server 2005; 报表
  • 开发工具及开发平台

1.1开发工具选择

本系统前台数据库采用Microsoft SQL Server 2005,该数据库系统在安全性、准确性、运行速度方面有绝对的优势,并且处理数据量大、效率高;后台选择以.NET平台作为开发平台,以C#作为开发语言,采用Visual Studio 2005作为主要的开发工具,可与SQL Server 2005数据库无缝连接。

      1. Visual Studio.NET平台简介

Visual Studio .NET 是一套完整的开发工具,用于生成 ASP Web 应用程序、XML Web services、桌面应用程序和移动应用程序。Visual Basic .NET、Visual C++ .NET、Visual C# .NET 和 Visual J# .NET 全都使用相同的集成开发环境 (IDE),该环境允许它们共享工具并有助于创建混合语言解决方案。另外,这些语言利用了 .NET Framework 的功能,此框架提供对简化 ASP Web 应用程序和 XML Web services 开发的关键技术的访问。

Visual Studio .NET 集成开发环境现在包括开发智能设备(如 Pocket PC)应用程序的工具。通过使用这些工具和 .NET Framework 精简版(.NET Framework 的子集),您可以在个人数字助理 (PDA)、移动电话和其他资源受约束的设备中,创建、生成、调试和部署在 .NET Framework 精简版上运行的应用程序。

ASP.NET 移动设计器扩展了 ASP.NET 和 .NET Framework,可用来生成移动电话、PDA 和寻呼机的 Web 应用程序。此设计器集成在 Visual Studio IDE 中。您可以创建移动 Web 应用程序,使用移动设计器修改移动 Web 窗体,然后生成和运行该应用程序(所有这些操作都是在 Visual Studio 中完成的)。

Web 窗体是用于创建可编程 Web 页的 ASP.NET 技术。Web 窗体将自己呈现为浏览器兼容的 HTML 和脚本,这使任何平台上的任何浏览器都可以查看 Web 页。使用 Web 窗体,通过将控件拖放到设计器上然后添加代码来创建 Web 页,与创建 Visual Basic 窗体的方法相似。

Windows 窗体是用于 Microsoft Windows 应用程序开发的、基于 .NET Framework 的新平台。此框架提供一个有条理的、面向对象的、可扩展的类集,使您能够开发功能丰富的 Windows 应用程序。另外,Windows 窗体可作为多层分布式解决方案中的本地用户界面。

XML Web services 是可以通过 HTTP 使用 XML 接收请求和数据的应用程序。XML Web services 不受特定组件技术或对象调用约定的制约,因此可由任何语言、组件模型或操作系统访问。在 Visual Studio .NET 中,可以使用 Visual Basic、Visual C#、JScript、C++ 的托管扩展或 ATL Server 快速创建和包含 XML Web services。

可扩展标记语言 (XML) 提供描述结构数据的方法。XML 是 SGML 的子集,非常适合在 Web 上传送。万维网联合会 (W3C) 定义了 XML 标准以使结构化数据保持统一并独立于应用程序。Visual Studio .NET 完全支持 XML,提供了 XML 设计器以使编辑 XML 和创建 XML 架构更容易。

.NET Framework 是用于生成、部署和运行 XML Web services 和应用程序的多语言环境。它由三个主要部分组成: 

  1. 公共语言运行库   运行库实际上在组件的运行时和开发时操作中都起到很大的作用,尽管名称中没有体现这个意思。在组件运行时,运行库除了负责满足此组件在其他组件上可能具有的依赖项外,还负责管理内存分配、启动和停止线程和进程,以及强制执行安全策略。在开发时,运行库的作用稍有变化;由于做了大量的自动处理工作(如内存管理),运行库使开发人员的操作非常简单,尤其是与今天的 COM 相比。特别是反射等功能显著减少了开发人员为将业务逻辑转变为可重用组件而必须编写的代码量。
  2. 统一编程类   该框架为开发人员提供了统一的、面向对象的、分层的和可扩展的类库集 (API)。目前,C++ 开发人员使用 Microsoft 基础类,而 Java 开发人员使用 Windows 基础类。框架统一了这些完全不同的模型并且为 Visual Basic 和 JScript 程序员同样提供了对类库的访问。通过创建跨所有编程语言的公共 API 集,公共语言运行库使得跨语言继承、错误处理和调试成为可能。从 JScript 到 C++ 的所有编程语言具有对框架的相似访问,开发人员可以自由选择它们要使用的语言。
  3. ASP.NET   ASP.NET 建立在 .NET Framework 的编程类之上,它提供了一个 Web 应用程序模型,并且包含使生成 ASP Web 应用程序变得简单的控件集和结构。ASP.NET 包含封装公共 HTML 用户界面元素(如文本框和下拉菜单)的控件集。但这些控件在 Web 服务器上运行,并以 HTML 的形式将它们的用户界面推送到浏览器。在服务器上,这些控件公开一个面向对象的编程模型,为 Web 开发人员提供了面向对象的编程的丰富性。ASP.NET 还提供结构服务(如会话状态管理和进程回收),进一步减少了开发人员必须编写的代码量并提高了应用程序的可靠性。另外,ASP.NET 使用这些同样的概念使开发人员能够以服务的形式交付软件。使用 XML Web services 功能,ASP.NET 开发人员可以编写自己的业务逻辑并使用 ASP.NET 结构通过 SOAP 交付该服务。
      1. C#语言简介

C#编程语言是由微软公司的Anders Hejlsberg和 Scott Willamette领导的开发小组专门为.NET平台设计的语言,它可以使程序员移植到.NET上。这种移植对于广大的程序员来说是比较容易的,因为C#从C,C++和Java发展而来,它采用了这三种语言最优秀的特点,并加入了它自己的特性。C#是事件的驱动的,完全面向对象的可视化编程语言,我们可以使用集成开发环境来编写C#程序。使用IDE,程序员可以方便的建立,运行,测试和调试C#程序,这就将开发一个可用程序的时间减少到不用IDE开发时所用时间的一小部分。使用IDE迅速建立一个应用程序的过程称为快速反映开发。

C#2.0特性

  1. 泛型:在我看来,泛型就是通过将数据类型参数化从而实现了代码的更为灵活的复用,泛型的出现使得C#能够使用同一段代码来操作多种数据类型。泛型无疑是C#2.0最重大的改进,它的出现赋予了C#代码更强的类型安全,更好的复用,更高的效率和更清晰的约束。
  2. 匿名方法:匿名方法允许我们将代码直接与委托实例相关联,使委托实例化工作更加直观和方便。在我看来,这只是C#又多了一种语法格式而已,不再像以前必须将方法名传给委托实例,而是又多了一种选择。
  3. 迭代器:迭代器允许我们更加方便的编写用于foreach语句的类型。在我看来,迭代器的出现只不过是改进了1.0中不便的可用foreach语句类型的编写限制,简化了一些接口。
  4. 局部类型:局部类型允许我们将一个类的代码分别写在不同的cs文件中。最典型的应用就是使用VS2005创建Form文件时,VS会自动将系统生成的代码与用户代码分开。局部类型通过partial关键字来声明。
  5. 空属类型:空属类型是一种像int一样可以为空的变量类型。本质上是一种泛型的应用,是System.Nullable<>的一种类型实例化。
  6. 静态类:静态类是只用于包含静态成员的类型,既不能实例化,亦不能被继承。
      1. SQL Server 2005简介

SQL Server 2005 中包含了非常丰富的新特性:通过提供一个更安全、可靠和高效的数据管理平台,增强企业组织中用户的管理能力,大幅提升IT管理效率并降低运维风险和成本;通过提供先进的商业智能平台满足众多客户对业务的实时统计分析、监控预测等多种复杂管理需求,推动企业管理信息化建设和业务发展;同时,SQL Server 2005将提供一个极具扩展性和灵活性的开发平台,不断拓展您的应用空间,实现Internet数据业务互联,为您带来新的商业应用机遇。

由于大大减少了应用程序宕机时间,提高了系统的可伸缩性和性能,并加以更严格的安全控制,SQL Server 2005在支持现实中最苛刻的企业级系统要求的道路上,迈出了极大的一步。SQL Server是微软服务器家族中重要的一部分,通过微软服务器系列产品共有的Engineering strategy所实现的增强的管理性和集成性,客户可以有效降低总体拥有成本并从更快的开发部署时间中受益。

安全、可靠、高效的企业级数据管理平台

SQL Server 2005 将在安全性、高可靠性、性能、扩展性、可管理性方面有极大的提高,不仅能够确保企业级数据业务的实时稳定运行、还能够大大提高管理效率、降低操作复杂度和运维成本。例如,SQL Server 2005将提供全新的安全认证、数据加密技术来加强您数据系统的安全性;数据库镜像、快照、时点恢复、实时在线管理等诸多功能大大提高了企业级系统的可靠性、扩展性;而数据集成,各种自动化管理、调试和优化工具则为您的IT管理工作带来全新的体验。在硬件方面,SQL Server 2005支持64位运算和海量数据存储。

先进、一体化的商业智能平台

SQL Server 2005使您可以快速构建部署各类商业智能解决方案,为你提供深入的业务分析统计、和监控预测平台,进一步推动企业的信息化管理和业务发展。SQL Server 2005将提供非常完整的商业智能套件,包括相关的数据仓库、数据分析、ETL、报表、数据挖掘的一系列设计、开发、管理工具。为了满足客户日渐增强的实时BI和企业级应用规模的需求,SQL Server 2005 在构建商业智能平台的实时性、扩展性方面也有了质的飞跃。全新的数据分析工具和丰富的数据挖掘算法将帮助客户有效进行深入的业务监控分析、决策支持;企业级的ETL工具将支持各种异类数据和复杂数据业务的整合;面向终端用户的报表设计及管理工具与Office的前端集成能够提供非常灵活的数据展示和自由定制功能。

极具扩展性和灵活性的开发平台

SQL Server 2005将提供更加强大的开发工具和各类新的开发特性,在大大提高开发效率的同时,将进一步拓展您的应用空间,带来新的商业应用机遇。例如,XML数据库与Web Service的支持将使您的应用实现Internet数据互联,.Net集成极大的扩展了开发空间,异构数据集成、Service Broker使您的数据和其它应用无缝集成,各种新数据类型和T-SQL扩展带来了诸多灵活性。C#、VB.Net、XQuery、XMLA、ADO.Net 2.0、SMO、AMO等都将成为SQL Server数据平台上开发数据相关应用的有力工具。

1.2平台选择

      1. 硬件环境

表1-1 硬件环境

序号

名    称

类  型

用   途

1

PC Server

数据库服务器

数据库服务器

2

PC

客户端

客户端

      1. 支持软件

表1-2 软件环境

序号

名    称

类  型

用   途

1

Windows Server 2008 R2

操作系统

系统运行环境

2

Microsoft SQL Server 2008 R2

数据库

系统运行环境

3

Microsoft Visual Studio 2010

编译器

系统开发环境

  • 需求分析及可行性分析

2.1 需求分析

通过实际调查,要求本系统具有以下功能。

  1. 具有良好的人机界面。
  2. 如果系统的使用对象较多,则要求有良好的权限管理。
  3. 方便的数据查询,支持多条件查询。
  4. 系统支持良好的数据备份和还原操作,有效保护数据,减少意外损失。
  5. 在相应的权限下,可方便地删除数据。
  6. 数据计算自动完成,尽量减少人工干预。
  7. 报表分析商品进货、商品销售情况。
  8. 强大的报表打印功能。
  9. 报表基本信息查询时,可根据查询条件动态显示查询结果。

报表分析过程中,可根据条件动态分析报表数据

2.2 可行性分析

随着经济的全球化以及中国经济改革的逐渐深化,中小企业面临着越来越激烈的竞争,改善企业内部以及整个供应链各个环节的管理、调度及资源配置,迅速适应客户的新需求和市场新机遇的能力,是企业赢得竞争胜利的决定性因素,进销存管理系统的开发是提高企业竞争力的最有效的方法之一。

进销存管理系统的开发实现了从进货、库存、到销售的一体化管理。提高了管理水平和工作效率,最大限度减少了手工操作带来的错误。

  • 系统功能的设计

3.1 系统的功能结构

进销存管理系统主要由基本档案管理、进货管理、销售管理、库存管理、报表设计和系统维护等模块组成,具体规划如下:

  1. 基本档案管理模块。基本档案管理模块主要用于实现系统基本数据的录入,相关基础数据为:内部员工信息、往来单位信息、客户基本信息。
  2. 进货管理模块。该模块主要用于实现商品的进货数据录入、退货数据录入和进货查询分析。
  3. 销售管理模块。该模块主要用于实现商品的销售数据录入、客户退货数据录入和销售信息查询。
  4. 库存管理模块。库存管理模块主要用于实现库存调拨、库存商品数量上限报警和库存数据查询。
  5. 报表设计模块。报表设计模块主要用于实现员工信息报表、往来单位报表、进货商品报表、员工销售报表、商品进货分析报表、销售价格分析报表以及员工销售分析报表。

进销存管理系统的功能结构图如下图所示:

图3-1进销存管理系统功能结构图

3.2 数据库设计

本系统采用SQL Server 2005作为后台数据库,数据库名称为db_EMS,其中包含13张数据表,下面分别介绍。

3.2.1 数据库表概要说明

本系统后台数据库中的数据表有:

  1. tb_unit(公司基本信息表)
  2. tb_units(客户基本信息表)
  3. tb_department(部门基本信息表)
  4. tb_depot(仓库类别信息表)
  5. tb_goods(商品进货信息表)
  6. tb_popedom(系统权限管理表)
  7. tb_post(员工职位表)
  8. tb_reGoods(商品退货信息表)
  9. tb_sell(商品销售信息表)
  10. tb_stock(库存信息表)
  11. tb_stockTemp(库存调拨信息表)
  12. tb_employee(员工基本信息表)

3.2.2 数据库E-R图分析

根据上面的设计规划出的实体主要有商品信息实体、员工信息实体、退货商品实体、商品销售实体、商品库存实体和商品调拨信息实体。

  1. 进销存管理系统中商品信息实体E-R图,如下图所示。

图3-2商品信息实体图

  1. 进销存管理系统中员工信息实体E-R图,如下图所示。

图3-3员工信息实体图

  1. 进销存管理系统中退货商品实体E-R图,如下图所示。

图3-3退货商品实体图

  1. 进销存管理系统中商品销售实体E-R图,如下图所示。

图3-4商品销售实体图

  1. 进销存管理系统中商品库存实体E-R图,如下图所示。

图3-5商品库存实体图

  1. 进销存管理系统中商品调拨信息实体E-R图,如下图所示。

图3-6商品调拨信息实体图

  • 系统主要模块的实现

3.6.1 系统登录设计

1.窗体设计

在窗体中分别添加三个Label控件,一个ErrorProvider控件,两个Button控件。

图3-7系统登录窗体

2.代码设计

声明公共类SqlBaseClass、PropertyClass和WinOperationClass三个全局对象,通过类对象调用类中的功能方法,实现代码如下:

SqlBaseClass SqlExecute = new SqlBaseClass();

         PropertyClass Property = new PropertyClass();

         WinOperationClass WinFormClass = new WinOperationClass();

在窗体初始化时绑定窗体中的一些控件,窗体初始化代码如下:

private void Login_Load(object sender, EventArgs e)

         {

             string cmdtxt = "SELECT DISTINCT SysUserSort FROM Popedom";

            this.cbxDegree.BeginUpdate();

             this.cbxDegree.DataSource = SqlExecute.GetDs(cmdtxt).Tables[0];

             this.cbxDegree.DisplayMember = "SysUserSort";

             this.cbxDegree.ValueMember = "SysUserSort";

             this.cbxDegree.EndUpdate();

         }

【确定】按钮的Click事件代码如下:

private void btnOK_Click(object sender, EventArgs e)

         {

            if (this.txtUid.Text.Length == 0)

            {

                this.errAllInfo.SetError(this.txtUid, "用户名不能为空!");

            }

            if (this.txtPwd.Text.Length < 6)

            {

                this.errAllInfo.SetError(this.txtPwd, "密码不能小于6位!");

            }

            //string P_DESDcrypt = WinFormClass.DESEncrypt(this.txtPwd.Text);

            string cmdtxt = "SELECT UserID,SysLoginName,Pwd,SysUserSort,PopedomID FROM v_UserView WHERE SysLoginName='" + this.txtUid.Text.Trim() + "'";

            cmdtxt += "AND Pwd='" + this.txtPwd.Text.Trim() + "' AND SysUserSort='" + this.cbxDegree.SelectedValue.ToString() + "'";

            SqlDataReader P_dr = SqlExecute.GetReader(cmdtxt);

            P_dr.Read();

            if (P_dr.HasRows)

            {

                AppMain AppForm = new AppMain();

                this.Hide();

                PropertyClass.SendNameValue = this.txtUid.Text;

                PropertyClass.SendPopedomValue = P_dr["PopedomID"].ToString();

                PropertyClass.SendUserIDValue = P_dr["UserID"].ToString();

                PropertyClass.SavePassword = P_dr["Pwd"].ToString();

                AppForm.Show();

            }

            else

            {

                MessageBox.Show("用户名、密码或身份不正确!", "登录提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

                P_dr.Close();

            }

            P_dr.Close();

         }

3.6.2 系统主窗体设计

1.窗体设计

在窗体中分别添加一个MenuStrip控件、一个Timer控件和一个StatusStrip控件。

图3-8系统主界面

2.代码设计

方法MenuIsVisible()根据用户权限分配显示菜单,方法代码如下:

public void MenuIsVisible()

         {

            ArrayList arylst = new ArrayList();

            ToolStripMenuItem[] menu = new ToolStripMenuItem[] {

                this.menuEmployee,this.menuCompany,this.menuCustomer,this.menuGoodsIn,this.menuGoodsOut,this.menuSellGoods,

                this.menuGoodsBack,this.menuDepotChange,this.menuDepotAlarm,this.menuSysUser,this.menuPopedomSet,this.menuDatabak,this.menuReBakData

            };

            DataSet P_ds = G_SqlClass.GetDs("SELECT * FROM v_UserView WHERE SysLoginName = '" + PropertyClass.SendNameValue + "'");

            for (int i = 0; i < 13; i++)

            {

                arylst.Add(P_ds.Tables[0].Rows[0][14 + i].ToString());

            }

            for (int j = 0; j < arylst.Count; j++)

            {

                if (arylst[j].ToString() == "False")

                {

                    menu[j].Visible = false;

                }

                else

                {

                    menu[j].Visible = true;

                }

            }

         }

在窗体初始化时执行相关操作,窗体初始化代码如下:

private void AppMain_Load(object sender, EventArgs e)

         {

            this.timer1.Start();

            this.statusUser.Text = "系统操作员:" + PropertyClass.SendNameValue;

            MenuIsVisible();

         }

单击菜单项时执行相应操作,菜单项代码如下:

private void Menu_Click(object sender, EventArgs e)

         {

            //声明对WinForm窗体进行操作的类对象        WinOperationClass P_Menu = new WinOperationClass();  

            //调用类中的方法,完成对窗体中ToolStripMenuItem控件相应项的操作

            P_Menu.ShowForm((ToolStripMenuItem)sender, this);   

         }

退出程序时执行退出确认,确认代码如下:

private void AppMain_FormClosing(object sender, FormClosingEventArgs e)

         {

            if (MessageBox.Show("确定要退出吗?", "提示对话框", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)

            {

                this.Dispose();

            }

            else

            {

                AppMain app = new AppMain();

                app.Show();

            }

         }

3.6.3 基础数据管理窗体设计

  1. 公司职员窗体(图12)
  2. 供应商信息窗体
  3. 客户基本信息窗体

1.窗体设计

在窗体中分别添加一个ToolStrip控件、一个GroupBox控件(包含Label控件、TextBox控件和ComboBox控件)和一个DataGridView控件。

图3-9员工信息窗体

2.代码设计

声明公共类SqlBaseClass和WinOperationClass两个全局对象,以及保存工具栏按钮操作状态的标识,代码如下:

SqlBaseClass G_SqlClass = new SqlBaseClass();  //声明数据库操作类的对象

         WinOperationClass G_OperationForm = new WinOperationClass();  //声明对窗体操作的类对象

         int G_Int_status;  //保存工具栏按钮操作状态

方法ControlStatus()控制控件状态,代码如下:

private void ControlStatus()

         {

            this.toolSave.Enabled = !this.toolSave.Enabled;

            this.toolAdd.Enabled = !this.toolAdd.Enabled;

            this.toolCancel.Enabled = !this.toolCancel.Enabled;

            this.toolAmend.Enabled = !this.toolAmend.Enabled;

           

            this.txtName.ReadOnly = !this.txtName.ReadOnly;

            this.txtPhoneH.ReadOnly = !this.txtPhoneH.ReadOnly;

            this.txtPhoneM.ReadOnly = !this.txtPhoneM.ReadOnly;

            this.txtAddress.ReadOnly = !this.txtAddress.ReadOnly;

            this.cbxSex.Enabled = !this.cbxSex.Enabled;

            this.cbxPost.Enabled = !this.cbxPost.Enabled;

            this.cbxDepartment.Enabled = !this.cbxDepartment.Enabled;

            this.dtBirthday.Enabled = !this.dtBirthday.Enabled;

            this.dgvUserInfo.Enabled = !this.dgvUserInfo.Enabled;

         }

方法FillControls()在控件中填充选中的DataGridView控件的数据,代码如下:

private void FillControls()

         {

            try

            {

                this.txtName.Text = this.dgvUserInfo[1, this.dgvUserInfo.CurrentCell.RowIndex].Value.ToString();

                this.txtPhoneH.Text = this.dgvUserInfo[6, this.dgvUserInfo.CurrentCell.RowIndex].Value.ToString();

                this.txtPhoneM.Text = this.dgvUserInfo[7, this.dgvUserInfo.CurrentCell.RowIndex].Value.ToString();

                this.txtAddress.Text = this.dgvUserInfo[8, this.dgvUserInfo.CurrentCell.RowIndex].Value.ToString();

                this.cbxDepartment.Text = this.dgvUserInfo[4, this.dgvUserInfo.CurrentCell.RowIndex].Value.ToString();

                this.cbxPost.Text = this.dgvUserInfo[5, this.dgvUserInfo.CurrentCell.RowIndex].Value.ToString();

                this.cbxSex.Text = this.dgvUserInfo[2, this.dgvUserInfo.CurrentCell.RowIndex].Value.ToString();

                this.dtBirthday.Value = Convert.ToDateTime(this.dgvUserInfo[3, this.dgvUserInfo.CurrentCell.RowIndex].Value.ToString());

            }

            catch { }

         }

方法ClearControls()将控件恢复到原始状态,代码如下:

private void ClearControls()

         {

            this.cbxDepartment.SelectedIndex = 0;

            this.cbxPost.SelectedIndex = 0;

            this.cbxSex.SelectedIndex = 0;

            this.txtAddress.Text = "";

            this.txtName.Text = "";

            this.txtPhoneH.Text = "";

            this.txtPhoneM.Text = "";

            this.dtBirthday.Value = DateTime.Now;

         }

在窗体初始化时执行相关操作,窗体初始化代码如下:

private void EmployeeInfo_Load(object sender, EventArgs e)

         {

            string cmdtxt = "SELECT UserID as 员工ID,Name as 员工姓名,Sex as 员工性别,Birthday as 出生日期,Department as 所属部门,Post as 所在职位";

            cmdtxt += ",PhoneH as 家庭电话,PhoneM as 手机号码,Address as 家庭住址FROM User";

            this.dgvUserInfo.DataSource = G_SqlClass.GetDs(cmdtxt).Tables[0];

            G_OperationForm.BindComboBox("SELECT * FROM tb_Post", cbxPost, "PostName");

            G_OperationForm.BindComboBox("SELECT * FROM tb_Department", cbxDepartment, "DepName");

            

            this.cbxSex.SelectedIndex = 0;   //设置默认选项

            this.cbxCondition.SelectedIndex = 0;

            this.dgvUserInfo.Columns[0].Visible = false;  //设置DataGridView控件隐藏列

         }

3.6.4 进货管理窗体设计

  1. 进货统计查询窗体(图13)
  2. 采购进货窗体
  3. 采购退货窗体

1.窗体设计

在窗体中分别添加GroupBox控件(包含Label控件、TextBox控件、RadioButton控件、DateTimePicker控件、Button控件和ComboBox控件)、一个DataGridView控件。

图3-10采购查询窗体

2.代码设计

【开始查询按钮】的Click事件代码如下:

private void btnSfind_Click(object sender, EventArgs e)

         {

            string strcmdtxt = String.Empty;

            string strselect = String.Empty;

            if (this.radioButton1.Checked)

            {

                strselect = "GoodsID LIKE '%" + this.txtGoodsID.Text + "%' AND GoodsName LIKE '%" + this.txtGoodsName.Text + "%'";

                strselect += " AND GoodsTime BETWEEN '" + this.dtStartTime.Value.ToString("yyyy-MM-dd") + "' AND ";

                strselect += "'" + this.dtEndTime.Value.ToString("yyyy-MM-dd") + "'";

                strcmdtxt = "SELECT GoodsID as 商品ID,GoodsName as 商品名称,GoodsTime as 进货日期,CompanyName as 公司名称";

                strcmdtxt += ",GoodsNum as 进货数量,GoodsUnit as 商品单位,GoodsPrice as 商品进价,DepotName as 所属仓库,GoodsSpec as 商品规格";

                strcmdtxt += ",SellPrice as 销售价格,NeedPay as 应付金额,HasPay as 实付金额,Remark as 备注 FROM Goods";

                strcmdtxt += " WHERE " + strselect + "";

                this.dgvGoodsInfo.DataSource = SqlClass.GetDs(strcmdtxt).Tables[0];       

            }

            if (this.radioButton2.Checked)

            {

                strselect = "GoodsID LIKE '%" + this.txtGoodsID.Text + "%' AND GoodsName LIKE '%" + this.txtGoodsName.Text + "%'";

                strselect += " AND ReGoodsTime BETWEEN '" + this.dtStartTime.Value.ToString("yyyy-MM-dd") + "' AND ";

                strselect += "'" + this.dtEndTime.Value.ToString("yyyy-MM-dd") + "'";

                strcmdtxt = "SELECT ReGoodsID as 退货ID,GoodsID as 进货ID,ReGoodsName as 商品名称,ReGoodsTime as 退货日期,ReGoodsNum as 退货数量";

                strcmdtxt += ",ReGoodsUnit as 商品单位,ReGoodsSpec as 商品规格,ReGoodsPrice as 进货价格";

                strcmdtxt += ",NeedPay as 应收金额,HasPay as 实收金额,ReGoodsResult as 退货原因 FROM ReGoods";

                strcmdtxt += " WHERE " + strselect + "";

                this.dgvGoodsInfo.DataSource = SqlClass.GetDs(strcmdtxt).Tables[0];

            }

        }

        private void btnCfind_Click(object sender, EventArgs e)

        {

            this.txtGoodsName.Text = "";

            this.txtGoodsID.Text = "";

            this.dtEndTime.Value = DateTime.Now;

            this.dtStartTime.Value = DateTime.Now;

         }

3.6.5 销售管理窗体设计

  1. 销售统计查询窗体(图14)
  2. 商品销售窗体
  3. 客户退货窗体

1.窗体设计

在窗体中分别添加GroupBox控件(包含Label控件、TextBox控件、Button控件和ComboBox控件)、一个DataGridView控件。

图3-11销售查询窗体

2.代码设计

在窗体初始化时执行相关操作,窗体初始化代码如下:

       private void SellFind_Load(object sender, EventArgs e)

        {

            string P_Str_cmdtxt = "SELECT SellID as 销售ID,GoodsID as 商品ID,GoodsName as 商品名称,GoodsNum as 销售数量";

            P_Str_cmdtxt += ",GoodsUnit as 商品单位,GoodsTime as 销售时间,GoodsSpec as 商品规格,GoodsPrice as 进货价格,SellPrice as 销售价格";

            P_Str_cmdtxt += ",NeedPay as 应收金额,HasPay as 实收金额,Remark as 备注 FROM Sell";

            this.dgvStockInfo.DataSource = SqlClass.GetDs(P_Str_cmdtxt).Tables[0];

            this.cbxCondition1.SelectedIndex = 0;

            this.cbxCondition2.SelectedIndex = 0;

        }

双击DataGridView控件时的事件代码如下:

       private void dgvStockInfo_DoubleClick(object sender, EventArgs e)

         {

            PropertyClass.GetDgvData = this.dgvStockInfo[2, this.dgvStockInfo.CurrentCell.RowIndex].Value.ToString();

            PropertyClass.GetGoodsID = this.dgvStockInfo[1, this.dgvStockInfo.CurrentCell.RowIndex].Value.ToString();

            PropertyClass.GetStockUnit = this.dgvStockInfo[4, this.dgvStockInfo.CurrentCell.RowIndex].Value.ToString();

            PropertyClass.GetGoodsInPrice = this.dgvStockInfo[7, this.dgvStockInfo.CurrentCell.RowIndex].Value.ToString();

            PropertyClass.GetSellPrice = this.dgvStockInfo[8, this.dgvStockInfo.CurrentCell.RowIndex].Value.ToString();

            PropertyClass.GetStockSpec = this.dgvStockInfo[6, this.dgvStockInfo.CurrentCell.RowIndex].Value.ToString();

            this.Close();

         }

3.6.6 库存管理窗体设计

  1. 库存统计查询窗体(图15)
  2. 库存调拨窗体
  3. 库存报警窗体

1.窗体设计

在窗体中分别添加GroupBox控件(包含Label控件、TextBox控件、Button控件和ComboBox控件)、一个DataGridView控件。

图3-12库存查询窗体

2.代码设计

【开始查询按钮】的Click事件代码如下:

private void btnFind_Click(object sender, EventArgs e)

         {

            string strselect = " WHERE GoodsName LIKE '%" + this.txtGoodsName.Text + "%' AND GoodsID LIKE '" + this.txtGoodsID + "%'";

            strselect += " AND StockNum LIKE '%" + this.txtStockNum.Text + "%' AND AlarmNum LIKE '%" + this.txtAlarmNum.Text + "%'";

            if (this.txtGoodsPrice.Text != "")

            {

                strselect += " AND GoodsPrice " + this.cbxCondition1.Items[this.cbxCondition1.SelectedIndex].ToString() + this.txtGoodsPrice.Text+"";

            }

            if (this.txtSellPrice.Text != "")

            {

                strselect += "AND SellPrice " + this.cbxCondition2.Items[this.cbxCondition2.SelectedIndex].ToString() + this.txtSellPrice.Text + "";

            }

            string strcmdtxt = "SELECT StockID as 库存ID,GoodsID as 商品ID,GoodsName as 商品名称,DepotName as 仓库名称";

            strcmdtxt += ",CompanyName as 供应商名称,StockNum as 库存数量,AlarmNum as 报警数量,GoodsUnit as 商品单位";

            strcmdtxt += ",GoodsTime as 进货时间,GoodsSpec as 商品规格,GoodsPrice as 进货价格,SellPrice as 销售价格";

            strcmdtxt += ",NeedPay as 应付金额,HasPay as 实付金额,Remark as 备注 FROM Stock " + strselect;

            this.dgvStockInfo.DataSource = SqlClass.GetDs(strcmdtxt).Tables[0];

        }

【开始查询按钮】的Click事件代码如下:

private void btnCancel_Click(object sender, EventArgs e)

         {

            this.txtAlarmNum.Text = "";

            this.txtGoodsID.Text = "";

            this.txtGoodsName.Text = "";

            this.txtGoodsPrice.Text = "";

            this.txtSellPrice.Text = "";

            this.txtStockNum.Text = "";

            StockFind_Load(sender, e);

         }

3.6.7 系统维护界面

  1. 系统用户设置窗体(图17)
  2. 用户权限窗体
  3. 更改密码窗体
  4. 数据备份窗体
  5. 数据还原窗体

1.窗体设计

在窗体中分别添加GroupBox控件(包含Label控件、TextBox控件、Button控件、ComboBox控件、ListBox控件和TreeView控件)和ErrorProvider控件。

图3-13系统用户设置窗体

2.代码设计

【设置/修改】按钮的Click事件的代码如下:

private void btnEdit_Click(object sender, EventArgs e)

         {

            if (this.cbxLogin.Text == "")

            {

                this.errorProvider1.SetError(this.cbxLogin, "登录身份不能为空!");

                return;

            }

            if (this.checkBox1.Checked && this.txtName.Text == "")

            {

                this.errorProvider1.SetError(this.txtName, "用户名不能为空!");

                return;

            }

            if (this.checkBox2.Checked && this.txtOkPwd.Text != this.txtPwd.Text)

            {

                this.errorProvider1.SetError(this.txtOkPwd, "两次输入密码不一致!");

                return;

            }

            if (this.checkBox2.Checked && this.txtPwd.Text.Length < 6)

            {

                this.errorProvider1.SetError(this.txtPwd, "输入密码不能小于6位!");

                return;

            }

            if (this.checkBox2.Checked && this.txtOkPwd.Text.Length < 6)

            {

                this.errorProvider1.SetError(this.txtOkPwd, "输入密码不能小于6位!");

                return;

            }

            //从树控件中读取设置的值

            ArrayList arylst = new ArrayList();

            foreach (TreeNode nodes in this.treeView1.Nodes)

            {

                foreach (TreeNode node in nodes.Nodes)

                {

                    if (node.Checked)

                    {

                        arylst.Add("1");

                    }

                    else

                    {

                        arylst.Add("0");

                    }

                }

            }

            if (this.labMessage.Text == "该用户已为系统用户")

            {

                //判断权限表中是否存在要设置权限的用户

                string P_Str_select2 = "SELECT * FROM User WHERE Name = '" + this.listBox1.SelectedValue.ToString() + "'";

                SqlDataReader P_dr4 = G_SqlClass.GetReader(P_Str_select2);

                P_dr4.Read();

                string loginame = String.Empty;

                if (P_dr4.HasRows)

                {

                    loginame = P_dr4["SysLoginName"].ToString();

                }

                P_dr4.Close();

                if (MessageBox.Show("是否确认修改?", "提示对话框", MessageBoxButtons.OKCancel, MessageBoxIcon.Information)

                    == DialogResult.OK)

                {

                    string P_Str_cmdtxt = String.Empty;

                    if (this.checkBox1.Checked)

                    {

                        string P_Str_select = "SELECT * FROM tb_User WHERE SysLoginName = '" + this.txtName.Text + "'";

                        SqlDataReader P_dr2 = G_SqlClass.GetReader(P_Str_select);

                        P_dr2.Read();

                        if (P_dr2.HasRows)

                        {

                            MessageBox.Show("该用户已存在!", "提示对话框", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            return;

                        }

                        else

                        {

                            P_Str_cmdtxt = "UPDATE User SET SysLoginName = '" + this.txtName.Text + "'";

                            P_Str_cmdtxt += " WHERE SysLoginName = '" + loginame + "'";

                            if (G_SqlClass.GetExecute(P_Str_cmdtxt))

                            {

                                string P_Str_cmdtxt2 = "UPDATE Popedom SET SysUserName='" + this.txtName.Text + "'  WHERE SysUserName = '" + loginame + "'";

                                G_SqlClass.GetExecute(P_Str_cmdtxt2);

                            }

                            else

                            {

                                MessageBox.Show("用户修改失败!", "提示对话框", MessageBoxButtons.OK, MessageBoxIcon.Information);

                                return;

                            }

                        }

                    }

                    if (this.checkBox2.Checked)

                    {

                        P_Str_cmdtxt = "UPDATE User SET Pwd = '" + G_WinFormClass.DESEncrypt(this.txtOkPwd.Text) + "'";

                        P_Str_cmdtxt += " where UserID = '" + PropertyClass.SendUserIDValue + "'";

                        if (!G_SqlClass.GetExecute(P_Str_cmdtxt))

                        {

                            MessageBox.Show("用户修改失败!", "提示对话框", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            return;

                        }

                        else

                        {

                            G_SqlClass.GetExecute(P_Str_cmdtxt);

                        }

                    }

                    MessageBox.Show("用户修改成功,系统下次启动后生效!", "提示对话框", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }

            }

            else

            {

                string P_Str_cmdtxt = String.Empty;

                string P_Str_update = String.Empty;

                string P_Str_select = String.Empty;

                //执行设置系统用户及权限的语句

                P_Str_cmdtxt = "INSERT INTO Popedom(SysUserSort,SysUserName,EmployeeInfo,CompanyInfo,CustomerInfo";

                P_Str_cmdtxt += ",GoodsInInfo,GoodsOutInfo,SellGoodsInfo,ReGoodsInfo,StockChangeInfo,StockAlarmInfo";

                P_Str_cmdtxt += ",SysUser,PopedomInfo,BakDataInfo,ReBakDataInfo) VALUES('" + this.cbxLogin.Text + "','" + this.listBox1.SelectedValue.ToString() + "'";

                P_Str_cmdtxt += "," + arylst[0].ToString() + "," + arylst[1].ToString() + "," + arylst[2].ToString() + "";

                P_Str_cmdtxt += "," + arylst[3].ToString() + "," + arylst[4].ToString() + "," + arylst[5].ToString() + "";

                P_Str_cmdtxt += "," + arylst[6].ToString() + "," + arylst[7].ToString() + "," + arylst[8].ToString() + "";

                P_Str_cmdtxt += "," + arylst[9].ToString() + "," + arylst[10].ToString() + "," + arylst[11].ToString() + "," + arylst[12].ToString() + ")";

                if (G_SqlClass.GetExecute(P_Str_cmdtxt))

                {

                    //获取权限表中最后一条记录

                    P_Str_select = "SELECT PopedomID FROM Popedom WHERE SysUserName = '" + this.listBox1.SelectedValue.ToString() + "'";

                    DataSet P_ds = G_SqlClass.GetDs(P_Str_select);

                    string P_Str_Num = P_ds.Tables[0].Rows[0][0].ToString();

                    P_Str_update = "UPDATE User SET SysLoginName = '" + this.listBox1.SelectedValue.ToString() + "'";

                    P_Str_update += ",Pwd='" + G_WinFormClass.DESEncrypt(this.txtOkPwd.Text) + "',PopedomID='" + P_Str_Num + "' WHERE Name = '" + this.listBox1.SelectedValue.ToString() + "'";

                    G_SqlClass.GetExecute(P_Str_update);

                    MessageBox.Show("权限设置成功,系统下次启动时生效!", "提示对话框", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }

                else

                {

                    MessageBox.Show("权限设置失败!", "提示对话框", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }

            }

         }

在ListControl上更改SelectedValue属性时引发SelectedValueChanged事件代码如下:

private void listBox1_SelectedValueChanged(object sender, EventArgs e)

         {

            string P_Str_cmdtxt2 = "SELECT * FROM User WHERE Name = '" + this.listBox1.SelectedValue.ToString() + "'";

            P_Str_cmdtxt2 += " AND SysLoginName IS NOT NULL";

            SqlDataReader P_dr1 = G_SqlClass.GetReader(P_Str_cmdtxt2);

            P_dr1.Read();

            if (!P_dr1.HasRows)

            {

                this.checkBox1.Enabled = false;

                this.checkBox2.Enabled = false;

                this.checkBox2.Checked = true;

                this.cbxLogin.Enabled = true;

                this.treeView1.Enabled = true;

                this.labMessage.Text = "该用户不为系统用户";

            }

            else

            {

                this.checkBox1.Enabled = true;

                this.checkBox2.Enabled = true;

                this.checkBox2.Checked = false;

                this.treeView1.Enabled = false;

                this.cbxLogin.Enabled = false;

                SqlDataReader P_dr2 = G_SqlClass.GetReader("SELECT UserID,Name,SysUserSort FROM v_UserView"

                    + " WHERE Name = '" + this.listBox1.SelectedValue.ToString() + "'");

                if (P_dr2.Read())

                {

                    PropertyClass.SendUserIDValue = P_dr2["UserID"].ToString();

                    this.cbxLogin.SelectedValue = P_dr2["SysUserSort"].ToString();

                }

                P_dr2.Close();

                this.labMessage.Text = "该用户已为系统用户";

            }

            P_dr1.Close();

         }

  • 结束语

本次课程设计,最大的收获是对课题研究方法有了熟练的掌握,对信息系统分析设计有了更熟练的运用,对系统整体架构有了很好的把握。从课题的现状和研究意义、工作方案和进度计划、系统可行性研究、到需求分析、到系统设计、再到系统实施,严格遵守软件设计流程,严格按照系统设计开发规范来组织进行,对自己的严密性、规范性等都有很好的指导意义。整个系统基本上实现了设计之初的目标,完成了系统规划阶段的构想。本系统是与自己的亲身经历紧密结合,因此容易从实际业务中获取系统需求、逻辑模型、系统功能结构以及数据组织与存储等,为本系统的设计开发提供了现实依据。不得不承认,限于水平有限,本系统还不够完善,如用户登录时帐户加解密问题、水晶报表问题,但可以肯定的是,我会在后面的学习中将其完善,从而使其具有实际开发和使用意义,使之趋于完善。

参考文献

  1. Alan Shalloway,James R. Trott,设计模式解析[M].徐言声.人民邮电出版社,2006-10-1
  2. Martin Fowler.企业应用架构模式[M].王怀民,周斌.机械工业出版社,2004-7
  3. STEVE JOHN METSKER.C#设计模式[M].颜炯.中国电力出版社,2007-12
  4. 邝孔武,邝志云.管理信息系统分析与设计[M].西安电子科技大学出版社,2006
  5. 王珊,李盛恩.数据库基础与应用[M].人民邮电出版社,2005
  6. 林锐.软件工程思想[M].西安电子科技大学出版社,2000
  7. James Foxall.Visual C# 2005入门经典[M].人民邮电出版社,2007
  8. 严蔚敏,吴伟民.数据结构[M].清华大学出版社,2005
  9. Nagel,Evjen,Glynn,etc.C#高级编程[M].第4版.清华大学出版社,2006
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在使用本系统时,请按照以下流程进行操作: (1)在“系统维护”菜单中的“数据清理”模块中清空原始数据。 (2)在“系统维护”菜单中的“系统管理设置”模块设置本单位的操作员。 (3)在“系统维护”菜单中的“本单位信息”模块中设置本单位信息。 (4)在“基础数据”菜单中设置基本信息。 (5)在“库存管理”菜单中的“库存状况”模块中设置商品的库存上下限。 (6)在“进货管理”菜单中的“进货单”模块中添加商品的进货信息。 (7)在“进货管理”菜单中的“进货退货单”模块中可以添加进货退货信息。 (8)在“进货管理”菜单中的“进货分析”模块和“进货统计(含退货)”模块中可以查看到所有的进货信息和进货退货信息。 (9)在“销售管理”菜单中的“销售单”模块中添加销售信息。 (10)在“销售管理”菜单中的“销售退货单”模块中添加销售退货信息。 (11)在“销售管理”菜单中的“销售统计(不含退货)”模块和“月销售状况”模块中查看销售记录和销售退货记录。 (12)在“销售管理”菜单中的“商品销售排行”模块中可以查看某一时间段的销售排行榜。 (13)在“销售管理”菜单中的“销售成本表”模块中可以查看商品的成本及毛利。 (14)在“销售管理”菜单或“进货管理”菜单中的“往来对账”模块中查看与某单位间的账目情况。 (15)在“库存管理”菜单中的“库存上限报警”、“库存下限报警”模块中查看商品的库存数量。 (16)在“库存管理”菜单中的“库存盘点”模块中设置盘点数量。 (17)在“系统维护”菜单中可以对系统数据进行清理及备份。 (18)“辅助工具”和“系统信息”菜单中提供了一些辅助功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值