仓库管理系统的设计与实现Word文件下载.docx
《仓库管理系统的设计与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《仓库管理系统的设计与实现Word文件下载.docx(33页珍藏版)》请在冰豆网上搜索。
在本系统的设计过程中,为了克服这些困难,满足计算机管理的需要,采取了下面的一些原则:
统一各种原始单据的格式,统一账目和报表的格式。
删除不必要的管理冗余,实现管理规范化、科学化。
程序代码标准化,软件统一化,确保软件的可维护性和实用性。
界面尽量简单化,做到实用、方便,尽量满足企业中不同层次员工的需要。
建立操作日志,系统自动记录所进行的各种操作。
1、系统功能分析
本例中的仓库管理系统需要完成的功能主要有以下几点:
·
仓库管理各种信息的输入,包括入库、出库、还库、需求信息的输入等。
仓库管理各种信息的查询、修改和维护。
设备采购报表的生成。
在库存管理中加入最高储备和最低储备字段,对仓库中的物资设备实现监控和报警。
企业各部门的物资需求的管理。
操作日志的管理。
仓库管理系统的使用帮助。
2、系统功能模块设计
在系统功能分析的基础上,结合VisualC++程序编制的特点,得到如图1所示的系统功能模块图。
图1系统功能模块图
系统主要界面及流程如下所示。
程序开始运行之后先出现如图2的登陆界面。
成功输入用户名和密码后将进入主对话框。
图2登陆界面
单击“设备代码”按钮进入设备代码表(device_code)的管理。
单击“库存信息”按钮进入现有库存表(device)的管理。
单击“设备入库”按钮开始设备入库操作,若成功,则在设备入库表(device_in)中增加一条记录,同时修改现有的库存表(device)中的相关数据。
单击“设备出库”按钮开始设备出库操作,如图3所示。
若成功,则在设备出库表(device)中的相关数据。
图3设备出库登记窗口
单击下方的“出库信息”按钮进入设备出库表(device_out)的管理。
如图4所示。
图4出库信息管理界面
单击“设备还库”按钮开始设备还库操作。
若成功,则在设备还库表(device_return)中增加一条记录,同时修改现有库存表(device)中的相关数据。
单击下方的“还库信息”按钮进入设备还库表(device_return)的管理。
单击“设备需求”进入设备需求登记的界面,如图5所示。
用户在这里填写设备需求。
若成功,则在设备需求表(device_need)中增加一条设备需求记录。
图5设备需求登记窗口
单击下方“需求信息”按钮进入设备需求表(device_need)的管理。
如图6所示。
单击“操作日志”按钮查看目前的所有操作日志记录,在里面还可以删除所有日志记录。
单击“帮助”按钮进入联机帮助。
单击“关于”按钮查看程序信息
图6需求信息管理窗口
三、数据库设计
1、数据库需求分析
在仔细调查企仓库物资设备管理过程的基础上,得到本系统所处理的数据流程,如图7所示。
图7数据流程图
针对本实例,通过对企业仓库管理的内容和数据流程的分析,设计的数据项和数据结构如下:
设备代码信息:
其数据项有设备号、设备名称
现有库存信息:
其数据项有现有设备、现有数目、总数目、最大库存和最小库存等
设备使用信息:
其数据项有使用的设备、使用部门、数目、使用时间和出库时状态等
设备采购信息:
其数据项有采购的设备、采购员、供应商、采购数目和采购时间等
设备归还信息:
其数据项归还设备、归还部门、归还数目、归还时间和经手人等
设备需求信息:
其数据项有需求的部门、需求设备、需求数目和需求时间等
2、数据概念结构设计
这一设计阶段是在需求分析的基础上,设计出能满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。
本实例根据上面得设计规划出实体有库存实体,入库实体、出库实体、采购实体、还库实体和需求实体。
各实体的E-R图及其关系描述如下:
图8库存实体E-R图
图9入库实体E-R图
图10出库实体E-R图
图11部门需求实体E-R图
图12还库实体E-R图
图13计划采购实体E-R图
图14实体和实体之间的关系E-R图
3、数据库逻辑结构设计
在上面的实体以及实体之间的关系的基础上,形成数据库中的表格和各个表格之间的关系。
仓库管理系统数据库中的各个表格的设计结果如下面的几个表格所示。
每个表格表示在数据库中的一个表。
列名
数据类型
可否为空
说明
Code
VARCHAR2(6)
NOTNULL
设备号(主键)
Name
VARVHAR2(20)
NULL
设备名称
设备代码表device_code
Code
NOTNULL
设备号
In_date
DATE
入库时间(主键)
Provider
VARCHAR2(20)
NULL
供应商
Teleno
供应商电话
In_number
NUMBER(6)
入库数量
Price
价格
Buyer
VARCHAR2(10)
采购
设备库表device_in
列名
Department
使用部门
Out_date
出库时间(主键)
Out_state
NUMBER
(1)
出库状况
Out_person
经手人
Out_number
NUMBER2(10)
出库数量
Taker
领取
Usage
用途
设备出库表device_out
数据类型
可否为空
说明
code
NOTNULL
设备号(主键)
now_number
现有库存
high_number
最大库存
low_number
最小库存
total_number
总数
现有数据库表device
department
部门名称
need_number
需要数量
begin_date
需求开始时间
end_date
MULL
需求结束时间
设备需求表device_need
return_date
还库时间(主键)
keeper
仓库管理员
return_number
归还数量
return_person
归还人
设备还库表device_return
do_user
操作员
do_what
VARCHAR2(40)
操作内容
do_date
操作时间
操作日志表howdo
总库存
max_number
购买数量
provider
VARCHAR
(2)
price
buy_date
计划采购时间(主键)
设备采购计划表device_wantbuy
4、数据库结构的实现
创建设备代码device_code
CREATETABLE“DMS”.device_code
(codeVARCHAR2(6)NULL,
nameVARCHAR2(20)NULL,
CONSTRANTcode_code_pkPRIMARYKEY(code)
)
TABLESPACE”USER_DATA”;
创建设备入库表device_in
CREATETABLE“DMS”.device_in
(
codeVARCHAR2(6)NOTNULL,
in_dateDATENOTNULL,
providerVARCHAR2(20)NULL,
telenoVARCHAR2(10)NULL,
in_numberNUMBER(6)NULL,
priceNUMBER(6)NULL,
buyerVARCHAR2(10)NULL,
CONSTRAINTin_date_pkPRIMARYKEY(in_date)
TABLESPACE“USER_DATA”;
创建设备出库表device_out
CREATETABLE“DMS”.device_out
departmentVARCHAR2(20)NULL,
out_dateDATENULL,
out_stateNUMBER
(1)NULL,
out_pensonVARCHAR2(20)NULL,
out_numberNUMBER(6)NOTNULL,
takerVARCHAR2(10)NULL,
usageVARCHAR2(20)NULL,
CONSTRAINTout_date_pkPRIMARYKEY(out_date)
创建现有库存表device
CREATETABLE”DMS”.device
codeVARCHAR2(6)NULL,
now_numberNUMBER(6)NULL,
high_numberNUMBER(6)NULL,
low_numberNUMBER(6)NULL,
total_numberNUMBER(6)NULL,
CONSTRAINTdevice_code_pkPRIMARYKEY(code)
创建部门需求表device_need
CREATETABLE“DMS”,device_need
codeVARCHAR2(10)NOTNULL,
departmentVARCHAR2(10)NOTNULL,
need_numberNUMBER(6)NULL,
begin_dateDATENULL,
end_dateDATENULL,
TABLESPACE”USER_DATA”;
创建设备还库表device_return
CREATETABLE“DMS”,device_return
codeVARHAR2(6)NOTNULL,
return_dateDATENULL,
keeperVARCHAR2(10)NULL,
return_numberNUMBER(6)NULL,
return_personVARCHAR2(10)NULL,
CONSTRAINTreturn_date_pkPRIMARYKEY(return_date)
创建设备采购计划表device_wantbuy
CREATETABLE“DMS”,device_wantbuy
max_numberNUMBER(6)NULL,
buy_numberNUMBER(6)NULL,
buy_dateDATENULL,
CONSTRAINTwantbuy_date_pkPRIMARYKEY(buy_date)
创建操作日志表howdo
CREATETABLE“DMS”,howdo
do_userVARCHAR2(10)NOTNULL,
do_whatVARCHAR2(40)NOTNULL,
do_dateDATENOTNULL,
四、系统实现
1、创建应用程序
此仓库系统应用程序的创建步骤如下:
、选择菜单“File|New”中的“新建项目”选项卡中“MFCAppWizard(exe)”,设置合适的目录和项目名,比如“E:
\Projects”目录下的“DMS”项目。
、创建一个对话框应用程序(“DialogBased”),单击“Next”按钮。
、由于在这个项目中将要使用ADO,所以在MFCAppWizard的第2步,需要选中“Automation”选项,使应用程序能够支持自动化对象,如图15所示。
图15使应用程序支持自动化(Automation)
、单击“Finish”按钮,结束项目的创建。
至此一个基于对话框的应用程序框架就搭建好了。
主对话框名为CDMSDlg。
、项目创建完毕之后,在头文件中加入下面4行:
#import"
c:
\programfiles\commonfiles\system\ado\"
no_namespacerename("
EOF"
"
adoEOF"
)
#include"
"
inlinevoidTESTHR(HRESULTx){ifFAILED(x)_com_issue_error(x);
};
#defineDATEFMTCString("
'
%s'
第1行中的路径可能根据VisualStudio安装路径的不同而不同。
其中的rename指令,把ADO中的EOF重命名为adoEOF,这是为了避免和其他库的常量名冲突。
注意第3行,这里定义了一个inline函数TESTHER,它的作用是测试COM函数的返回值,在这个返回值包含一个错误的时候,抛出一个_com_error型的异常。
ADO作为一个COM组件接口,它的许多函数都会返回一个HRESULT型的值作为结果。
如果在每一步都用SUCCEEDED或FAILED宏测试返回值的话,将会不胜其烦,还有可能制造出一连串嵌套的if语句这样不美观的代码。
这个函数简化了这种验证操作,利用C++的异常处理机制,使代码显得紧凑而高效,为后面的工作带来很大方便。
第4行定义了一个宏。
这是不同的后台数据库对SQL语句中日期的用法要求不同引起的。
比如Access数据库要求SQL语句中的日期用两个#字符括起,而其他的数据库可能需要使用单引号或者双引号。
所以在这里定义了这个DATEFMT宏,为了方便程序在不同的后台数据库键切换。
这是一个在开发的时候需要注意的细节,后面还会具体提到。
2、COM知识准备
下面介绍一些关于COM知识。
这部分内容是针对那些没有学习过的COM技术的读者,目的是为他们理解ADO提供一些背景知识。
COM技术在微软公司的应用中可以说是无处不在,Windows系统相当多的服务都以这种方式提供,例如着名的DirectX,还有在这一章中广泛应用的ADO。
ADO的底层是OLEDB,他本身则是对OLEDB的一个COM包装。
所以具备一些COM的知识,对使用ADO是很有帮助的,但并不是说必须要精通COM才能使用ADO。
事实上,在一般的应用中,只需要理解下面这段代码即可。
VC++Extensions)
CDevBuyRsrs;
try
{
_bstr_tstrSQL("
SELECT*FROMDEVICE_WANTBUY"
);
TESTHR(__uuidof(Recordset)));
pRst=m_DBCnt->
Execute(strSQL,NULL,adCmdText);
TESTHR(pRst->
QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&
picRs));
TESTHR(picRs->
BindToRecordset(&
rs));
inti=0;
while(!
pRst->
adoEOF)
{
(0,;
(i,1,;
(i,2,;
(i,3,;
(i,4,;
(i,5,;
(i,6,;
(i,7,;
pRst->
MoveNext();
}
picRs->
Release();
Close();
}
catch(_com_error&
e)
AfxMessageBox());
(TRUE);
return;
、BSTR和_bstr_t
下面的语句声明了一个_bstr_t型的变量,_bstr_t是对BSTR类型的一个封装。
_bstr_tstrSQL(“SELETE*FROMDEVICE_WANTBUY”);
对于BSTR,通俗地说,它是COM中使用的字符串,与普通C程序中的字符串的区别在于:
它一个带有字符计数值的字符串。
它的字符计数值在字符数组的前面。
它保存的在字符是所谓的“宽字符”(Widecharacter)。
所以,对于一个BSTR而言,下面的语句就是错的。
BSTRstr=L”Somewords”;
正确的做法是:
Wchar_tst_=L”Somewords”
BSTRstr;
Bstr=SysAllocString(str_)
释放一个SBSTR指针时,则调用SysFreeString函数。
每次都这样操控字符串未免太过麻烦,所以VisualC++里提供了_bstr_t这个类对BSTR做了封装,使程序员可以简单的对这种COM字符串进行操作了。
、IADORecordBinding和Iunkown
一个COM组件包含了许多COM对象,程序员通过“接口”来操控这些对象,或者说,这些对象通过提供给程序员的接口来实现自己的功能。
下面这行代码中的IADORecordBind就是一个指向这种接口的指针。
IADORecordBingding*picRs=NULL;
char*)(_bstr_t)Holder)
其录的GetCollect方法的参数是字段名,字段的值放在了ARLANT型变量holder中。
判断holder的vt成员不是VA_NULL之后,就可以用强制类型转换取出它的值了。
7、库存管理窗口的创建
这部分用于Device表的管理。
用户可以在此新增、修改、删除某种设备的记录。
单击主对话框中的“库存信息”按钮,将出现图20所示的界面。
图20库存信息管理界面
新增记录时,用户在“设备号”组合框中选者一个设备号,在下面填入各种数量,之后单击“新增”按钮即可以向表中增加记录。
若操作有误,如选择了一个表中已经存在的设备,代码会抛出异常,程序捕获异常后,向用户提示。
修改记录时,用户单击列表中某一行,程序利用上一节的方法,在窗口下面把这一记录的详细信息显示出来,用户即可对之修改。
值得一提的是“设备号”一项,该子窗口初始化时的代码如下:
CDevCodeRsrs;
try
_bstr_tstrSQL("
SELECT*FROM