精品仓库管理计算机毕业设计仓库管理系统Word下载.docx
《精品仓库管理计算机毕业设计仓库管理系统Word下载.docx》由会员分享,可在线阅读,更多相关《精品仓库管理计算机毕业设计仓库管理系统Word下载.docx(30页珍藏版)》请在冰豆网上搜索。
●●设备采购信息,包括的数据项有采购的设备、采购员、供应商、采购数目和采购时间等。
●●设备归还信息,包括的数据项有归还设备、归还部门、归还数目、归还时间和经手人等。
●●设备需求信息,包括的数据项有需求的部门、需求设备、需求数目和需求时间等。
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
列名,数据类型,可否为空,说明
code,VARCHAR2(6),NOTNULL,设备号(主键)
name,VARCHAR2(20),NULL,设备名称
表1-2设备入库表device_in
code,VARCHAR2(6),NOTNULL,设备号
in_date,DATE,NOTNULL,入库时间(主键)
provider,VARCHAR2(20),NULL,供应商
teleno,VARCHAR2(10),NULL,供应商电话
in_number,NUMBER(6),NULL,入库数量
price,NUMBER(6),NULL,价格
buyer,VARCHAR2(10),NULL,采购员
表1-3设备出库表device_out
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-4现有库存表device
now_number,NUMBER(6),NULL,现有库存
high_number,NUMBER(6),NULL,最大库存
low_number,NUMBER(6),NULL,最少库存
total_number,NUMBER(6),NULL,总数
表1-5部门需求表device_need
department,VARCHAR2(20),NOTNULL,部门名称
need_number,NUMBER(6),NULL,需求数量
begin_date,DATE,NULL,需求开始时间
end_date,DATE,NULL,需求结束时间
表1-6设备还库表device_return
return_date,DATE,NULL,还库时间(主键)
keeper,VARCHAR2(20),NULL,仓库管理员
return_number,NUMBER(6),NULL,归还数量
return_date,VARCHAR2(10),NULL,归还人
表1-7操作日志表howdo
do_user,VARCHAR2(10),NOTNULL,操作员
do_what,VARCHAR2(40),NOTNULL,操作内容
do_date,DATE,NOTNULL,操作时间
表1-8设备采购计划表device_wantbuy
total_number,NUMBER(6),NULL,总库存
max_number,NUMBER(6),NULL,最大库存
buy_number,NUMBER(6),NULL,购买数量
provider,VARCHAR2(10),NULL,供应商
buy_date,DATE,NULL,计划采购时间(主键)
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();
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'
'
%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;
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);
do_date"
m_list.SetItemText(i,1,(char*)(_bstr_t)Holder);
do_what"
m_list.SetItemText(i,2,(char*)(_bstr_t)Holder);
MoveNext();
Close();
m_list.SetRedraw(TRUE);
return;
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
//删除所有日志记录的函数。
OnBtnVlrmall()
TRUNCATETABLEHOWDO"
EndDialog(0);
6、登录窗口的设计和程序初始化
在CDMSDlg:
OnInitDialog()中加入这样一段代码:
//DMSDlg.cpp
//弹出登录界面
CDlgLogIndlg;
do
if(!
dlg.DoModal())
}while(dlg.m_UsrName.GetLength()==0);
它的目的是弹出图1-12所示的登录对话框,并从中获得一个有效的用户名。
图1-12登录界面
得到有效用户名后,程序用如下代码:
//建立数据库连接,初始化成员变量
//登录数据库,若失败,则关闭程序。
m_DBCnt.CreateInstance(__uuidof(Connection));
DSN=DMS;
UID=%s;
PWD=%s"
dlg.m_UsrName,dlg.m_UsrPwd);
//建立连接
Open(sql,"
"
"
-1);
//初始化日志管理器
m_logMngr.Setup(m_DBCnt,dlg.m_UsrName);
//记录此次登录
m_logMngr.AddLog("
登录数据库"
this->
在程序结束时关闭数据库连接。
//关闭数据库连接
voidCDMSDlg:
OnDestroy()
OnDestroy();
7、主对话框界面的设计
登录完成后,显示出主对话框。
它的界面设计如图1-13所示,单击某个按钮就能弹出某个功能的界面。
图1-13主对话框界面
以其中“设备代码”按钮为例,说明它的事件处理函数。
代码如下:
//显示设备代码管理界面
OnBtnDevcode()
CDlgDevcodedlg;
dlg.Setup(m_DBCnt,&
m_logMngr);
ShowWindow(SW_HIDE);
dlg.DoModal();
ShowWindow(SW_SHOW);
其他按钮的事件处理函数,代码与“设备代码”按钮的事件处理函数相同。
8、设备代码管理窗口的建立
对话框类名为CdlgDevcode设计如图1-14所示
图1-14设备代码管理窗口
//DlgDevcode.cpp
//对话框的初始化
BOOLCDlgDevcode:
//切分列表控件
设备号"
设备名"
m_list.SetColumnWidth(0,wid/2);
m_list.SetColumnWidth(1,wid/2);
//读取已有数据
//消息映射部分
BEGIN_MESSAGE_MAP(CDlgDevcode,CDialog)
//{{AFX_MSG_MAP(CDlgDevcode)
ON_NOTIFY(NM_CLICK,IDC_LIST_DEVCODE,OnClickListDevcode)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//事件处理部分
voidCDlgDevcode:
OnClickListDevcode(NMHDR*pNMHDR,LRESULT*pResult)
m_code=m_list.GetItemText(i,0);
m_name=m_list.GetItemText(i,1);
其余程序的清单如下:
//DlgDevcode.cpp:
implementationfile
//
#include"
stdafx.h"
DMS.h"
DlgDevcode.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
////////////////////////////////////////////////////////////////////////////
//CDlgDevcodedialog
CDlgDevcode:
CDlgDevcode(CWnd*pParent/*=NULL*/)
CDialog(CDlgDevcode:
IDD,pParent)
//{{AFX_DATA_INIT(CDlgDevcode)
m_code=_T("
m_name=_T("
//}}AFX_DATA_INIT
m_DBCnt=NULL;
m_log=NULL;
DoDataExchange(CDataExchange*pDX)
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
ON_BN_CLICKED(IDC_BTN_DCADD,OnBtnDcadd)
ON_BN_CLICKED(IDC_BTN_DCDEL,OnBtnDcdel)
ON_BN_CLICKED(IDC_BTN_DCUPD,OnBtnDcupd)
//CDlgDevcodemessagehandlers
//负责读取已有数据的函数
SELECT*FROMDEVICE_CODE"
//执行SOL语句读取记录
{//取出code字段的数据
code"
//取出name字段的数据
name"
//负责添加记录的函数
voidCDlgDevcode