仓库管理系统的设计与实现.docx

上传人:b****8 文档编号:10769891 上传时间:2023-02-22 格式:DOCX 页数:55 大小:157.18KB
下载 相关 举报
仓库管理系统的设计与实现.docx_第1页
第1页 / 共55页
仓库管理系统的设计与实现.docx_第2页
第2页 / 共55页
仓库管理系统的设计与实现.docx_第3页
第3页 / 共55页
仓库管理系统的设计与实现.docx_第4页
第4页 / 共55页
仓库管理系统的设计与实现.docx_第5页
第5页 / 共55页
点击查看更多>>
下载资源
资源描述

仓库管理系统的设计与实现.docx

《仓库管理系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《仓库管理系统的设计与实现.docx(55页珍藏版)》请在冰豆网上搜索。

仓库管理系统的设计与实现.docx

仓库管理系统的设计与实现

数据库

课程设计报告

题目:

仓库管理系统

组长:

组员:

指导教师:

曹永春

计算机科学与信息工程学院

仓库管理系统

一、设计目标

企业的仓库物资管理往往复杂、繁琐。

本系统主要针对企业生产所需要的各种设备而设计,实施验收入库并填写入库单和入库登记;企业各个部门根据所需要提出物质申请,计划员根据整个企业的需求开出物资设备出库单,仓库管理员根据出库单核对发放设备;设备使用完毕需要及时归还入库,填写还入库单。

系统还根据需要按照月、季、年进行统计分析,产生相应报表。

根据系统功能的要求,仓库管理系统可以分为日志管理、入库、出库、还库、查询、报表等主要模块。

企业的物资供应管理往往是很复杂、繁琐的。

由于掌握的物资种类众多,订货、管理、发放的渠道各有差异,各个企业之间的管理机制不尽相同,各类统计计划报表繁多,因此物资管理必须实现计算机化,而且必须根据企业的具体情况制定相应的方案以便提高工作效率。

根据当前的企业管理体制,一般物资供应管理系统,总是根据所掌握的物资类别,相应分成几个科室来进行物资的计划、订货、核销托收、验收入库。

根据企业各个部门的来发送物资设备,并随时按期进行库存盘点、做台帐、根据企业自身领导和自身管理的需要按月、季、年进行统计分析,产生相应的报表。

为了加强相应物资、设备的管理,要定期掌握其储备、消耗情况,根据计划定额和实际消耗定额的比较,进行定额管理。

仓库管理的物资在本章中主要是企业生产所需的各种设备。

进货时检查合同确认为有效托收之后,进行验收入库、填写入库单和入库登记。

企业各个部门根据所需要的物资设备总额和部门生产活动所需要提出物资需求申请,计划员根据企业的需求开出物资设备出库单,仓库管理员根据出库单核对发放设备。

设备使用完毕需要及时归还入库,填写还入库单。

系统还根据需要按照月、季、年进行统计分析,产生相应报表。

为了跟好的理解该系统和读懂该系统的源代码,读者应对以下的知识点有所了解:

·Access数据库操作的基础知识。

·ODBC数据源基础知识。

·基本的SQL语句,如添加、查询、修改和删除记录语句。

·VisualC++界面设计和关于数据库的基础知识。

二、系统设计

仓库管理的特点是信息处理量比较大,所管理的物资设备种类繁多,而且入库单、出库单、需求单等单据的发生量特别大,关联信息多,查询和统计的方式各不相同,在管理上实现起来有一定的困难。

在管理的过程中经常出现信息的重复传递;单据、报表的种类繁多,各个部门管理规格不统一等问题。

在本系统的设计过程中,为了克服这些困难,满足计算机管理的需要,采取了下面的一些原则:

·统一各种原始单据的格式,统一账目和报表的格式。

·删除不必要的管理冗余,实现管理规范化、科学化。

·程序代码标准化,软件统一化,确保软件的可维护性和实用性。

·界面尽量简单化,做到实用、方便,尽量满足企业中不同层次员工的需要。

·建立操作日志,系统自动记录所进行的各种操作。

1、系统功能分析

本例中的仓库管理系统需要完成的功能主要有以下几点:

·仓库管理各种信息的输入,包括入库、出库、还库、需求信息的输入等。

·仓库管理各种信息的查询、修改和维护。

·设备采购报表的生成。

·在库存管理中加入最高储备和最低储备字段,对仓库中的物资设备实现监控和报警。

·企业各部门的物资需求的管理。

·操作日志的管理。

·仓库管理系统的使用帮助。

2、系统功能模块设计

在系统功能分析的基础上,结合VisualC++程序编制的特点,得到如图1所示的系统功能模块图。

图1系统功能模块图

系统主要界面及流程如下所示。

