仓库管理系统仓库管理是整个物资供应管理系统的核心。本实例着重讲解仓库管理模块,给出数据库设计和程序实现过程。1、系统设计1、1系统设计目标系统开发的总统任务是实现企业物资设备管理的系统化、规范化和自动化,从而达到仓库管理效率的目的。1、2开发设计思想在本系统的设计过程中,为了克服仓库管理信息处理量大的困难,满足计算机管理的需要,采取了下面的一些原则:●●统一各种原始单据的格式,统一帐目和报表的格式。●●删除不必要的管理冗余,实现管理规范化、科学化。●●程序代码标准化,软件统一化,确保软件的可维护性和实用性。●●界面尽量简单化,做到实用、方便,尽量满足企业不同层次员工的需要。●●建立操作日志,系统自动记录所进行的各种操作。1、3系统功能分析本例中的仓库管理系统需要完成的功能主要有以下几点:●●仓库管理各种信息的输入,包括入库、出库、还库、需求信息的输入等。●●仓库管理各种信息的查询、修改和维护。●●设备采购报表的生成。●●在库存管理中加入最高储备和最低储备字段,对仓库中的物资设备实现监控和报警。●●企业各部门的物资需求的管理。●●操作日志的管理。●●仓库管理系统的使用帮助。1、4系统功能模块设计在系统功能分析的基础上,结合VisualC++程序编制的特点,得到如图1-1所示的系统功能模块图。图1-1系统功能模块图2、数据库设计仓库管理系统系统模块维护模块输入模块查看模块报表模块帮助模块入库模块还库模块出库模块需求模块日志管理2、1数据库需求分析在仔细调查企业仓库物资设备管理过程的基础上,得到本系统所处理的数据流程如图1-2所示:图1-2数据流程图本实例设计的数据项和数据结构如下:●●设备代码信息,包括的数据项有设备号、设备名称。●●现有库存信息,包括的数据项有设备、现有数目、总数目、最大库存和最小库存。●●设备使用信息,包括的数据项有使用的设备、使用部门、数目、使用时间和出库时状态等。●●设备采购信息,包括的数据项有采购的设备、采购员、供应商、采购数目和采购时间等。●●设备归还信息,包括的数据项有归还设备、归还部门、归还数目、归还时间和经手人等。●●设备需求信息,包括的数据项有需求的部门、需求设备、需求数目和需求时间等。2、2数据库概念结构设计本实例根据上面的设计规划出的实体有库存实体、入库实体、出库实体、采购实体、还库实体和需求实体,各实体的E-R图及其关系描述如下:图1-3库存实体E-R图仓库现有库存各部门需求企业生产计划汇总设备采购设备出库设备入库设备还库现有库存设备号现有库存警戒库存总数入库设备号供应商信息采购价格数量采购员图1-4入库实体E-R图图1-5出库实体E-R图图1-6部门需求实体E-R图图1-7还库实体E-R图出库设备号使用部门数量时间经手人部门需求设备号需求部门需求数量需求时间设备还库设备号还库时间、人还库数量经手人计划采购设备号库存信息供应信息时间图1-8计划采购实体E-R图图1-9实体和实体之间的关系E-R图2、3数据库逻辑结构设计在上面的实体以及实体之间的关系的基础上,形成数据库中的表格和各个表格之间的关系。仓库管理系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表。表1-1设备代码表device_code列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号(主键)nameVARCHAR2(20)NULL设备名称表1-2设备入库表device_in列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号in_dateDATENOTNULL入库时间(主键)providerVARCHAR2(20)NULL供应商telenoVARCHAR2(10)NULL供应商电话in_numberNUMBER(6)NULL入库数量priceNUMBER(6)NULL价格buyerVARCHAR2(10)NULL采购员表1-3设备出库表device_out列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号departmentVARCHAR2(20)NULL使用部门out_dateDATENULL出库时间(主键)out_stateNUMBER(1)NULL出库状态out_personVARCHAR2(10)NULL经手人out_numberNUMBER(6)NOTNULL出库数量takerVARCHAR2(10)NULL领取人usageVARCHAR2(20)NULL用途表1-4现有库存表device列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号(主键)now_numberNUMBER(6)NULL现有库存high_numberNUMBER(6)NULL最大库存low_numberNUMBER(6)NULL最少库存入库现有库存出库还库部门需求设备采购total_numberNUMBER(6)NULL总数表1-5部门需求表device_need列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号departmentVARCHAR2(20)NOTNULL部门名称need_numberNUMBER(6)NULL需求数量begin_dateDATENULL需求开始时间end_dateDATENULL需求结束时间表1-6设备还库表device_return列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号return_dateDATENULL还库时间(主键)keeperVARCHAR2(20)NULL仓库管理员return_numberNUMBER(6)NULL归还数量return_dateVARCHAR2(10)NULL归还人表1-7操作日志表howdo列名数据类型可否为空说明do_userVARCHAR2(10)NOTNULL操作员do_whatVARCHAR2(40)NOTNULL操作内容do_dateDATENOTNULL操作时间表1-8设备采购计划表device_wantbuy列名数据类型可否为空说明codeVARCHAR2(6)NOTNULL设备号now_numberNUMBER(6)NULL现有库存total_numberNUMBER(6)NULL总库存max_numberNUMBER(6)NULL最大库存buy_numberNUMBER(6)NULL购买数量providerVARCHAR2(10)NULL供应商priceNUMBER(6)NULL价格buy_dateDATENULL计划采购时间(主键)3、数据库结构的实现4、创建应用程序(1)(1)选择“FileNew”中的“新建项目”选项卡中“MFCAppWizard(exe)”,设置合适的目录和项目名,比如“E:\Project”目录下的“DMS”项目。(2)(2)创建一个对话框应用程序(“DialogBased”),单击“Next”按钮。(3)(3)由于在这个项目中将要使用ADO,所以在MFCAppWizard的第二步,需要选中“Automation”选项,使应用程序能够支持自动化对象。如图1-10所示(4)(4)单击“Finish”按钮结束项目的创建。主对话框名为CDMSDlg。(5)(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”’)5、操作日志模块的设计(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_N