1、数据库仓库管理系统铜陵学院 数学与计算机系设计题目:仓库设备管理学生姓名:曹福利、郭贺、田辉学 号:、15、30专业班级:09信息管理与信息系统指导教师: 杨 慧 时间: 6月7日 至 6月10日指导教师对课程设计(论文)的评语(工作态度、任务完成情况、能力水平、设计说明书(论文)的撰写和图纸质量等):成绩 指导教师签字 年 月 日一、开发背景及设计思想41.开发背景42.开发设计思想4二功能描述41、系统功能分析42、系统功能模块设计5三数据库需求分析5四、数据库概念结构设计6五、数据库逻辑结构设计及优化8六、数据库的物理设计和实施91.数据库设计9(1).创立设备基本信息代码device_
2、code9(2).创立企业部门基本信息代码class_node10(3).创立供应商设备信息代码provider_node10(4) .创立设备入库表 device_in10(5).创立设备出库表 device_out10(6).创立现有库存表 device11(7).创立部门需求表 device_need11(8).创立设备还库表device_return11(9).创立操作日志表 howdo122、系统实现122.1创立应用程序122.2操作日志模块的设计121、写日志模块122、读日志模块142.3登录窗口的设计和程序初始化162.4主对话框界面的设计172.5设备代码管理窗口的建立18
3、2.6库存信息管理窗口的创立212.7设备入库信息管理232.8设备入库窗口262.9帮助模块设计28七、课程设计心得体会281 问题和解决方案292系统改进方面293.实习心得与体会29一、 开发背景及设计思想1.开发背景 90年代中期,由于Internet 的迅速普及,使Intranet成为Internet技术在企业管理信息系统中的应用和延伸,形成了集计算机,计算机网络、数据库、分布式计算等于一体的信息技术综合体,它打破了时间和地域的界限,使信息交流变得快捷、准确,为建立现代企业管理信息系统提供了充分的条件。由于计算机应用的日益普及,仓库设备管理的自动化是提高工作效率的有效途径,随着企业对
4、仓库设备实行计算机管理,实现仓库设备管理系统势在必行。系统开发的总统任务是实现企业物资设备管理的系统化、规范化和自动化,从而达到仓库管理效率的目的。2.开发设计思想在本系统的设计过程中,为了克服仓库管理信息处理量大的困难,满足计算机管理的需要,采取了下面的一些原则:1、 统一各种原始单据的格式,统一帐目和报表的格式。2、 删除不必要的管理冗余,实现管理规范化、科学化。3、 程序代码标准化,软件统一化,确保软件的可维护性和实用性。4、 界面尽量简单化,做到实用、方便,尽量满足企业不同层次员工的需要。5、 建立操作日志,系统自动记录所进行的各种操作。二功能描述1、系统功能分析 本例中的仓库管理系统
5、需要完成的功能主要有以下几点:1. 新的设备信息的录入;2. 借出、归还、维修时对设备信息的修改;3. 对报废设备信息的删除;4. 按照一定的条件查询、统计符合条件的设备信息;查询功能至少应该包括设备基本信息的查询、按时间段(如在 1月1日到 10月10日购买、借出、维修的设备等)查询、按时间点(借入时间,借出时间,归还时间)查询等,统计功能至少包括按时间段(如在 1月1日到 10月10日购买、借出、维修的设备等)统计、按设备基本信息的统计等;5. 对查询、统计的结果打印输出。2、系统功能模块设计 在系统功能分析的基础上,结合Visual C+程序编制的特点,得到如图所示的系统功能模块图。仓库
6、管理系统系统模块输入模块维护模块查看模块报表模块帮助模块日志管理需求模块还库模块出库模块入库模块三数据库需求分析 在仔细调查企业仓库物资设备管理过程的基础上,得到本系统所处理的数据流程如图设备入库设备采购设备还库设备出库仓库现有库存各部门需求企业生产计划汇总本实例设计的数据项和数据结构如下:1、 设备代码信息,包括的数据项有设备号、设备名称。2、 现有库存信息,包括的数据项有设备、现有数目、总数目、最大库存和最小库存。3、 设备使用信息,包括的数据项有使用的设备、使用部门、数目、使用时间和出库时状态等。4、 设备采购信息,包括的数据项有采购的设备、采购员、供应商、采购数目和采购时间等。 5、
7、设备归还信息,包括的数据项有归还设备、归还部门、归还数目、归还时间和经手人等。四、数据库概念结构设计 本实例根据上面的设计规划出的实体有库存实体、入库实体、出库实体、采购实体、还库实体和需求实体,各实体的E-R图及其关系描述如下: 库存实体E-R图现有库存 入库 出库还库设备号 入库实体E-R图入库供应商信息采购价格数量采购员设备号 出库实体E-R图出库使用部门数量、时间经手人设备号 企业部门需求实体E-R图部门需求需求部门需求数量需求时间设备号 还库实体E-R图设备还库还库时间人还库数量经手人设备号 计划采购实体E-R图计划采购库存信息供应信息时间设备号 实体和实体之间的关系E-R图入库 现
8、有库存 出库 还库 部门需求设备采购五、数据库逻辑结构设计及优化在上面的实体以及实体之间的关系的基础上,形成数据库中的表格和各个表格之间的关系。仓库管理系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表。表1-1 设备基本信息代码表device_code 列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号(主键)nameVARCHAR2(20)NULL设备名称表1-2 企业部门基本信息表class_node 列名 数据类型可否为空说明 nodeVARCHAR2(6)NOTNULL部门编号(主键) departmentVARCHAR2(20
9、)NOTNULL部门名称表1-3 供应商设备信息表provider_node 列名 数据类型可否为空说明 nodeVARCHAR2(6)NOTNULL供应商编号(主键) providerVARCHAR2(20)NOTNULL供应商名称 telenodeVARCHAR2(10)NULL供应商电话 nameVARCHAR2(20)NULL设备名称 表1-4 设备入库表device_in列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号in_dateDATE NOTNULL入库时间(主键)providerVARCHAR2(20)NULL供应商in_numberNUMBER(6
10、) NULL入库数量 priceNUMBER(6) NULL价格 buyerVARCHAR2(10)NULL采购员 表1-5 设备出库表device_out列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号departmentVARCHAR2(20)NULL使用部门out_dateDATE NULL出库时间(主键)out_stateNUMBER(1) NULL出库状态out_personVARCHAR2(10) NULL经手人out _numberNUMBER(6) NOTNULL出库数量 takerVARCHAR2(10) NULL领取人 usageVARCHAR2(
11、20) NULL用途 表1-6 现有库存表device列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号(主键)now_numberNUMBER(6) NULL现有库存high _numberNUMBER(6) NULL最大库存low _numberNUMBER(6) NULL最少库存total _numberNUMBER(6) NULL总数 表1-7 部门需求表device_need列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号departmentVARCHAR2(20)NOTNULL部门名称need _numberNUMBER(6) NU
12、LL需求数量begin_dateDATE NULL需求开始时间end_dateDATE NULL需求结束时间 表1-8 设备还库表device_return列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号return_dateDATE NULL还库时间(主键) keeperVARCHAR2(20) NULL仓库管理员 return_ numberNUMBER(6) NULL归还数量 return_dateVARCHAR2(10) NULL归还人 表1-9 操作日志表 howdo列名数据类型可否为空说明do_userVARCHAR2(10) NOTNULL操作员do_w
13、hatVARCHAR2(40) NOTNULL操作内容do_dateDATE NOTNULL操作时间 六、 数据库的物理设计和实施得到系统逻辑模型后,就该进行数据库的物理设计和实施数据库了,物理设计主要是要确定数据库的存储路径、存储结构以及如何建立索引等,能够采用系统的默认设置。1.数据库设计(1).创立设备基本信息代码device_codeCREATE TABLE ”DMS”.device_code(code VARCHAR2(6) NOTNULL,name VARCHAR2(20) NOTNULL,CONSTRANT code_code_pk PRIMARY KEY(code)TABLES
14、PACE”USER_DATA”;(2).创立企业部门基本信息代码class_node CREATE TABLE ”DMS”.class_node(node VARCHAR2(6) NOTNULL, Department VARCHAR2(20) NOTNULL,CONSTRANT node_node_pk PRIMARY KEY(node)TABLESPACE”USER_DATA”;(3).创立供应商设备信息代码provider_node CREATE TABLE ”DMS”.provider_node(node VARCHAR2(6) NOTNULL, provider VARCHAR2(2
15、0)NOTNULL, teleno VARCHAR2(10) NULL, Code VARCHAR2(6) NOTNULL, CONSTRANT node_node_pk PRIMARY KEY(node)TABLESPACE”USER_DATA”;(4) .创立设备入库表 device_inCREATE TABLE ”DMS”.device_in(code VARCHAR2(6) NOT NULL,in_date DATE NOT NULL,provider VARCHAR2(20) NULL,in_number NUMBER(6) NULL,price NUMBER(6) NULL,buy
16、er VARCHAR2(10) NULL,CONSTRAINT in_date_pk PRIMARY KEY(in_date)TABLESPACE ”USER_DATA”;(5).创立设备出库表 device_outCREATE TABLE ”DMS”.device_out(code VARCHAR2(6) NOT NULL,department VARCHAR2(20) NULL,out_date DATE NULL,out_state NUMBER(1) NULL,out_penson VARCHAR2(20) NULL,out_number NUMBER(6) NOT NULL,take
17、r VARCHAR2(10) NULL,usage VARCHAR2(20) NULL,CONSTRAINT out_date_pk PRIMARY KEY(out_date)TABLESPACE”USER_DATA”;(6).创立现有库存表 deviceCREATETABLE ”DMS”.device(code VARCHAR2(6) NULL,now_number NUMBER(6) NULL,high_number NUMBER(6) NULL,low_ number NUMBER(6) NULL,total_ number NUMBER(6) NULL,CONSTRAINT devic
18、e_code_pk PRIMARY KEY(code)TABLESPACE”USER_DATA”;(7).创立部门需求表 device_needCREATE TABLE ”DMS”,device_need(code VARCHAR2(10) NOT NULL,department VARCHAR2(10) NOT NULL,need_number NUMBER(6) NULL,begin_date DATE NULL,end_date DATE NULL,)TABLESPACE ”USER_DATA”;(8).创立设备还库表device_returnCREATE TABLE ”DMS”,dev
19、ice_return(code VARHAR2(6) NOT NULL,department VARCHAR2(20) NULL,return_date DATE NULL,keeper VARCHAR2(10) NULL,return_number NUMBER(6) NULL,return_person VARCHAR2(10) NULL,CONSTRAINT return_date_pk PRIMARY KEY (return_date)TABLESPACE ”USER_DATA”;(9).创立操作日志表 howdoCREATE TABLE ”DMS”,howdo(do_user VAR
20、CHAR2(10) NOT NULL,do_what VARCHAR2(40) NOT NULL,do_date DATE NOT NULL,)TABLESPACE ”USER_DATA”;2、系统实现2.1创立应用程序(1)选择”FileNew”中的”新建项目”选项卡中”MFC AppWizard(exe)”,设置合适的目录和项目名,比如”E:Project”目录下的”DMS”项目。(2)创立一个对话框应用程序(”Dialog Based”),单击”Next”按钮。(3)由于在这个项目中将要使用ADO,因此在MFC AppWizard的第二步,需要选中”Automation”选项,使应用程序
21、能够支持自动化对象。如图1-10所示(4)单击”Finish”按钮结束项目的创立。主对话框名为CDMSDlg。(5)项目创立完毕后,在头文件stdafx.h中加入下面4行:#import”c:programfilescommonfilessystemadomsado15.dll”no_namespace(”EOF”,”adoEOF”)#include”icrsint.h”inline void TESTHR(HRESULT x)if FAILED(x)_com_issue_error(x);#define DATEFMT Cstring(”%s”)2.2操作日志模块的设计1、写日志模块 图1-
22、10 使应用程序支持自动化先定义一个名为ClogMngr的类/LogMngr.h/定义一个Log管理器class CLogMngr public:CLogMngr();virtual CLogMngr();public:bool AddLog(LPCSTR op);void Setup(_ConnectionPtr cnnt, CString& user)m_DBCnt = cnnt;m_user = user;protected:_ConnectionPtr m_DBCnt;CString m_user;下面是ClogMngr:AddLog内部实现详细过程。/LogMngr.cpp/向数据库
23、中添加Log记录的代码。bool CLogMngr:AddLog(LPCSTR op)CTime tm = CTime:GetCurrentTime();CString sql_;sql_.Format(INSERT INTO HOWDO (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_t sql = sql_;trym_
24、DBCnt-Execute(sql,NULL,adCmdText);catch(_com_error& e) CString Error = e.ErrorMessage(); AfxMessageBox(e.ErrorMessage();return false; return true;2、读日志模块图1-11 查看日志窗口 初始化界面代码如下:BOOL CDlgViewLog:OnInitDialog() CDialog:OnInitDialog();m_list.InsertColumn(0,操作员);m_list.InsertColumn(1,操作日期);m_list.InsertC
25、olumn(2,操作内容);RECT rect;m_list.GetWindowRect(&rect);int wid = 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();return TRUE; / return TRUE unless you set the focus to a contr
26、ol / EXCEPTION: OCX Property Pages should return FALSEvoid CDlgViewLog:RefreshData()m_list.DeleteAllItems();m_list.SetRedraw(FALSE);_bstr_t strSQL(SELECT * FROM HOWDO);_RecordsetPtr MySet; int i = 0;tryMySet.CreateInstance(_uuidof(Recordset); MySet = m_DBCnt-Execute(strSQL,NULL,adCmdText);_variant_t
27、 Holder;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_li
28、st.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);void CDlgViewLog:OnClickListVllog(NMHDR* pNMHDR, LRESULT* pResult) int i = m_list.GetSelectionMark();m_opr = m_list.G
29、etItemText(i,0);m_date = m_list.GetItemText(i,1);m_op = m_list.GetItemText(i,2);UpdateData(FALSE);*pResult = 0;/DlgViewLog.cpp/删除所有日志记录的函数。void CDlgViewLog:OnBtnVlrmall() _bstr_t strSQL(TRUNCATE TABLE HOWDO);trym_DBCnt-Execute(strSQL,NULL,adCmdText);catch(_com_error& e) AfxMessageBox(e.ErrorMessage(
30、);EndDialog(0); RefreshData();2.3登录窗口的设计和程序初始化在CDMSDlg:OnInitDialog()中加入这样一段代码:/DMSDlg.cpp/弹出登录界面CDlgLogIn dlg;doif (!dlg.DoModal()EndDialog(0); while (dlg.m_UsrName.GetLength()=0);它的目的是弹出图1-12所示的登录对话框,并从中获得一个有效的用户名。图1-12 登录界面得到有效用户名后,程序用如下代码:/ DMSDlg.cpp/建立数据库连接,初始化成员变量/登录数据库,若失败,则关闭程序。m_DBCnt.Crea
31、teInstance(_uuidof(Connection);CString sql_;sql_.Format(DSN=DMS;UID=%s;PWD=%s,dlg.m_UsrName,dlg.m_UsrPwd);_bstr_t sql=sql_;/建立连接m_DBCnt-Open(sql,-1);/初始化日志管理器m_logMngr.Setup(m_DBCnt,dlg.m_UsrName);/记录此次登录m_logMngr.AddLog(登录数据库);catch(_com_error& e) AfxMessageBox(e.ErrorMessage();this-EndDialog(0); 在
32、程序结束时关闭数据库连接。/ DMSDlg.cpp/关闭数据库连接void CDMSDlg:OnDestroy() CDialog:OnDestroy();m_DBCnt-Close();2.4主对话框界面的设计登录完成后,显示出主对话框。它的界面设计如图1-13所示,单击某个按钮就能弹出某个功能的界面。图1-13 主对话框界面以其中”设备代码”按钮为例,说明它的事件处理函数。代码如下:/ DMSDlg.cpp/显示设备代码管理界面void CDMSDlg:OnBtnDevcode() CDlgDevcode dlg;dlg.Setup(m_DBCnt,&m_logMngr);this-Sho
33、wWindow(SW_HIDE);dlg.DoModal();this-ShowWindow(SW_SHOW);其它按钮的事件处理函数,代码与”设备代码”按钮的事件处理函数相同。2.5设备代码管理窗口的建立对话框类名为CdlgDevcode设计如图1-14所示 设备代码管理窗口 /DlgDevcode.cpp/对话框的初始化BOOL CDlgDevcode:OnInitDialog() CDialog:OnInitDialog();/切分列表控件m_list.InsertColumn(0,设备号);m_list.InsertColumn(1,设备名);RECT rect;m_list.GetW
34、indowRect(&rect);int wid = rect.right - rect.left;m_list.SetColumnWidth(0,wid/2);m_list.SetColumnWidth(1,wid/2);m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);/读取已有数据RefreshData();return TRUE; / DlgDevcode.cpp/消息映射部分BEGIN_MESSAGE_MAP(CDlgDevcode, CDialog) /AFX_MSG_MAP(CDlgDevcode)ON_NOTIFY(NM_CLICK,
35、IDC_LIST_DEVCODE, OnClickListDevcode)/AFX_MSG_MAPEND_MESSAGE_MAP()/事件处理部分void CDlgDevcode:OnClickListDevcode(NMHDR* pNMHDR, LRESULT* pResult) int i = m_list.GetSelectionMark();m_code = m_list.GetItemText(i,0);m_name = m_list.GetItemText(i,1);UpdateData(FALSE);*pResult = 0;其余程序的清单如下:/ DlgDevcode.cpp
36、: implementation file/#include stdafx.h#include DMS.h#include DlgDevcode.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CDlgDevcode dialogCDlgDevcode:CDlgDevcode(CWnd* pParent /*=NULL*/): CDialog(CDlgDevcode:IDD, pParent)/AFX_DATA_INIT(CDlgDevcode)m_code =
37、_T();m_name = _T();/AFX_DATA_INITm_DBCnt = NULL;m_log = NULL;void CDlgDevcode:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CDlgDevcode)DDX_Control(pDX, IDC_LIST_DEVCODE, m_list);DDX_Text(pDX, IDC_EDIT_DCCODE, m_code);DDX_Text(pDX, IDC_EDIT_DCNAME, m_name);/AFX_DATA_MAP
38、BEGIN_MESSAGE_MAP(CDlgDevcode, CDialog)/AFX_MSG_MAP(CDlgDevcode)ON_NOTIFY(NM_CLICK, IDC_LIST_DEVCODE, OnClickListDevcode)ON_BN_CLICKED(IDC_BTN_DCADD, OnBtnDcadd)ON_BN_CLICKED(IDC_BTN_DCDEL, OnBtnDcdel)ON_BN_CLICKED(IDC_BTN_DCUPD, OnBtnDcupd)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CDlgDevcode message handlers/负责读取已有数据的函数void CDlgDevcode:RefreshData()m_list.DeleteAllItems();m_list.SetRedraw(FALSE);_bstr_t strSQL(SELECT * FROM DEVICE_CODE);_RecordsetPtr MySet; int i = 0;tryMySet.CreateInstance(_uuidof(Recordset); /执行SOL语句读取记录MySet = m_DBCnt-Execute(strSQL,NULL,adCmdText);_variant_t Holder;while(!MySet-