程序开始运行之后先出现如图2的登陆界面。

成功输入用户名和密码后将进入主对话框。

图2登陆界面

单击“设备代码”按钮进入设备代码表(device_code)的管理。

单击“库存信息”按钮进入现有库存表(device)的管理。

单击“设备入库”按钮开始设备入库操作,若成功,则在设备入库表(device_in)中增加一条记录,同时修改现有的库存表(device)中的相关数据。

单击“设备出库”按钮开始设备出库操作,如图3所示。

若成功,则在设备出库表(device)中的相关数据。

图3设备出库登记窗口

单击下方的“出库信息”按钮进入设备出库表(device_out)的管理。

如图4所示。

图4出库信息管理界面

单击“设备还库”按钮开始设备还库操作。

若成功,则在设备还库表(device_return)中增加一条记录,同时修改现有库存表(device)中的相关数据。

单击下方的“还库信息”按钮进入设备还库表(device_return)的管理。

单击“设备需求”进入设备需求登记的界面,如图5所示。

用户在这里填写设备需求。

若成功,则在设备需求表(device_need)中增加一条设备需求记录。

图5设备需求登记窗口

单击下方“需求信息”按钮进入设备需求表(device_need)的管理。

如图6所示。

单击“操作日志”按钮查看目前的所有操作日志记录,在里面还可以删除所有日志记录。

单击“帮助”按钮进入联机帮助。

单击“关于”按钮查看程序信息

图6需求信息管理窗口

三、数据库设计

1、数据库需求分析

在仔细调查企仓库物资设备管理过程的基础上,得到本系统所处理的数据流程,如图7所示。

图7数据流程图

针对本实例,通过对企业仓库管理的内容和数据流程的分析,设计的数据项和数据结构如下:

·设备代码信息:

其数据项有设备号、设备名称

·现有库存信息:

其数据项有现有设备、现有数目、总数目、最大库存和最小库存等

·设备使用信息:

其数据项有使用的设备、使用部门、数目、使用时间和出库时状态等

·设备采购信息:

其数据项有采购的设备、采购员、供应商、采购数目和采购时间等

·设备归还信息:

其数据项归还设备、归还部门、归还数目、归还时间和经手人等

·设备需求信息:

其数据项有需求的部门、需求设备、需求数目和需求时间等

2、数据概念结构设计

这一设计阶段是在需求分析的基础上,设计出能满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。

本实例根据上面得设计规划出实体有库存实体,入库实体、出库实体、采购实体、还库实体和需求实体。

各实体的E-R图及其关系描述如下:

图8库存实体E-R图

图9入库实体E-R图

图10出库实体E-R图

图11部门需求实体E-R图

图12还库实体E-R图

图13计划采购实体E-R图

图14实体和实体之间的关系E-R图

3、数据库逻辑结构设计

在上面的实体以及实体之间的关系的基础上,形成数据库中的表格和各个表格之间的关系。

仓库管理系统数据库中的各个表格的设计结果如下面的几个表格所示。

每个表格表示在数据库中的一个表。

列名

数据类型

可否为空

说明

Code

VARCHAR2(6)

NOTNULL

设备号(主键)

Name

VARVHAR2(20)

NULL

设备名称

设备代码表device_code

列名

数据类型

可否为空

说明

Code

VARCHAR2(6)

NOTNULL

设备号

In_date

DATE

NOTNULL

入库时间(主键)

Provider

VARCHAR2(20)

NULL

供应商

Teleno

VARCHAR2(20)

NULL

供应商电话

In_number

NUMBER(6)

NULL

入库数量

Price

NUMBER(6)

NULL

价格

Buyer

VARCHAR2(10)

NULL

采购

设备库表device_in

列名

数据类型

可否为空

说明

Code

VARCHAR2(6)

NOTNULL

设备号

Department

VARCHAR2(20)

NULL

使用部门

Out_date

DATE

NULL

出库时间(主键)

Out_state

NUMBER

(1)

NULL

出库状况

Out_person

VARCHAR2(10)

NULL

经手人

Out_number

NUMBER2(10)

NOTNULL

出库数量

Taker

VARCHAR2(10)

NULL

领取

Usage

VARCHAR2(20)

NULL

用途

设备出库表device_out

列名

数据类型

可否为空

说明

code

VARCHAR2(6)

NOTNULL

设备号(主键)

now_number

NUMBER(6)

NULL

现有库存

high_number

NUMBER(6)

NULL

最大库存

low_number

NUMBER(6)

NULL

最小库存

total_number

NUMBER(6)

NULL

总数

现有数据库表device

列名

数据类型

可否为空

说明

code

VARCHAR2(6)

NOTNULL

设备号

department

VARCHAR2(20)

NOTNULL

部门名称

need_number

