1、 数据库仓库设备管理课程设计 铜陵学院 数学与计算机系 <数据库课程设计> 设计题目:仓库设备管理 学生姓名: 学 号: 专业班级: 指导教师: 时间: 6月7日 至 6月10日 指导教师对课程设计(论文)的评语(工作态度、任务完成情况、能力水平、设计说明书(论文)的撰写和图纸质量等): 成
2、绩 指导教师签字 年 月 日 一、系统设计 3 1、系统设计目标 3 2、开发设计思想 3 3、系统功能分析 3 4、系统功能模块设计 3 二、 数据库设计 4 1、数据库需求分析 4 2、数据库概念结构设计 5 3、数据库逻辑结构设计 6 三、 数据库结构的实现 8 1.创立设备基本信息代码device_code 8 2.创立企业部门基本信息代码class_node 8 3.创立供应商设备信息代码provider_node 9 4.创立设备入库表 device_in 9 5.
3、创立设备出库表 device_out 9 6.创立现有库存表 device 10 7.创立部门需求表 device_need 10 8.创立设备还库表device_return 10 9.创立操作日志表 howdo 10 四、系统实现 11 4.1创立应用程序 11 4.2操作日志模块的设计 11 1、写日志模块 11 2、读日志模块 13 4.3登录窗口的设计和程序初始化 15 4.4主对话框界面的设计 16 4.5设备代码管理窗口的建立 17 4.6库存信息管理窗口的创立 20 4.7设备入库信息管理 22 4.8设备入库窗口 25 4.9帮助模块设计 27
4、 五、调试过程中的问题 27 5.1 问题和解决方案 27 5.2系统改进方面 28 六、课程设计总结 28 一、系统设计 1、系统设计目标 由于计算机应用的日益普及,仓库设备管理的自动化是提高工作效率的有效途径,随着企业对仓库设备实行计算机管理,实现仓库设备管理系统势在必行。 系统开发的总统任务是实现企业物资设备管理的系统化、规范化和自动化,从而达到仓库管理效率的目的。 2、开发设计思想 在本系统的设计过程中,为了克服仓库管理信息处理量大的困难,满足计算机管理的需要,采取了下面的一些原则: 1、 统一各种原始单据的格式,统一帐目和报表的格
5、式。 2、 删除不必要的管理冗余,实现管理规范化、科学化。 3、 程序代码标准化,软件统一化,确保软件的可维护性和实用性。 4、 界面尽量简单化,做到实用、方便,尽量满足企业不同层次员工的需要。 5、 建立操作日志,系统自动记录所进行的各种操作。 3、系统功能分析 本例中的仓库管理系统需要完成的功能主要有以下几点: 1. 新的设备信息的录入; 2. 借出、归还、维修时对设备信息的修改; 3. 对报废设备信息的删除; 4. 按照一定的条件查询、统计符合条件的设备信息;查询功能至少应该包括设备基本信息的查询、按时间段(如在 1月1日到 10月10日购买、借出、维修的设
6、备等)查询、按时间点(借入时间,借出时间,归还时间)查询等,统计功能至少包括按时间段(如在 1月1日到 10月10日购买、借出、维修的设备等)统计、按设备基本信息的统计等; 5. 对查询、统计的结果打印输出。 4、系统功能模块设计 在系统功能分析的基础上,结合Visual C++程序编制的特点,得到如图所示的系统功能模块图。 仓库管理系统 系统模块 输入模块 维护模块 查看模块 报表模块 帮助模块 日志管理 需求模块 还库模块 出库模块 入库模块 二、 数据库设计 1、数据库需求分析 在仔细调查企业仓库物资设备管理过程的基础上,得到本
7、系统所处理的数据流程如图 设备入库 设备采购 设备还库 设备出库 仓库现有库存 各部门需求 企业生产计划 汇总 本实例设计的数据项和数据结构如下: 1、 设备代码信息,包括的数据项有设备号、设备名称。 2、 现有库存信息,包括的数据项有设备、现有数目、总数目、最大库存和最小库存。 3、 设备使用信息,包括的数据项有使用的设备、使用部门、数目、使用时间和出库时状态等。 4、 设备采购信息,包括的数据项有采购的设备、采购员、供应商、采购数目和采购时间等。 5、 设备归还信息,包括的数据项有归还设备、归还部门、归还数目、归还时间和经手人等。 6、 设备需求信
8、息,包括的数据项有需求的部门、需求设备、需求数目和需求时间等。 2、数据库概念结构设计 本实例根据上面的设计规划出的实体有库存实体、入库实体、出库实体、采购实体、还库实体和需求实体,各实体的E-R图及其关系描述如下: 库存实体E-R图 现有库存 入库 出库 还库 设备号 入库实体E-R图 入库 供应商信息 采购价格数量 采购员 设备号
9、 出库实体E-R图 出库 使用部门 数量、时间 经手人 设备号 企业部门需求实体E-R图 部门需求 需求部门 需求数量 需求时间 设备号 还库实体E-R图 设备还库 还库时间人 还库数量 经手人 设备号 计划采购实体E-R图 计划采购 库存信息 供应信息 时间 设备号
10、 实体和实体之间的关系E-R图 入库 现有库存 出库 还库 部门需求 设备采购 3、数据库逻辑结构设计 在上面的实体以及实体之间的关系的基础上,形成数据库中的表格和各个表格之间的关系。仓库管理系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表。 表1-1 设备基本信息代码表device_code 列名 数据类型 可否为空 说明 code VARCHAR2(6) NOTNULL 设备号(主键)
11、 name VARCHAR2(20) NULL 设备名称 表1-2 企业部门基本信息表class_node 列名 数据类型 可否为空 说明 node VARCHAR2(6) NOTNULL 部门编号(主键) department VARCHAR2(20) NOTNULL 部门名称 表1-3 供应商设备信息表provider_node 列名 数据类型 可否为空 说明 node VARCHAR
12、2(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
13、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 出库
14、时间(主键) 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 设
15、备号(主键) 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) NOTNUL
16、L 部门名称 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 仓库管理
17、员 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.创立设备
18、基本信息代码device_code CREATE TABLE ”DMS”.device_code (code VARCHAR2(6) NOTNULL, name VARCHAR2(20) NOTNULL, CONSTRANT code_code_pk PRIMARY KEY(code) ) TABLESPACE”USER_DATA”; 2.创立企业部门基本信息代码class_node CREATE TABLE ”DMS”.class_node (node VARCHAR2(6) NOTNULL, Department VARCHAR2(20) NOTNULL, CON
19、STRANT node_node_pk PRIMARY KEY(node) ) TABLESPACE”USER_DATA”; 3.创立供应商设备信息代码provider_node CREATE TABLE ”DMS”.provider_node (node VARCHAR2(6) NOTNULL, provider VARCHAR2(20)NOTNULL, teleno VARCHAR2(10) NULL, Code VARCHAR2(6) NOTNULL, CONSTRANT node_node_pk PRIMARY KEY(node) ) TABLESP
20、ACE”USER_DATA”; 4.创立设备入库表 device_in CREATE 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, buyer VARCHAR2(10) NULL, CONSTRAINT in_date_pk PRIMARY KEY(in_date) ) TABLESPACE ”USER_DATA”;
21、 5.创立设备出库表 device_out CREATE 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, taker VARCHAR2(10) NULL, usage VARCHAR2(20) NULL, CONSTRAINT out_date_
22、pk PRIMARY KEY(out_date) ) TABLESPACE”USER_DATA”; 6.创立现有库存表 device CREATETABLE ”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 device_code_pk PRIMARY KEY(code) ) TABLESPACE”
23、USER_DATA”; 7.创立部门需求表 device_need CREATE 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_return CREATE TABLE ”DMS”,device_return ( cod
24、e 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.创立操作日志表 howdo CREATE TABLE ”DMS”,howdo ( do
25、user VARCHAR2(10) NOT NULL, do_what VARCHAR2(40) NOT NULL, do_date DATE NOT NULL, ) TABLESPACE ”USER_DATA”; 四、系统实现 4.1创立应用程序 (1)选择”FileNew”中的”新建项目”选项卡中”MFC AppWizard(exe)”,设置合适的目录和项目名,比如”E:\Project”目录下的”DMS”项目。 (2)创立一个对话框应用程序(”Dialog Based”),单击”Next”按钮。 (3)由于在这个项目中将要使用ADO,因此在MFC AppWizar
26、d的第二步,需要选中”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” inline void TESTHR(HRESULT x){if FAILED(x)_com_issue_error(x);}; #d
27、efine DATEFMT Cstring(”’%s”’) 4.2操作日志模块的设计 1、写日志模块 图1-10 使应用程序支持自动化 先定义一个名为ClogMngr的类 //LogMngr.h //定义一个Log管理器 class CLogMngr { public: CLogMngr(); virtual ~CLogMngr(); public: bool AddLog(LPCSTR op); void Setup(_ConnectionPtr cnnt, CString& use
28、r) { m_DBCnt = cnnt; m_user = user; } protected: _ConnectionPtr m_DBCnt; CString m_user; }; 下面是ClogMngr::AddLog内部实现详细过程。 //LogMngr.cpp //向数据库中添加Log记录的代码。 bool CLogMngr::AddLog(LPCSTR op) { CTime tm = CTime::GetCurrentTime(); CString sql_; sql_.Format("INSERT INTO HOWDO
29、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_; try { m_DBCnt->Execute(sql,NULL,adCmdText); } catch(_com_error& e) { CStr
30、ing Error = e.ErrorMessage(); AfxMessageBox(e.ErrorMessage()); return false; } return true; } 2、读日志模块 图1-11 查看日志窗口 初始化界面代码如下: BOOL CDlgViewLog::OnInitDialog() { CDialog::OnInitDialog(); m_list.InsertColumn(0,"操作员"); m_list.Insert
31、Column(1,"操作日期"); m_list.InsertColumn(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()
32、 return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDlgViewLog::RefreshData() { m_list.DeleteAllItems(); m_list.SetRedraw(FALSE); _bstr_t strSQL("SELECT * FROM HOWDO"); _RecordsetPtr M
33、ySet; int i = 0; try { MySet.CreateInstance(__uuidof(Recordset)); MySet = m_DBCnt->Execute(strSQL,NULL,adCmdText); _variant_t Holder; while(!MySet->adoEOF) { Holder = MySet->GetCollect("do_user"); if(Holder.vt!=VT_NULL) m_list.InsertItem(i, (char*)(_bstr
34、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();
35、 } 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.GetSelectio
36、nMark(); 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 //删除所有日志记录的函数。 void CDlgViewLog::OnBtnVlrmall() { _bstr_t strSQL("TRUNCATE TABLE HOWDO"); try { m_DBCnt->
37、Execute(strSQL,NULL,adCmdText); } catch(_com_error& e) { AfxMessageBox(e.ErrorMessage()); EndDialog(0); } RefreshData(); } 4.3登录窗口的设计和程序初始化 在CDMSDlg::OnInitDialog()中加入这样一段代码: //DMSDlg.cpp //弹出登录界面 CDlgLogIn dlg; do { if (!dlg.DoModal(
38、)) EndDialog(0); } while (dlg.m_UsrName.GetLength()==0); 它的目的是弹出图1-12所示的登录对话框,并从中获得一个有效的用户名。 图1-12 登录界面 得到有效用户名后,程序用如下代码: // DMSDlg.cpp //建立数据库连接,初始化成员变量 //登录数据库,若失败,则关闭程序。 { m_DBCnt.CreateInstance(__uuidof(Connection)); CString sql_; sql_.Format("DSN=DMS;UID=%s;PWD=%s"
39、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); }
40、 在程序结束时关闭数据库连接。 // DMSDlg.cpp //关闭数据库连接 void CDMSDlg::OnDestroy() { CDialog::OnDestroy(); m_DBCnt->Close(); } 4.4主对话框界面的设计 登录完成后,显示出主对话框。它的界面设计如图1-13所示,单击某个按钮就能弹出某个功能的界面。 图1-13 主对话框界面 以其中”设备代码”按钮为例,说明它的事件处理函数。代码如下: // DMSDlg.cpp //显示设备代码管理界面 void CDMSDlg::OnBtnDevco
41、de() { CDlgDevcode dlg; dlg.Setup(m_DBCnt,&m_logMngr); this->ShowWindow(SW_HIDE); dlg.DoModal(); this->ShowWindow(SW_SHOW); } 其它按钮的事件处理函数,代码与”设备代码”按钮的事件处理函数相同。 4.5设备代码管理窗口的建立 对话框类名为CdlgDevcode设计如图1-14所示 设备代码管理窗口 //DlgDevcode.cpp //对话框的初始化 BOOL CDlgDev
42、code::OnInitDialog() { CDialog::OnInitDialog();//切分列表控件 m_list.InsertColumn(0,"设备号"); m_list.InsertColumn(1,"设备名"); RECT rect; m_list.GetWindowRect(&rect); int wid = rect.right - rect.left; m_list.SetColumnWidth(0,wid/2); m_list.SetColumnWidth(1,wid/2); m_list.SetExtendedSt
43、yle(LVS_EX_FULLROWSELECT);//读取已有数据 RefreshData(); return TRUE; } // DlgDevcode.cpp //消息映射部分 BEGIN_MESSAGE_MAP(CDlgDevcode, CDialog) //{{AFX_MSG_MAP(CDlgDevcode) ON_NOTIFY(NM_CLICK, IDC_LIST_DEVCODE, OnClickListDevcode) //}}AFX_MSG_MAP END_MESSAGE_MAP() //事件处理部分 void CDlgDevc
44、ode::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 : implementation file // #include "stdafx.h" #i
45、nclude "DMS.h" #include "DlgDevcode.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //////////////////////////////////////////////////////////////////////////// // CDlgDevcode dialog CDlgDevcode::CDlgDevcode(CWnd* pParent /*=NULL*/) :
46、CDialog(CDlgDevcode::IDD, pParent) { //{{AFX_DATA_INIT(CDlgDevcode) m_code = _T(""); m_name = _T(""); //}}AFX_DATA_INIT m_DBCnt = NULL; m_log = NULL; } void CDlgDevcode::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgDevcode) DDX_C
47、ontrol(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 } BEGIN_MESSAGE_MAP(CDlgDevcode, CDialog) //{{AFX_MSG_MAP(CDlgDevcode) ON_NOTIFY(NM_CLICK, IDC_LIST_DEVCODE, OnClickListDevcode) ON_BN_CLICKED(I
48、DC_BTN_DCADD, OnBtnDcadd) ON_BN_CLICKED(IDC_BTN_DCDEL, OnBtnDcdel) ON_BN_CLICKED(IDC_BTN_DCUPD, OnBtnDcupd) //}}AFX_MSG_MAP END_MESSAGE_MAP() //////////////////////////////////////////////////////////////////////////// // CDlgDevcode message handlers //负责读取已有数据的函数 void CDlgDevcode::Refres
49、hData() { m_list.DeleteAllItems(); m_list.SetRedraw(FALSE); _bstr_t strSQL("SELECT * FROM DEVICE_CODE"); _RecordsetPtr MySet; int i = 0; try { MySet.CreateInstance(__uuidof(Recordset)); //执行SOL语句读取记录 MySet = m_DBCnt->Execute(strSQL,NULL,adCmdText); _variant_t Holder;
50、 while(!MySet->adoEOF) { //取出code字段的数据 Holder = MySet->GetCollect("code"); if(Holder.vt!=VT_NULL) m_list.InsertItem(i, (char*)(_bstr_t)Holder); //取出name字段的数据 Holder = MySet->GetCollect("name"); if(Holder.vt!=VT_NULL) m_list.SetItemText(i, 1, (cha






