数据库课程设计之仓库设备管理.docx
《数据库课程设计之仓库设备管理.docx》由会员分享,可在线阅读,更多相关《数据库课程设计之仓库设备管理.docx(46页珍藏版)》请在冰豆网上搜索。
![数据库课程设计之仓库设备管理.docx](https://file1.bdocx.com/fileroot1/2023-7/8/88cb305b-2476-48bf-a106-b64d46da6f75/88cb305b-2476-48bf-a106-b64d46da6f751.gif)
数据库课程设计之仓库设备管理
铜陵学院
数学与计算机系
《数据库课程设计》
时间:
2011年6月7日至2011年6月10日
指导教师对课程设计(论文)的评语(工作态度、任务完成情况、能力水平、设计说明书(论文)的撰写和图纸质量等):
成绩
指导教师签字年月日
一、开发背景及设计思想
1.开发背景
90年代中期,由于Internet的迅速普及,使Intranet成为Internet技术在企业管理信息系统中的应用和延伸,形成了集计算机,计算机网络、数据库、分布式计算等于一体的信息技术综合体,它打破了时间和地域的界限,使信息交流变得快捷、准确,为建立现代企业管理信息系统提供了充足的条件。
由于计算机应用的日益普及,仓库设备管理的自动化是提高工作效率的有效途径,随着企业对仓库设备实行计算机管理,实现仓库设备管理系统势在必行。
系统开发的总统任务是实现企业物资设备管理的系统化、规范化和自动化,从而达到仓库管理效率的目的。
2.开发设计思想
在本系统的设计过程中,为了克服仓库管理信息处理量大的困难,满足计算机管理的需要,采取了下面的一些原则:
1、统一各种原始单据的格式,统一帐目和报表的格式。
2、删除不必要的管理冗余,实现管理规范化、科学化。
3、程序代码标准化,软件统一化,确保软件的可维护性和实用性。
4、界面尽量简单化,做到实用、方便,尽量满足企业不同层次员工的需要。
5、建立操作日志,系统自动记录所进行的各种操作。
二.功能描述
1、系统功能分析
本例中的仓库管理系统需要完成的功能主要有以下几点:
1.新的设备信息的录入;
2.借出、归还、维修时对设备信息的修改;
3.对报废设备信息的删除;
4.按照一定的条件查询、统计符合条件的设备信息;查询功能至少应该包括设备基本信息的查询、按时间段(如在2004年1月1日到2004年10月10日购买、借出、维修的设备等)查询、按时间点(借入时间,借出时间,归还时间)查询等,统计功能至少包括按时间段(如在2004年1月1日到2004年10月10日购买、借出、维修的设备等)统计、按设备基本信息的统计等;
5.对查询、统计的结果打印输出。
2、系统功能模块设计
在系统功能分析的基础上,结合VisualC++程序编制的特点,得到如图所示的系统功能模块图。
三.数据库需求分析
在仔细调查企业仓库物资设备管理过程的基础上,得到本系统所处理的数据流程如图
本实例设计的数据项和数据结构如下:
1、设备代码信息,包括的数据项有设备号、设备名称。
2、 现有库存信息,包括的数据项有设备、现有数目、总数目、最大库存和最小库存。
3、设备使用信息,包括的数据项有使用的设备、使用部门、数目、使用时间和出库时状态等。
4、 设备采购信息,包括的数据项有采购的设备、采购员、供应商、采购数目和采购时间等。
5、设备归还信息,包括的数据项有归还设备、归还部门、归还数目、归还时间和经手人等。
四、数据库概念结构设计
本实例根据上面的设计规划出的实体有库存实体、入库实体、出库实体、采购实体、还库实体和需求实体,各实体的E-R图及其关系描述如下:
库存实体E-R图
入库实体E-R图
出库实体E-R图
企业部门需求实体E-R图
还库实体E-R图
计划采购实体E-R图
实体和实体之间的关系E-R图
五、数据库逻辑结构设计及优化
在上面的实体以及实体之间的关系的基础上,形成数据库中的表格和各个表格之间的关系。
仓库管理系统数据库中各个表格的设计结果如下面的几个表格所示。
每个表格表示在数据库中的一个表。
表1-1设备基本信息代码表device_code
列名
数据类型
可否为空
说明
code
VARCHAR2(6)
NOTNULL
设备号(主键)
name
VARCHAR2(20)
NULL
设备名称
表1-2企业部门基本信息表class_node
列名
数据类型
可否为空
说明
node
VARCHAR2(6)
NOTNULL
部门编号(主键)
department
VARCHAR2(20)
NOTNULL
部门名称
表1-3供应商设备信息表provider_node
列名
数据类型
可否为空
说明
node
VARCHAR2(6)
NOTNULL
供应商编号(主键)
provider
VARCHAR2(20)
NOTNULL
供应商名称
telenode
VARCHAR2(10)
NULL
供应商电话
name
VARCHAR2(20)
NULL
设备名称
表1-4设备入库表device_in
列名
数据类型
可否为空
说明
code
VARCHAR2(6)
NOTNULL
设备号
in_date
DATE
NOTNULL
入库时间(主键)
provider
VARCHAR2(20)
NULL
供应商
in_number
NUMBER(6)
NULL
入库数量
price
NUMBER(6)
NULL
价格
buyer
VARCHAR2(10)
NULL
采购员
表1-5设备出库表device_out
列名
数据类型
可否为空
说明
code
VARCHAR2(6)
NOTNULL
设备号
department
VARCHAR2(20)
NULL
使用部门
out_date
DATE
NULL
出库时间(主键)
out_state
NUMBER
(1)
NULL
出库状态
out_person
VARCHAR2(10)
NULL
经手人
out_number
NUMBER(6)
NOTNULL
出库数量
taker
VARCHAR2(10)
NULL
领取人
usage
VARCHAR2(20)
NULL
用途
表1-6现有库存表device
列名
数据类型
可否为空
说明
code
VARCHAR2(6)
NOTNULL
设备号(主键)
now_number
NUMBER(6)
NULL
现有库存
high_number
NUMBER(6)
NULL
最大库存
low_number
NUMBER(6)
NULL
最少库存
total_number
NUMBER(6)
NULL
总数
表1-7部门需求表device_need
列名
数据类型
可否为空
说明
code
VARCHAR2(6)
NOTNULL
设备号
department
VARCHAR2(20)
NOTNULL
部门名称
need_number
NUMBER(6)
NULL
需求数量
begin_date
DATE
NULL
需求开始时间
end_date
DATE
NULL
需求结束时间
表1-8设备还库表device_return
列名
数据类型
可否为空
说明
code
VARCHAR2(6)
NOTNULL
设备号
return_date
DATE
NULL
还库时间(主键)
keeper
VARCHAR2(20)
NULL
仓库管理员
return_number
NUMBER(6)
NULL
归还数量
return_date
VARCHAR2(10)
NULL
归还人
表1-9操作日志表howdo
列名
数据类型
可否为空
说明
do_user
VARCHAR2(10)
NOTNULL
操作员
do_what
VARCHAR2(40)
NOTNULL
操作内容
do_date
DATE
NOTNULL
操作时间
六、数据库的物理设计和实施
得到系统逻辑模型后,就该进行数据库的物理设计和实施数据库了,物理设计主要是要确定数据库的存储路径、存储结构以及如何建立索引等,可以采用系统的默认设置。
1.数据库设计
(1).创建设备基本信息代码device_code
CREATETABLE“DMS”.device_code
(codeVARCHAR2(6)NOTNULL,
nameVARCHAR2(20)NOTNULL,
CONSTRANTcode_code_pkPRIMARYKEY(code)
)
TABLESPACE”USER_DATA”;
(2).创建企业部门基本信息代码class_node
CREATETABLE“DMS”.class_node
(nodeVARCHAR2(6)NOTNULL,
DepartmentVARCHAR2(20)NOTNULL,
CONSTRANTnode_node_pkPRIMARYKEY(node)
)
TABLESPACE”USER_DATA”;
(3).创建供应商设备信息代码provider_node
CREATETABLE“DMS”.provider_node
(nodeVARCHAR2(6)NOTNULL,
providerVARCHAR2(20)NOTNULL,
telenoVARCHAR2(10)NULL,
CodeVARCHAR2(6)NOTNULL,
CONSTRANTnode_node_pkPRIMARYKEY(node)
)
TABLESPACE”USER_DATA”;
(4).创建设备入库表device_in
CREATETABLE“DMS”.device_in
(
codeVARCHAR2(6)NOTNULL,
in_dateDATENOTNULL,
providerVARCHAR2(20)NULL,
in_numberNUMBER(6)NULL,
priceNUMBER(6)NULL,
buyerVARCHAR2(10)NULL,
CONSTRAINTin_date_pkPRIMARYKEY(in_date)
)
TABLESPACE“USER_DATA”;
(5).创建设备出库表device_out
CREATETABLE“DMS”.device_out
(
codeVARCHAR2(6)NOTNULL,
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)
)
TABLESPACE”USER_DATA”;
(6).创建现有库存表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)
)
TABLESPACE”USER_DATA”;
(7).创建部门需求表device_need
CREATETABLE“DMS”,device_need
(
codeVARCHAR2(10)NOTNULL,
departmentVARCHAR2(10)NOTNULL,
need_numberNUMBER(6)NULL,
begin_dateDATENULL,
end_dateDATENULL,
)
TABLESPACE”USER_DATA”;
(8).创建设备还库表device_return
CREATETABLE“DMS”,device_return
(
codeVARHAR2(6)NOTNULL,
departmentVARCHAR2(20)NULL,
return_dateDATENULL,
keeperVARCHAR2(10)NULL,
return_numberNUMBER(6)NULL,
return_personVARCHAR2(10)NULL,
CONSTRAINTreturn_date_pkPRIMARYKEY(return_date)
)
TABLESPACE”USER_DATA”;
(9).创建操作日志表howdo
CREATETABLE“DMS”,howdo
(
do_userVARCHAR2(10)NOTNULL,
do_whatVARCHAR2(40)NOTNULL,
do_dateDATENOTNULL,
)
TABLESPACE“USER_DATA”;
2、系统实现
2.1创建应用程序
(1)选择“”中的“新建项目”选项卡中“MFCAppWizard(exe)”,设置合适的目录和项目名,比如“E:
\Project”目录下的“DMS”项目。
(2)创建一个对话框应用程序(“DialogBased”),单击“Next”按钮。
(3)由于在这个项目中将要使用ADO,所以在MFCAppWizard的第二步,需要选中“Automation”选项,使应用程序能够支持自动化对象。
如图1-10所示
(4)单击“Finish”按钮结束项目的创建。
主对话框名为CDMSDlg。
(5)项目创建完毕后,在头文件stdafx.h中加入下面4行:
#import“c:
\programfiles\commonfiles\system\ado\msado15.dll”no_namespace(”EOF”,”adoEOF”)
#include”icrsint.h”
inlinevoidTESTHR(HRESULTx){ifFAILED(x)_com_issue_error(x);};
#defineDATEFMTCstring(“’%s”’)
2.2操作日志模块的设计
1、写日志模块
图1-10使应用程序支持自动化
先定义一个名为ClogMngr的类
//LogMngr.h
//定义一个Log管理器
classCLogMngr
{
public:
CLogMngr();
virtual~CLogMngr();
public:
boolAddLog(LPCSTRop);
voidSetup(_ConnectionPtrcnnt,CString&user)
{
m_DBCnt=cnnt;
m_user=user;
}
protected:
_ConnectionPtrm_DBCnt;
CStringm_user;
};
下面是ClogMngr:
:
AddLog内部实现详细过程。
//LogMngr.cpp
//向数据库中添加Log记录的代码。
boolCLogMngr:
:
AddLog(LPCSTRop)
{
CTimetm=CTime:
:
GetCurrentTime();
CStringsql_;
sql_.Format("INSERTINTOHOWDO(do_user,do_what,do_date)VALUES('%s','%s','%d-%d-%d%d:
%d:
%d')",
m_user,op,
tm.GetYear(),tm.GetMonth(),tm.GetDay(),
tm.GetHour(),tm.GetMinute(),tm.GetSecond());
_bstr_tsql=sql_;
try
{
m_DBCnt->Execute(sql,NULL,adCmdText);
}
catch(_com_error&e)
{
CStringError=e.ErrorMessage();
AfxMessageBox(e.ErrorMessage());
returnfalse;
}
returntrue;
}
2、读日志模块
图1-11查看日志窗口
初始化界面代码如下:
BOOLCDlgViewLog:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
m_list.InsertColumn(0,"操作员");
m_list.InsertColumn(1,"操作日期");
m_list.InsertColumn(2,"操作内容");
RECTrect;
m_list.GetWindowRect(&rect);
intwid=rect.right-rect.left;
m_list.SetColumnWidth(0,wid/3);
m_list.SetColumnWidth(1,wid/3);
m_list.SetColumnWidth(2,wid/3);
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
RefreshData();
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE
}
voidCDlgViewLog:
:
RefreshData()
{
m_list.DeleteAllItems();
m_list.SetRedraw(FALSE);
_bstr_tstrSQL("SELECT*FROMHOWDO");
_RecordsetPtrMySet;
inti=0;
try
{
MySet.CreateInstance(__uuidof(Recordset));
MySet=m_DBCnt->Execute(strSQL,NULL,adCmdText);
_variant_tHolder;
while(!
MySet->adoEOF)
{
Holder=MySet->GetCollect("do_user");
if(Holder.vt!
=VT_NULL)
m_list.InsertItem(i,(char*)(_bstr_t)Holder);
Holder=MySet->GetCollect("do_date");
if(Holder.vt!
=VT_NULL)
m_list.SetItemText(i,1,(char*)(_bstr_t)Holder);
Holder=MySet->GetCollect("do_what");
if(Holder.vt!
=VT_NULL)
m_list.SetItemText(i,2,(char*)(_bstr_t)Holder);
MySet->MoveNext();
}
MySet->Close();
}
catch(_com_error&e)
{
AfxMessageBox(e.ErrorMessage());
m_list.SetRedraw(TRUE);
return;
}
m_list.SetRedraw(TRUE);
}
voidCDlgViewLog:
:
OnClickListVllog(NMHDR*pNMHDR,LRESULT*pResult)
{
inti=m_list.GetSelectionMark();
m_opr=m_list.GetItemText(i,0);
m_date=m_list.GetItemText(i,1);
m_op=m_list.GetItemText(i,2);
UpdateData(FALSE);
*pResult=0;
}
//DlgViewLog.cpp
//删除所有日志记录的函数。
voidCDlgViewLog:
:
OnBtnVlrmall()
{
_bstr_tstrSQL("TRUNCATETABLEHOWDO");
try
{
m_DBCnt->Execute(strSQL,NULL,adCmdText);
}
catch(_com_error&e)
{
AfxMessageBox(e.ErrorMessage());
EndDialog(0);
}
RefreshData();
}
2.3登录窗口的设计和程序初始化
在CDMSDlg:
:
OnInitDialog()中加入这样一段代码:
//DMSDlg.cpp
//弹出登录界面
CDlgLogIndlg;
do
{
if(!
dlg.DoModal())
EndDialog(0);
}while(dlg.m_UsrName.GetLength()==0);
它的目的是弹出图1-12所示的登录对话框,并从中获得一个有效的用户名。
图1-12登录界面
得到有效用户名后,程序用如下代码:
//DMSDlg.cpp
//建立数据库连接,初始化成员变量
//登录数据库,若失败,则关闭程序。
{
m_DBCnt.CreateInstance(__uuidof(Connection));
CStringsql_;
sql_.Format("DSN=DMS;UID=%s;PWD=%s",dlg.m_UsrName,dlg.m_UsrPwd);
_bstr_tsql=sql_;//建立连接
m_DBCnt->Open(sql,"","",-1);//初始化日志管理器
m_logMngr.Setup(m_DBCnt,dlg.m_UsrName);//记录此次登录
m_logMngr.AddLog("登录数据库");
}
catch(_com_error&e)
{
AfxMessageBox(e.ErrorMessage());