NUMBER(6)

NULL

需要数量

begin_date

DATE

NULL

需求开始时间

end_date

DATE

MULL

需求结束时间

设备需求表device_need

列名

数据类型

可否为空

说明

code

VARCHAR2(6)

NOTNULL

设备号

return_date

DATE

NULL

还库时间(主键)

keeper

VARCHAR2(10)

NULL

仓库管理员

return_number

NUMBER(6)

NULL

归还数量

return_person

VARCHAR2(10)

NULL

归还人

设备还库表device_return

列名

数据类型

可否为空

说明

do_user

VARCHAR2(10)

NOTNULL

操作员

do_what

VARCHAR2(40)

NOTNULL

操作内容

do_date

DATE

NOTNULL

操作时间

操作日志表howdo

列名

数据类型

可否为空

说明

code

VARCHAR2(6)

NOTNULL

设备号

now_number

NUMBER(6)

NULL

现有库存

total_number

NUMBER(6)

NULL

总库存

max_number

NUMBER(6)

NULL

购买数量

provider

VARCHAR

(2)

NULL

供应商

price

NUMBER(6)

NULL

价格

buy_date

DATE

NULL

计划采购时间(主键)

设备采购计划表device_wantbuy

4、数据库结构的实现

创建设备代码device_code

CREATETABLE“DMS”.device_code

(codeVARCHAR2(6)NULL,

nameVARCHAR2(20)NULL,

CONSTRANTcode_code_pkPRIMARYKEY(code)

TABLESPACE”USER_DATA”;

创建设备入库表device_in

CREATETABLE“DMS”.device_in

codeVARCHAR2(6)NOTNULL,

in_dateDATENOTNULL,

providerVARCHAR2(20)NULL,

telenoVARCHAR2(10)NULL,

in_numberNUMBER(6)NULL,

priceNUMBER(6)NULL,

buyerVARCHAR2(10)NULL,

CONSTRAINTin_date_pkPRIMARYKEY(in_date)

TABLESPACE“USER_DATA”;

创建设备出库表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”;

创建现有库存表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”;

创建部门需求表device_need

CREATETABLE“DMS”,device_need

codeVARCHAR2(10)NOTNULL,

departmentVARCHAR2(10)NOTNULL,

need_numberNUMBER(6)NULL,

begin_dateDATENULL,

end_dateDATENULL,

TABLESPACE”USER_DATA”;

创建设备还库表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”;

创建设备采购计划表device_wantbuy

CREATETABLE“DMS”,device_wantbuy

codeVARCHAR2(10)NOTNULL,

now_numberNUMBER(6)NULL,

total_numberNUMBER(6)NULL,

max_numberNUMBER(6)NULL,

buy_numberNUMBER(6)NULL,

providerVARCHAR2(20)NULL,

priceNUMBER(6)NULL,

buy_dateDATENULL,

CONSTRAINTwantbuy_date_pkPRIMARYKEY(buy_date)

TABLESPACE”USER_DATA”;

创建操作日志表howdo

CREATETABLE“DMS”,howdo

do_userVARCHAR2(10)NOTNULL,

do_whatVARCHAR2(40)NOTNULL,

do_dateDATENOTNULL,

TABLESPACE“USER_DATA”;

四、系统实现

1、创建应用程序

此仓库系统应用程序的创建步骤如下:

、选择菜单“File|New”中的“新建项目”选项卡中“MFCAppWizard(exe)”,设置合适的目录和项目名,比如“E:

\Projects”目录下的“DMS”项目。

、创建一个对话框应用程序(“DialogBased”),单击“Next”按钮。

、由于在这个项目中将要使用ADO,所以在MFCAppWizard的第2步,需要选中“Automation”选项,使应用程序能够支持自动化对象,如图15所示。

图15使应用程序支持自动化(Automation)

、单击“Finish”按钮,结束项目的创建。

至此一个基于对话框的应用程序框架就搭建好了。

主对话框名为CDMSDlg。

、项目创建完毕之后,在头文件stdafx.h中加入下面4行:

#import"c:

\programfiles\commonfiles\system\ado\msado15.dll"no_namespacerename("EOF","adoEOF")

#include"icrsint.h"

inlinevoidTESTHR(HRESULTx){ifFAILED(x)_com_issue_error(x);};

#defineDATEFMTCString("'%s'")

第1行中的路径可能根据VisualStudio安装路径的不同而不同。

其中的rename指令,把ADO中的EOF重命名为adoEOF,这是为了避免和其他库的常量名冲突。

注意第3行,这里定义了一个inline函数TESTHER,它的作用是测试COM函数的返回值,在这个返回值包含一个错误的时候,抛出一个_com_error型的异常。

ADO作为一个COM组件接口,它的许多函数都会返回一个HRESULT型的值作为结果。

如果在每一步都用SUCCEEDED或FAILED宏测试返回值的话,将会不胜其烦,还有可能制造出一连串嵌套的if语句这样不美观的代码。

这个函数简化了这种验证操作,利用C++的异常处理机制,使代码显得紧凑而高效,为后面的工作带来很大方便。

第4行定义了一个宏。

这是不同的后台数据库对SQL语句中日期的用法要求不同引起的。

比如Access数据库要求SQL语句中的日期用两个#字符括起,而其他的数据库可能需要使用单引号或者双引号。

所以在这里定义了这个DATEFMT宏,为了方便程序在不同的后台数据库键切换。

这是一个在开发的时候需要注意的细节,后面还会具体提到。

2、COM知识准备

下面介绍一些关于COM知识。

这部分内容是针对那些没有学习过的COM技术的读者,目的是为他们理解ADO提供一些背景知识。

COM技术在微软公司的应用中可以说是无处不在,Windows系统相当多的服务都以这种方式提供,例如着名的DirectX,还有在这一章中广泛应用的ADO。

ADO的底层是OLEDB,他本身则是对OLEDB的一个COM包装。

所以具备一些COM的知识,对使用ADO是很有帮助的,但并不是说必须要精通COM才能使用ADO。

事实上,在一般的应用中,只需要理解下面这段代码即可。

//DlgViewReport.cpp

_RecordsetPtrpRst=NULL;

IADORecordBinding*picRs=NULL;//InterfacePointerdeclared.(VC++Extensions)

CDevBuyRsrs;

try

{

_bstr_tstrSQL("SELECT*FROMDEVICE_WANTBUY");

TESTHR(pRst.CreateInstance(__uuidof(Recordset)));

pRst=m_DBCnt->Execute(strSQL,NULL,adCmdText);

TESTHR(pRst->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs));

TESTHR(picRs->BindToRecordset(&rs));

inti=0;

while(!

pRst->adoEOF)

{

m_list.InsertItem(0,rs.m_sz_code);

m_list.SetItemText(i,1,rs.m_sz_now);

m_list.SetItemText(i,2,rs.m_sz_total);

m_list.SetItemText(i,3,rs.m_sz_max);

m_list.SetItemText(i,4,rs.m_sz_buy);

m_list.SetItemText(i,5,rs.m_sz_provider);

m_list.SetItemText(i,6,rs.m_sz_price);

m_list.SetItemText(i,7,rs.m_sz_date);

pRst->MoveNext();

}

picRs->Release();

pRst->Close();

}

