大家好,今天给大家介绍基于C#+c+sqlserver的办公耗材库存管理软件设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。
文章目录:
项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:12003个字32页
包含内容:整套源码+完整毕业论文
资源文件目录简图如下:
提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。
引言
省略
1.1 系统的背景和意义
省略
库存管理系统是基于先进的软件和高速基础上的新型存储管理模式通过集中式的信息数据库,将企业的调、存、转等企业的经营业务有机的结合起来,达到数据共享、降低成本、提高效率、改进服务等目的。主要作用是:提高管理效率降低人工成本;降低采购成本;及时调整营销策略,防止价格流失;减少仓储面积,提高房产综合利用率;降低储备资金占用。
1.2 系统设计目标
1.3 系统的开发工具
1.3.1 开发环境
B/S模式介绍:
B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WEB浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN、WAN、Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。
.NET介绍
.NET 就是 Microsoft® 的 XML Web 服务平台。不论操作系统或编程语言有何差别,XML Web 服务能使应用程序在 Internet 上传输和共享数据。
Microsoft® .NET 平台包含广泛的产品系列,它们都是基于XML和Internet行业标准构建,提供从开发、管理、使用到体验 XML Web 服务的每一方面。XML Web 服务将成为您今天正在使用的 Microsoft® 的应用程序、工具和服务器的一部分——并且将要打造出全新的产品以满足您所有业务需求。 更具体地说,Microsoft 正在五个方面创建 .NET 平台,即工具、服务器、XML Web 服务、客户端和 .NET 体验。Web服务从由简单网页构成的静态服务网站,发展到可以交互执行一些复杂步骤的动态服务网站,这些服务可能需要一个Web服务调用其他的Web服务,并且像一个传统软件程序那样执行命令。这就需要和其他服务整合,需要多个服务能够一起无缝地协同工作,需要能够创建出与设备无关的应用程序,需要能够容易地协调网络上的各个服务的操作步骤,容易地创建新的用户化的服务。
C#介绍
微软推出C#(C sharp) 是微软对这一问题的解决方案。C#是一种最新的、面向对象的编程语言。它使得程序员可以快速地编写各种基于Microsoft .NET平台的应用程序,Microsoft .NET提供了一系列的仅是开发一个“标志性”的版本。C#在设计时就考虑了这些问题。它使开发者用更少的代码做更多的事,同时也不易出错。支持现有的网络编程新标准 新的应用程序开发模型意味着越来越多地解决方案依赖于新出现的网络标准,例如HTML,XML,SOAP等。现存的开发工具往往都是早于Internet出现的,或者是在我们所熟知的网络还处于孕育期时出现的。所以,它们一般工具和服务来最大程度地开发利用计算与通讯领域。正是由于C#面向对象的卓越设计,使它成为构建各类组件的理想之选。无论是高级的商业对象还是系统级的应用程序。使用简单的C#语言结构,这些组件可以方便的转化为XML 网络服务,从而使它们可以由任何语言在任何操作系统上通过Internet进行调用。最重要的是,C#使得C++程序员可以高效的开发程序,而绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。效率与安全性新兴的网络经济迫使商务企业必须更加迅速的应对竞争的威胁。开发者必须不断缩短开发周期,不断推出应用程序的新版本,而不仅无法很好地支持最新的网络技术。
MS SQL Server 介绍
SQL Server 还为数据库管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应。从而获得竞争优势。从数据和分析角度看,将原始数据转化为商业只能和充分利用Web带来的机会非常重要。作为一个完整的数据库和数据分析包,SQL Server 为快速开发新一代企业级商业应用程序,为企业赢得了核心竞争优势。
1.3.2 编程运行环境
本系统的开发环境为:
硬件环境:
CPU: AMD Sempron™ 2400+
内存:512 MB
硬盘:80 G
软件环境:
操作系统:Microsoft Windows XP
应用软件:SQL Server + Microsoft Visual Studio
2 系统需求分析
本系统目的是让管理者能够对仓库存储进行更有效,更经济,更方便地管理而开发的。
2.1 用户身份级别要求
即根据身份的不同对系统的使用权限有所不同。从权限大小大致可以分为:系统管理员、一般注册用户、未注册用户。系统提供灵活的角色设定和权限的分配功能。
2.2 系统功能模块设置
3 库存管理系统总体设计
3.1 数据库设计
省略
根据毕业设计库存管理系统的一般要求,再通过需求分析得出系统的实体表:用户管理表:ADMIN_LIST,总库存表:GOODS_LIST,货物明细表:GOODS_LIST,货物种类表:GOODS_TYPES,货物名表:GOODSNAME_LIST,进货明细表:JINHUO_LIST,出货明细表:CHUHUO_LIST,货物调拨表:MOVE_LIST,盘点表:PanDian_LIST,货物损坏表:SUNHUAI_LIST。共10张表。
根据系统运行分析和数据流程分析,设计出实际的数据库实体,以及他们之间的关系,为后边的数据库逻辑结构设计打基础。这些实体包括各种具体信息,通过相互之间的作用形成数据的流动。通过Microsoft Office Visio 软件绘制出表与表之间的逻辑关系。(如图1)
图1 库存管理系统E-R图
经过前面的需求分析和数据库表的逻辑结构设计。系统采用Microsoft SQL Server 2000作为数据库开发工具,创建名为KunCunManage数据库,根据数据功能的实现和将来系统功能的扩展,设计如下数据项:
3.2 系统模块分析与设计
图2 库存管理功能模块
3.3 界面设计
本系统采用蓝色基调,橙色,棕褐色,白色,红色为辅调。由于系统是基于WEB页面的,所以界面设计必须符合以完成网站可视性阅读功能为目的。
橙色具有明亮、华丽、健康、兴奋、温暖、欢乐、辉煌、以及容易动人的色感,在空气中的穿透力仅次于红色,而色感较红色更暖,最鲜明的橙色应该是色彩中感受最暖的色,能给人有庄严、尊贵、神秘等感觉,所以基本上属于心理色性。现代社会上往往作为标志色和宣传色。不过也是容易造成视觉疲劳的色。故将它用户注册界面的主色调,如图3
图4 主界面
颜色,是生物在年轻时的代表(成熟色是绿色)。在心理暗示来说,天蓝和粉红色一样,都是“安抚色”,是令人安静并放松的颜色。白色在系统中主要作为背景色,导航栏字体颜色。白色视觉度,注目度都比较高,因为白色为全色相,所以也能满足本管理系统用户心理要求,加之与蓝色配合,使整个系统更具阅读可视性,操作易用性。整个系统看起来颇大气,富有立体感。再者,白色代表纯洁、简单、洁净。如图4:
代表和谐、统一、优雅、高贵的白色,混以深思、平和的灰色,携带宁静的蓝色和充满大自然气息的棕色,这些宁静色系可以营造出舒适宽广的空间感,给人柔美、高雅与平和的感觉,整体风格清淡雅致、宁静安稳。故放在历史查询界面,调节主界面单一的色调。如图5:
图5 盘点表查询界面
3.4 系统流程图
用户进入系统登录页面后,输入用户名和密码,点击确定后,系统将根据用户输入的用户名和密码判断该用户是否为合法用户;如果用户输入的用户名和密码出错,系统将提示出错,并返回到登录界面;如果用户输入的用户名和密码正确,系统将根据用户的身份选择相应的主页以及功能;所有合法用户在处理完业务后,都需要进行退出登录,以免被他人窃取信息。退出后,将返回到登录界面。如图6:
4 库存管理系统功能模块的具体实现
4.1 系统主要功能模块的实现及部分代码
4.1.1 用户注册和登录界面
在用户注册时首先检测该用户注册的用户名是否可用,即检查数据库该用户名是否已经存在,代码如下:
ConnectionSQL sqlcon1 = new ConnectionSQL();
string User;
User = TextBox1.Text.Trim();
SqlDataReader UserReader = sqlcon1.SqldataReader("select *from ADMIN_LIST where UserId='" + User + "'");
if (UserReader.Read())
{
Label5.Text = "该用户名已经被使用,请重新注册";
}
else
{
Label5.Text = "该用户名可以使用";
}
检测完后,再判断注册用户输入的密码是否为空,若为空,则弹出“密码不能为空”的对话框;若不为空,则检测注册用户输入的密码与确认密码是否吻合,代码如下:
if (Password =="")
{
HttpContext.Current.Response.Write("");
}
else
{
if (Password != Surepassword)
{
HttpContext.Current.Response.Write("");
}
else
{
sqlcon.Sqldataset("insert ADMIN_LIST(UserId,Password,Jurisdiction)values('" + User + "','" + Password + "','1')");
HttpContext.Current.Response.Write("");
// Label4.Text = "恭喜,用户注册成功,请点击返回登录";
TextBox1.Text = null;
}
}
对于密码过长的限制,在前台使用了RegularExpressionValidator验证控件,通过输入.{0,10}表达式,将密码长度限制在10个字符以下。
在用户登录界面,除了对用户名与密码的合法性验证外,还要将管理员权限的值赋给Session[“Right”]这个全局变量,目的是为了以后方便对用户权限的判断。具体代码如下:
User = TextBox1.Text.Trim();
PassWord = TextBox2.Text.Trim();
SqlDataReader UserReader = skycon1.SqldataReader("select * from ADMIN_LIST where UserId='" + User + "' and Password='" + PassWord + "'");
if (UserReader.Read())
{
if (UserReader.GetString(2).Trim()=="2")
{
Session["Right"]= "2";
}
HttpContext.Current.Response.Write("");
UserReader.Close();
}
else
{
Label3.Text = "你输入的用户名和密码不正确,请重新输入";
UserReader.Close();
}
4.1.2 进货作业
进货作业是库存管理系统中最为重要的模块之一,上面的模块设计中已经分析了进货作业中存在的几种情况,除此之外,系统还要判断管理员是否出现输入有误现象。如输入的种类号与种类名不相符时,货物号与货物名不相符合时,系统都应该报错,但这两种出现的几率不是很大,为了减轻服务器负担,并没有把这些判断加入到系统中,只是对管理员输入时进行默认,认为输入的对应的货物种类和名称都是相符合的。当输入的仓库号与货物所属仓库不一致时(同种类的货物都存放在一个仓库中),由于此类错误出现的几率很大,所以在系统中加入了判断,如出现错误,则系统弹出“您输入的仓库号与物品仓库号不符合,请重新输入”的对话框。对与管理员输入的进货数量,进货价的合法性判断都采用了RegularExpressionValidator验证控件进行判断,以减少后台的操作。具体代码如下:
DataSet dt1 = skycon1.Sqldataset("select *from GOODS_DETAIL where HuoWuId='" + HuoWuId + "' and BusinessId='" + BusinessId + "'");
if (dt1.Tables[0].Rows.Count != 0)//当该物品在明细表中已经存在时:
{
DataSet dt2 = skycon1.Sqldataset("select *from GOODS_LIST where TypeId='" + TypeId+"'");//GooddataRow["TypeId"].ToString()
if (dt2.Tables[0].Rows.Count != 0)
{
DataRow GooddataRow1 = dt2.Tables[0].Rows[0];
//判断仓库号
if (StoreHouseId != GooddataRow1["StoreHouseId"].ToString().Trim())
{
HttpContext.Current.Response.Write("");
}
else
{
skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");
DataRow GooddataRow = dt1.Tables[0].Rows[0];
SiQtyG = (int)GooddataRow["SiQty"] + JinhuoSiQty;
EnterPriceG = ((decimal)GooddataRow["EnterPrice"] * (int)GooddataRow["SiQty"] + EnterTotalprice) / ((int)GooddataRow["SiQty"] + JinhuoSiQty);
skycon1.SqlExcute("update GOODS_DETAIL set SiQty=" + SiQtyG.ToString() + ",EnterPrice=" + EnterPriceG.ToString() + "where HuoWuId='" + HuoWuId + "' and BusinessId='" + BusinessId + "'");
//更新细表
int SiQtyG1 = (int)GooddataRow1["SiQty"] + JinhuoSiQty;
decimal StorePrice = (decimal)GooddataRow1["StorePrice"] + EnterTotalprice;
skycon1.SqlExcute("update GOODS_LIST set SiQty=" + SiQtyG1.ToString() + ",StorePrice=" + StorePrice.ToString() + "where TypeId='" + TypeId + "'");//GooddataRow["TypeId"].ToString()
//更新总表
HttpContext.Current.Response.Write("");
}
}
else
{
HttpContext.Current.Response.Write("");
}
}
else
{
//如果是同种类不同名字的或不同产家的货物则执行下列步骤;
DataSet dt4 = skycon1.Sqldataset("select *from GOODS_LIST where TypeId='" + TypeId + "'");
DataSet dt5 = skycon1.Sqldataset("select *from GOODS_DETAIL where HuoWuId='" + HuoWuId + "'");
if(dt4.Tables[0].Rows.Count!=0)
{
if (dt5.Tables[0].Rows.Count != 0)//同种类同名但没有该厂家的货物
{
DataRow GooddataRow = dt4.Tables[0].Rows[0];
int SiQtyG2 = (int)GooddataRow["SiQty"] + JinhuoSiQty;
decimal StorePrice1 = (decimal)GooddataRow["StorePrice"] + EnterTotalprice;
if (StoreHouseId != GooddataRow["StoreHouseId"].ToString().Trim())//判断仓库号
{
HttpContext.Current.Response.Write("");
}
else
{
skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");
skycon1.SqlExcute("insert GOODS_DETAIL(HuoWuId,BusinessId,HuoWuName,TypeId,SiQty,EnterPrice)values('" + HuoWuId + "','" + BusinessId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + ")");
skycon1.SqlExcute("update GOODS_LIST set SiQty=" + SiQtyG2.ToString() + ",StorePrice=" + StorePrice1.ToString() + "where TypeId='" + TypeId + "'");
HttpContext.Current.Response.Write("");
}
}
else//同种类没有该名字的货物
{
DataRow GooddataRow = dt4.Tables[0].Rows[0];
int SiQtyG3 = (int)GooddataRow["SiQty"] + JinhuoSiQty;
decimal StorePrice1 = (decimal)GooddataRow["StorePrice"] + EnterTotalprice;
if (StoreHouseId != GooddataRow["StoreHouseId"].ToString().Trim())//判断仓库号
{
HttpContext.Current.Response.Write("");
}
else
{
skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");
skycon1.SqlExcute("insert GOODS_DETAIL(HuoWuId,BusinessId,HuoWuName,TypeId,SiQty,EnterPrice)values('" + HuoWuId + "','" + BusinessId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + ")");
skycon1.SqlExcute("insert GOODSNAME_LIST(HuoWuId,HuoWuName)values('" + HuoWuId + "','" + HuoWuName + "')");
skycon1.SqlExcute("update GOODS_LIST set SiQty=" + SiQtyG3.ToString() + ",StorePrice=" + StorePrice1.ToString() + "where TypeId='" + TypeId + "'");
HttpContext.Current.Response.Write("");
}
}
}
else //如果是新种类的货物,则执行下列步骤;
{
skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");
skycon1.SqlExcute("insert GOODS_LIST(TypeName,TypeId,SiQty,StoreHouseId,StorePrice)values('"+TypeName+"','"+TypeId+"','"+JinhuoSiQty.ToString()+"','"+StoreHouseId+"','"+EnterTotalprice.ToString()+"')");
skycon1.SqlExcute("insert GOODS_DETAIL(HuoWuId,BusinessId,HuoWuName,TypeId,SiQty,EnterPrice)values('" + HuoWuId + "','" + BusinessId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + ")");
skycon1.SqlExcute("insert GOODS_TYPES(TypeId,TypeName)values('" + TypeId + "','" + TypeName + "')");
skycon1.SqlExcute("insert GOODSNAME_LIST(HuoWuId,HuoWuName)values('" + HuoWuId + "','" + HuoWuName + "')");
HttpContext.Current.Response.Write("");
}
}
4.1.3 库存盘点
库存盘点是库存管理中相对较为关键的一环,由于专业知识所限,这个模块功能不是很全面,盘盈和盘亏的计算是通过将实际盘存的货物数量与数据库中的库存数量进行相减,得到正值即为盘盈,负值为盘亏。代码如下:
if (PanDianSiQty >= StoreSiQty)
{
PanY = OutPrice * (PanDianSiQty - (int)DataGoodDetail["SiQty"]);
sqlcon1.SqlExcute("insert PanDian_LIST(HuoWuId,HuoWuName,BusinessId,PanDianSiQty,StoreSiQty,OutPrice,PanY,DateTime)values('" + HuoWuId +
"','" + HuoWuName + "','" + BusinessId + "'," + PanDianSiQty.ToString() + "," + StoreSiQty.ToString() + "," + OutPrice.ToString() + "," + PanY + ",'" + Datetime + "')");
TextBox3.Text = PanY.ToString();
TextBox4.Text = null;
}
else
{
PanK = OutPrice * ((int)DataGoodDetail["SiQty"] - PanDianSiQty);
sqlcon1.SqlExcute("insert PanDian_LIST(HuoWuId,HuoWuName,BusinessId,PanDianSiQty,StoreSiQty,OutPrice,PanK,DateTime)values('" + HuoWuId +
"','" + HuoWuName + "','" + BusinessId + "'," + PanDianSiQty.ToString() + "," + StoreSiQty.ToString() + "," + OutPrice.ToString() + "," + PanK + ",'" + Datetime + "')");
TextBox4.Text = PanK.ToString();
TextBox3.Text = null;
}
4.2系统实现的关键技术
4.2.1 数据库的连接技术
过去,通过ADO的数据存取采用了两层的基于连接的编程模型。随着多层应用的需求不但增加,程序员需要一个无连接的模型。ADO.NET就应运而生了。ADO.NET的Managed Provider就是一个多层结构的无连接的一致的编程模型。Managed Provider提供了DataSet和数据中心(如MS SQL)之间的联系。Managed Provider包含了存取数据中心(数据库)的一系列接口。主要有三个部件:(1)连接对象Connection、命令对象Command、参数对象Parameter提供了数据源和DataSet之间的接口。DataSetCommand接口定义了数据列和表映射,并最终取回一个DataSet。(2)数据流提供了高性能的、前向的数据存取机制。通过IdataReader,你可以轻松而高效地访问数。(3)更底层的对象允许你连接到数据库,然后执行数据库系统一级的特定命令。
过去,数据处理主要依赖于两层结构,并且是基于连接的。连接断开,数据就不能再存取。现在,数据处理被延伸到三层以上的结构,相应地,程序员需要切换到无连接的应用模型。这样,DataSetCommand就在ADO.NET中扮演了极其重要的角色。它可以取回一个DataSet,并维护一个数据源和DataSet之间的“桥”,以便于数据访问和修改、保存。DataSetCommand自动将数据的各种操作变换到数据源相关的合适的SQL语句。从图上可以看出,四个Command对象:SelectCommand、InsertCommand、UpdateCommand、DeleteCommand分别代替了数据库的查询、插入、更新、删除操作。
为了方便系统调用数据库连接,减少后台代码量,提高连接效率。我们把几个常用的方法都封装在ConnectionSQL这个类里面,以下是连接数据库代码:
public class ConnectionSQL:System.IDisposable
{
private SqlConnection sqlcon1=null;
public ConnectionSQL()
{
sqlcon1=new SqlConnection("server=localhost;uid=sa;pwd=;database=KuCunManage");
// // TODO: 在此处添加构造函数逻辑 //
}
public int SqlExcute(string s1) // 返回一个BOOL值 //
{
try
{
int i;
if(sqlcon1.State==ConnectionState.Closed)
sqlcon1.Open();
SqlCommand com1 = new SqlCommand(s1,sqlcon1);
i=com1.ExecuteNonQuery();
return i;
}
finally
{
sqlcon1.Close();
}
}
public SqlDataReader SqldataReader(string s1)
{
try
{
if (sqlcon1.State == ConnectionState.Closed)
sqlcon1.Open();
SqlDataReader read1;
SqlCommand com1 = new SqlCommand(s1, sqlcon1);
read1 = com1.ExecuteReader();
return read1;
}
finally
{
}
}
public DataSet Sqldataset(string s1) // 返回第一张表 //
{
try
{
if (sqlcon1.State == ConnectionState.Closed)
sqlcon1.Open();
SqlDataAdapter Sqlada1 = new SqlDataAdapter(s1, sqlcon1);
DataSet dt1 = new DataSet();
Sqlada1.Fill(dt1, "table1");
return dt1;
}
finally
{
sqlcon1.Close();
}
}
//销毁对象;
public virtual void Dispose(bool flag)
{
if (flag == true)
{
sqlcon1.Close();
}
sqlcon1 = null;
}
public void Dispose()
{
GC.SuppressFinalize(true);
this.Dispose(true);
}
}
5 系统功能的测试与分析
5.1 用户注册功能测试与分析
未注册用户在登录界面中点击“注册”,然后系统跳转到注册界面,在注册界面中未注册用户在“用户名”栏中填入“qq”,点击“检测该用户名是否可用”按钮,系统显示该“用户名可以使用”,说明这个用户与系统用户名没有重复,可以使用。然后输入密码“123”与确认密码“123”,最后按“确定”,这时候在系统中就生成了一个名为“qq”的用户。操作如图7:
图7 用户注册操作
然后我们我们通过“xujue”这个最高级管理员进入系统,查看该注册用户的信息。进入用户管理页面后,我们点击“显示一般用户”按钮,则显示如图8:
图8 一般用户显示
我们现在想把“qq”用户的管理权限提升为“2”,即让他成为管理员。我们点击“编辑”,然后在权限栏中将“1”改为“2”,这时候我们点击显示管理员:如图9:
图9 管理员显示
让我们重新返回登录界面,此时我们以“qq”的身份进入系统,验证成功,系统弹出“登录成功”的对话框,点击“确定”,这时候就进入了系统。如图10、图11:
5.2 进货作业功能测试与分析
我们通过管理员身份登录系统,然后进入进货作业界面,在对应的栏中我们分别填入货物号:“01”、货物种类号:“1”、货物名:“墨盒1”、种类名:“墨盒”、进货数量:“10”、进货价:“45.6”、仓库号:“1”、厂家号:“A”。如图12:
图12 输入进货信息
然后点击“确定”,系统弹出“进货成功”信息,此时系统就向进货单中添加了一条记录。我们可以通过库存查询功能来查看相应的信息。(图13 、图14)
图14 进货后货物明细表中的信息
当我们将仓库号改变,将“1”改为“2”,其他信息与上次相同,再次进行进货作业时,系统会弹出“您输入的仓库号与货物仓库号不符合,请重新输入”对话框,因为我们前面定义了同种类的货物只能放在一个仓库中,当输入的仓库号不符时,系统会报错。如图15:
图15 仓库号输入有误信息
5.3 库存盘点功能测试与分析
我们进入库存盘点页面,这时候货物明细表中墨盒1的数量为“30”,出售价格为“50”在货物名下拉菜单中选择“墨盒1”,厂家名中输入“A”。
图16 盘盈信息
2) 当我们输入盘点数量为28时,点击确定后系统显示盘亏:“100”元,如图17:
图17 盘亏信息
3) 当我们重新选择“墨盒1”,但是输入的厂家为“B”时,由于明细表中墨盒1的厂家没有为“B”的,系统将提示“没有您所输入厂家的物品,请重新输入”如图18:
结 论
省略
参考文献
[1] 王俊伟,史创明. SQL Server 2000 数据库管理与应用 [M].北京:清华大学出版社,2006。
[2] 徐国智,汪孝宜. SQL Server 数据库开发实例精粹 [M]. 北京:电子工业出版社,2006。
[3] 王黯,马里杰. SQL Server 数据库开发经典案例解析 [M].北京:清华大学出版社,2006。
[4] 方睿. 网络数据库原理及应用 [M]. 成都:四川大学出版社,2005。
[5] 黄忠成. 深入剖析ASP.NET组件设计[M].北京:电子工业出版社,2005。
[6] Mickey Williams[美].Visual C# .NET技术内幕[M].北京:清华大学出版社,2004。
[7] 吉根林,崔海源. ASP.NET程序设计教程 [M].北京:电子工业出版社,2004。
[8] 金雪云. ASP.NET简明教程 [M].北京:清华大学出版社,2003。
致 谢
省略
本项目源码及完整论文如下,有需要的朋友可以点击进行下载
序号 | 毕业设计全套资源(点击下载) |
---|---|
本项目源码 | 基于C#+c+sqlserver的办公耗材库存管理软件设计与实现(源码+文档)_C#_BS架构_库存管理软件.zip |