catch(_com_error&e)

{

AfxMessageBox(e.ErrorMessage());

m_list.SetRedraw(TRUE);

return;

}

、BSTR和_bstr_t

下面的语句声明了一个_bstr_t型的变量,_bstr_t是对BSTR类型的一个封装。

_bstr_tstrSQL(“SELETE*FROMDEVICE_WANTBUY”);

对于BSTR,通俗地说,它是COM中使用的字符串,与普通C程序中的字符串的区别在于:

·它一个带有字符计数值的字符串。

·它的字符计数值在字符数组的前面。

·它保存的在字符是所谓的“宽字符”(Widecharacter)。

所以,对于一个BSTR而言,下面的语句就是错的。

BSTRstr=L”Somewords”;

正确的做法是:

Wchar_tst_=L”Somewords”

BSTRstr;

Bstr=SysAllocString(str_)

释放一个SBSTR指针时,则调用SysFreeString函数。

每次都这样操控字符串未免太过麻烦,所以VisualC++里提供了_bstr_t这个类对BSTR做了封装,使程序员可以简单的对这种COM字符串进行操作了。

、IADORecordBinding和Iunkown

一个COM组件包含了许多COM对象,程序员通过“接口”来操控这些对象,或者说,这些对象通过提供给程序员的接口来实现自己的功能。

下面这行代码中的IADORecordBind就是一个指向这种接口的指针。

IADORecordBingding*picRs=NULL;//InterfacePointerdeclared(VC++Extension)

每个接口都是从IUnkown这个接口派生出来的。

IUkown接口声明了3个纯虚函数:

HRESULTQueryInterface(REFIDrilid,void**ppvObject);

ULONGAddRef();

ULONGAddRef();

一般来说,不能直接拥有一个IADORecordBind或者IFoo、IBirdISomeInterface诸如此类的接口对象,程序员只能得到一个接口的指针,就像下面的这行代码:

pRst->QueryInterface(_uuidof(IADORecordBingding),(LPVOID*)&picRs);

这行代码解释了IUknown接口中QueryInterfae方法的最基本的用法:

程序员用它来得到COM对象支持的某个接口的指针。

如上例中,pRst

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1