资源描述
第1章 序言
随着计算机技术的不断发展,公司、企业和机关的计算机自动化管理已经十分普及,计算机技术已经深入到企业管理的各个方面。一般小型企业的库存管理大部分还是手工操作,工作起来效率很低,并且不能及时了解库存的具体情况。同时,由于不可避免的人为因素,造成库存商品数量及价格的错报和漏报等情况。本文设计的库存管理系统实现了仓库的计算机量化管理,利用它可以安全、可靠的管理仓库物品来往业务,不仅可以保障仓库安全和商品数量的透明,更可以提高公司的管理水平和对外形象。
库存管理是企业各项工作的重点,市场经济的高速发展给企业带来了很多变革的契机,我们必须在进行机构改革的同时,尽快使用现代化管理设备、管理手段、管理方法。计算机在企业管理中应用的普及,利用计算机实现库存管理势在必行。
将计算机技术应用到库存管理中对于提高工作效率,有很大的帮助,特别是库存管理系统的应用,对于大中型企业来说,利用计算机支持企业高效率完成货物来往的复杂性,是适应现代企业制度要求、推动库存管理走向科学化、规范化的必要条件;计算机管理所无法比拟的优点检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高库存管理的效率,也是企业的科学化、正规化管理,与世界接轨的重要条件。
因此,企业非常需要一套既有先进管理思想又适合国内企业的库存管理系统,作为实现目标和提高现有水平的一种重要手段,库存管理系统是一个公司不可缺少的部分,它的内容对于公司的管理者来说至关重要, 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
第2章 系统分析
2.1库存管理系统需求分析
2.1.1.用例分析
通过库存管理系统实际需求,进行详细的用例分析。库存管理系统用例分析如图2-1所示。
图2-1库存管理用例图
用例图建立完成,就需要编写用例描述,用例描述也就是对系统各个功能进行描述,这一部是进行系统设计前最重要的一个过程。准确地描述出系统的功能有助于清理自己的思路,更是和用户进行有效沟通的保障。
(1) 基础信息管理
在基础信息管理中应包括供应商信息、客户信息管理、仓库信息管理、地域信息管理、计量单位管理。供应商信息管理、客户信息管理、仓库信息管理、商品信息管理都应该具备添加、修改、删除、浏览功能;地域信息管理应以树状视图形式显示。
(2) 日常业务管理
在日常业务管理模块中应包括入库管理、出库管理、调货管理、库存盘点。各模块允许一次对多种商品进行操作,并可自动核算合计数量及合计金额,最好可以提供联想输入提示功能。
(3) 查询统计管理
在查询统计管理中包含过期商品查询,它的功能是实现自动筛选过期商品。
(4) 系统管理
系统管理模块包括用户信息管理模块。
2.2业务流程
商品库存管理系统的业务流程如图2-2所示。
图2-2业务流程图
2.3系统目标
1)完成入库、出库业务,且允许一张单据涉及多种商品。
2)跟踪仓库中每种商品的库存数量,且可以对其进行盘点。
3)提供过期商品查询功能。
4)可以满足多仓库需要。
5)支持联想输入设计。
2.4.系统总体设计
系统总体设计工作应该由上而下的进行。首先设计总体结构,然后逐层深入,直到进入每一个模块的设计。总体设计主要是指在系统分析的基础上,对整个系统的划分、软硬件配置、数据存储以及整个系统实现等方面的合理安排。
2.4.1系统功能结构设计
通过前面的系统分析工作,下面将库存管理系统划分为4部分,它们是基础信息管理、日常业务管理、查询统计管理、系统信息管理。
结构图如图2-3所示。
图2-3系统结构图
2.4.2编码设计
编码设计是管理信息系统过程中的一个重要内容。设计一个好的编码,可以使信息统计和查询变得更方便。
编码一般由数字和字符组成,用来代表事物的实体类别和属性的特定符号或记号。
在库存管理系统中,需要对出、入库单进行编码,以入库单为例,入库单据号用来标记入库单的单号,具有唯一性。通过该编码,可以判断某一张入库单是哪年、哪月、哪日第几张单据。程序模块设计如下:
首先,判断入库信息表中是否有记录,如果无记录,则说明要录入的入库单是本天的第一张入库单据。该单据编码由字母“RK”、当前日期的“年”“月”“日”,再加“000001”组成;如果有记录,那么该单据编码由字母“RK”、当前日期,和当天上一张单据编码后6位加1组成。
第3章 数据库设计
数据库是应用程序的核心。数据库设计师开发应用程序的重要组成部分。一个好的数据库结构可以使系统处理速度快、占用空间少、操作处理过程简单、查找容易等。
数据商品库存管理系统的实际需要和数据流量的大小,数据库使用了Microsoft Access。下面介绍数据库的创建过程。
3.1创建数据库
库存管理系统采用了Microsoft Access作为后端数据库,创建数据库名称为“spkc.mdb”
3.2创建数据表及数据库逻辑结构设计
库存管理系统共使用13张数据表,分别为仓库信息表、出库明细表、出库信息表、入库信息表、入库明细表、入库信息表、地域信息表、供应商信息表、客户信息表、计量单位表、库存信息表、商品调拨表、商品信息表、用户信息表。
表3-1 供应商信息表
字段名称 字段类型 主键 外键 允许为空 默认值
编号 文本型(10) 是 否
名称 文本型(40)
简称 文本型(20)
地址 文本型(40)
地区编号 长整形 是
电话 文本型(13)
传真 文本型(13)
联系人 文本型(13)
联系人电话 文本型(10)
银行 文本型(20)
账号 文本型(15)
纳税人 文本型(8)
邮箱地址 文本型(40)
表3-2 入库信息表
字段名称 字段类型 主键 外键 是否为空 默认值
票号 文本型(15) 是 否
入库时间 日期时间型
合计数量 长整型
合计金额 货币型
操作员 长整型 是
表3-3 入库明细表
字段名称 字段类型 主键 外键 是否为空 默认值
票号 文本型(15) 是
商品编号 文本型(10)
入库仓库 长整型
数量 长整型
表3-4 库存信息表
字段名称 字段类型 主键 外键 是否为空 默认值
商品编号 文本型(10) 是
库存编号 长整型 是
库存数量 长整型
库存上限 长整型
库存下限 长整型
单价 货币型
销售价格 货币型
表3-5 商品调拨表
字段名称 字段类型 主键 外键 是否为空 默认值
商品编号 文本型(10) 是
所在仓库 长整型
调拨仓库 长整型
掉拨数量 长整型
操作员 长整型
表3-6 供应商基础信息表
字段名称 描述 说明
编号 标记一个供应商 用来区分同名的供应商
名称 标记供应商名称
简称 供应商名称的拼音缩写
表3-7 库存信息表
字段名称 描述 说明
商品编号 标识一种商品 用来区分同名的商品
库存数量 商品数量
库存上限 仓库中可以容纳某种商品的最大数量
库存下限 仓库中可以存在某种商品的最小数量
表3-8 商品调拨表
字段名称 描述 说明
所在仓库 商品为调拨前所在仓库
调拨仓库 商品到调拨到的仓库
调拨数量 调拨商品的数量
操作员 记录此操作的操作员编号
第4章 程序模型设计
4.1进入环境
AppWizard的建立完毕,需要完成以下工作:
在StdAfx.h中引入头文件
#import ”C:\Program Files\Common Files\SYSTEM\ADO\MSADO15.dll”rename(”EOF”,”_EOF”)
using namespace ADODB;
声明全局变量
_ConnectionPtr cnn;
在bool CmyApp::InitInstance()中初始化数据库连接
::CoInitialize(NULL);
cnn=NULL;
cnn.CreateInstance(__uuidof(Connection));
cnn->ConnectionString="uid=admin;pwd=111;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=spkc.mdb;";
cnn->Open(L"",L"",L"",adCmdUnspecified);
4.2类模型分析
本程序涉及27个类,主要类的说明如下表所示:
表4-1 库存管理系统中的类及说明
类名 派生自 说明
CBaseComboBox CComboBox 添加数据源连接功能与回车移动功能的CcomboBox类
CBaseEdit CEdit 添加回车移动焦点功能的CEdit类
CBaseDateTimeCtrl CDateTimeCtrl 增加回车移动焦点功能的CDateTimeCtrl类
CBaseListBox CListBox 添加数据源连接功能与回车移动焦点功能ClistBox类
CDAbate CDialog 过期商品查询模块
CDAbout CDialog 关于模块
CDAdjust CDialog 调货管理模块
CDCheck CDialog 库存管理模块
CDCheckDlg CDialog 库存盘点模块
CDClient CDialog 客户信息查询模块
CDClient_Edit CDialog 客户信息管理模块
CDClime CDialog 地域信息管理模块
CDInput CDialog 商品出库模块
CDLogin CDialog 登录模块
CDOutput CDialog 商品输出模块
CDProvider CDialog 供应商查询模块
CDStore CDialog 仓库信息管理模块
CDunit CDialog 计量单位管理模块
CDUser CDialog 用户管理模块
CDWare CDialog 商品信息查询模块
CExtendEdit_Grid CListCtrl 增加绑定数据源功能的CListCtrl类
CMainDlg CDialog 主程序界面对话框
CMyApp CWinApp Windows应用程序基类的派生类
CRxGrid CListCtrl 增加联想提示等诸多功能的CListCtrl类
第5章 界面及主要模块设计
5.1主程序界面开发步骤
5.1.1模块描述
主程序界面是应用软件中非常重要的模块,用户需要通过它来实现与其他功能模块的衔接。本程序的主界面由菜单栏、工具栏、状态栏模式组成。
主程序界面的运行结果如图所示:
图5-1 库存管理系统主界面
5.1.2菜单资源设计
图5-2 菜单资源结构图
5.1.3关键程序代码
声明CToolCtrl类对象实体、CImageList类对象实体、CststusBarCtrl类对象实体。
CToolBarCtrl m_ToolBar;
CImageList m_ImageList;
CStatusBarCtrl m_StatusBar;
在OnInitDialog成员函数中添加工具栏和状态栏。
BOOL CMainDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
TBBUTTON button[10];
int i=0,nStringLength;
CString string;
TCHAR * pString;
m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,0,0);
m_ToolBar.EnableAutomation();
m_ToolBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,ID_TOOLBAR);
UINT Resource[10]={IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4,IDI_ICON4,IDI_ICON5,IDI_ICON6,IDI_ICON7,IDI_ICON7,IDI_ICON8};
for(i=0;i<10;i++)
{ m_ImageList.Add(::LoadIcon(::AfxGetResourceHandle(),MAKEINTRESOURCE(Resource[i])));
}
m_ToolBar.SetImageList(&m_ImageList);
for(i=0;i<10;i++)
{
button[i].dwData=0;
button[i].fsState=TBSTATE_ENABLED;
if(i==4 ||i==8)
button[i].fsStyle=TBSTYLE_SEP ;
else
button[i].fsStyle=TBSTYLE_BUTTON ;
button[i].iBitmap=i;
string.LoadString(i + IDS_STRING1);
nStringLength= string.GetLength() + 1;
pString = string.GetBufferSetLength(nStringLength);
//pString[nStringLength] = 0;
button[i].iString =m_ToolBar.AddStrings(pString);
string.ReleaseBuffer();
}
button[0].idCommand=ID_MENUITEM32807;
button[1].idCommand=ID_MENUITEM32808;
button[3].idCommand=ID_MENUITEM32817;
button[2].idCommand=ID_MENUITEM32822;
button[5].idCommand=ID_MENUITEM32811;
button[6].idCommand=ID_MENUITEM32812;
button[7].idCommand=ID_MENUITEM32813;
button[9].idCommand=ID_MENUITEM32815;
m_ToolBar.AddButtons(10,button);
m_ToolBar.AutoSize();
m_ToolBar.SetStyle(TBSTYLE_FLAT|CCS_TOP);
m_StatusBar.EnableAutomation();
m_StatusBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,ID_STATUSBAR);
CString TipText;
this->GetWindowText(TipText);
TipText=TipText+" 〖当前用户:"+UserName+ "〗";
this->SetWindowText(TipText);
int width[]={150,800};
m_StatusBar.SetParts(2, &width[0]);
m_StatusBar.SetText("GUSONG2009",0,0);
return TRUE;
}
5.2商品信息管理
5.2.1功能分析
商品信息管理应该包括查询和管理两部分。在查询部分中,以列表形式显示商品信息,且允许用户根据不同字段、不同条件进行查询。当用户在表格中双击某条商品记录时,进入管理部分;管理部分以卡片形式显示某种商品的信息,允许用户对记录进行添加、修改、删除等操作。
商品信息管理模块运行结果如图5-3所示。
图5-3 商品信息管理效果图
5.2.2商品信息管理模块查询部分详细设计
向项目中添加一个新的Dialog资源,资源ID为IDD_WARE。在IDD_WARE对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“DialogProperties”对话框。在“Dialog Properties”对话框中选择General选项卡,更改其【Caption】文本框内容为“商品信息查询”;单击【Font】按钮,将Dialog资源更改为宋体、9号。
从Controls面板上向Dialog资源中添加3个Static、2个Combo Box、1个Edit、1个Button和1个ListControl,更改资源的属性,并为资源设置相对应的变量。如下表所示。
表5-1 资源设置
ID Properties Members Variables
Type Member
IDC_COMFIELD Sort FLASE CBaseComboBox m_ComField
Data 编号 名称 产地 计量单位
IDC_COMEMBLEM Sort FLASE CBaseComboBox m_ComEmblem
Data LIKE = <> > < >= <=
IDC_BUTQUERY Caption 查询 CButton m_ButQuery
IDC_EDTCONTIDION 默认 CBaseEditBox m_EdtCondition
IDC_GRID 默认 CExtendEdit_Grid m_Grid
调整控件资源在Dialog中的位置。最终设计结果如下图所示。
图5-4 商品信息查询
使用函数外部的变量。
extern _ConnectionPtr cnn;
extern CMyApp theApp;
关键程序步骤和代码。
双击【查询】按钮,为查询按钮添加单击消息响应函数OnBUTQuery()。
void CDWare::OnBUTQuery()
{
…………
if(sEmblem!="LIKE")
sSQL.Format("SELECT * from商品信息查询WHERE %s %s '%s'",sField,sEmblem,sCondition);
else
sSQL.Format("SELECT * from商品信息查询WHERE %s LIKE '%s%%'",sField,sCondition);
…………
}
5.2.3商品信息管理模块编辑部份详细设计
向项目中添加一个新Dialog资源,资源ID为IDD_WARE_EDIT。在IDD_WARE_EDIT对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“DialogProperties”对话框。在“DialogProperties”对话框中选择General选项卡,更改其“Caption”文本框内容为“商品信息管理”;单击【Font】按钮,将Dialog资源字体更改为宋体、9号。
从Controls面板上向Dialog资源中添加11个Static、4个ComboBox、4个Edit,6个Button、4个Date Time Picker和一个ListControl,更改资源的属性,并为资源设置相对应的变量。如下表所示。
表5-2 资源设置
ID Properties Members Variables
Type Member
IDC_BUTADD Caption 添加 CButton m_ButAdd
IDC_BUTCHANGE Caption 修改 CButton m_ButChange
IDC__BUTDELE Caption 删除 CButton m_ButDelete
IDC_BUTEXIT Caption 退出 CButton m_ButExit
IDC_BUTSAVE Caption 保存 CButton m_ButSave
IDC_BUTUNDO Caption 撤销 CButton m_ButUndo
IDC_COMCITY 默认 CBaseComboBox m_ComCity
IDC_COMPROVINCE 默认 CBaseComboBox m_ComProvince
IDC_COMTOWN 默认 CBaseComboBox m_ComTown
IDC_COMUNIT 默认 CBaseComboBox m_ComUnit
IDC_DATKEEPTIME 默认 CBaseDateTimeCtrl m_DatKeepTime
IDC_DATOUTFACTORYTIME默认 CBaseDateTimeCtrl m_DatOutFactoryTime
IDC_EDITID 默认 CBaseEdit m_EdtID
IDC_EDTLETTERNAME 默认 CBaseEdit m_EdtLetterName
IDC_EDTNAME2 默认 CBaseEdit m_EdtName
IDC_EDTSPEC 默认 CBaseEdit m_EdtSpec
调整控件资源在Dialog中的位置。结果如下图所示。
图5-5 商品细细管理模块图
使用函数外部的变量。
extern _ConnectionPtr cnn;
extern CMyApp theApp;
关键程序代码。
程序运行后可分为两种状态:编辑状态和只读状态。用户单击【添加】或【修改】按钮后,系统进入编辑状态,此时,用户可以任意添加或修改文本框等编辑控件的值;当用户单击【保存】按钮后,系统回到初始状态即只读状态,编辑控件失效,无法进行编辑。因此,需要成员函数Enabled,用来完成此功能。
void CDWare_Edit::Enabled(bool bEnabled)
{
m_ComTown.EnableWindow(bEnabled);
m_EdtSpec.EnableWindow(bEnabled);
m_EdtName.EnableWindow(bEnabled);
m_EdtLetterName.EnableWindow(bEnabled);
m_DatOutFactoryTime.EnableWindow(bEnabled);
m_DatKeepTime.EnableWindow(bEnabled);
m_ComUnit.EnableWindow(bEnabled);
m_ComProvince.EnableWindow(bEnabled);
m_ComCity.EnableWindow(bEnabled);
m_ButUndo.EnableWindow(bEnabled);
m_ButSave.EnableWindow(bEnabled);
m_ButExit.EnableWindow(!bEnabled);
m_ButDele.EnableWindow(!bEnabled);
m_ButChange.EnableWindow(!bEnabled);
m_ButAdd.EnableWindow(!bEnabled);
}
每当用户定位一条记录时,系统都需要重新读取一边数据库,以实现数据的统一。在程序中,此功能由Display成员函数完成。
void CDWare_Edit::Display(CString ID)
{
CString sID,sName,SLatterName,sSpec,sUnit,sProducing,sOutfactoryTime,sKeepTime;
CString sSQL;
sSQL.Format("Select * from 商品信息查询 Where 编号='%s'",ID);
try{
rst=cnn->Execute((_bstr_t)sSQL,NULL,adCmdText);
}
catch(...)
{
…………
}
if(theApp.GetRecordCount(rst)>0)
{
rst->MoveFirst();
CTime OutfactoryTime,KeepTime;
sID=(char*)(_bstr_t)rst->GetCollect("编号");
…………
sKeepTime=(char*)(_bstr_t)rst->GetCollect("保质期");
m_EdtID.SetWindowText(sID);
this->m_EdtLetterName.SetWindowText(SLatterName);
this->m_EdtName.SetWindowText(sName);
this->m_EdtSpec.SetWindowText(sSpec);
this->m_ComUnit.SetWindowText(sUnit);
OutfactoryTime=theApp.CStringTOCTime(sOutfactoryTime);
KeepTime=theApp.CStringTOCTime(sKeepTime);
this->m_DatOutFactoryTime.SetTime(&OutfactoryTime);
this->m_DatKeepTime.SetTime(&KeepTime);
int nProducing=theApp.NumberTOName("地域信息表","名称",sProducing);
Clime(nProducing);
}
rst->Close();
}
单击【添加】按钮时,在编号文本框中自动生成编号;清空其他编辑控件,系统进入编辑状态。
void CDWare_Edit::OnBUTAdd()
{
CString NewID;
Enabled(true);
ClearFrom();
NewID=theApp.AutoNumber("商品信息表","SP",1);
this->m_EdtID.SetWindowText(NewID);
m_EdtName.SetFocus();
AddOrChange=true;
}
用户单击【修改】按钮,系统进入编辑状态,名称文本框获得焦点。
void CDWare_Edit::OnBUTChange()
{
Enabled(true);
m_EdtName.SetFocus();
AddOrChange=false;
}
用户单击【保存】按钮时,判断用户在此前按下的是【添加】还是【修改】,如果是【添加】就插入一条记录,如果是【修改】,就更新原纪录。
void CDWare_Edit::OnBUTSave()
{
int a=MessageBox("确定保存记录吗?","系统提示",MB_ICONQUESTION|MB_OKCANCEL);
if(a==1)
{
CTime time;
CString sID,sSQL,sName,sLetterName,sUnit,sSpec,sTown,sOutFauctryTime,sKeepTime;
int nUnit,nTown;
m_EdtID.GetWindowText(sID);
m_EdtLetterName.GetWindowText(sLetterName);
m_DatOutFactoryTime.GetTime(time);
sOutFauctryTime=theApp.CTimeToCString(time);
m_DatKeepTime.GetTime(time);
sKeepTime=theApp.CTimeToCString(time);
m_EdtName.GetWindowText(sName);
if(sName.IsEmpty())
{
MessageBox("请输入商品名称!","系统提示",MB_OK|MB_ICONSTOP);
m_EdtName.SetFocus();
return;
}
………………
if(this->AddOrChange==true)
sSQL.Format("Insert Into商品信息表values ('%s','%s','%s','%s', %d,%d,#%s#,#%s#)",sID,sName,sLetterName,sSpec,nTown,nUnit,sOutFauctryTime,sKeepTime);
else
sSQL.Format("UPDATE 商品信息表 SET 名称='%s',简称='%s',规格='%s',产地=%d,计量单位=%d,出厂日期=#%s#,保质期=#%s# WHERE 编号='%s'",sName,sLetterName,sSpec,nTown,nUnit,sOutFauctryTime,sKeepTime,sID);
cnn->Execute((_bstr_t)sSQL,NULL,adCmdText);
this->Enabled(false);
}
}
用户单击【撤销】按钮时,程序进入只读状态,并且显示用户在查询模块双击的记录。
void CDWare_Edit::OnBUTUndo()
{
this->Display(this->DisplayNumber);
this->Enabled(false);
}
5.4出库管理
5.4.1.功能分析
出库管理模块主要完成商品出库的操作,在本系统中,采用表格式录入数据,这样便可以实现一张出库单据可出库多种商品。细节方面,具备快捷提示功能,只要通过几个字母,系统便可以找到用户所需要的数据,并且支持自动核算功能。
运行结果如图5-6所示。
图5-6 出库管理模块图
5.4.2 详细设计
向项目中添加一个新Dialog资源,资源ID为IDD_DIAOUTPUT。在IDD_DIAOUTPUT对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“DialogProperties”对话框。在“DialogProperties”对话框中选择General选项卡,更改其“Caption”文本框内容为“出库管理”;单击【Font】按钮,将Dialog资源字体更改为宋体9号。
从Controls面板上向Dialog资源中添加7个Static、3个Edit,4个Button、和1个ListControl,更改资源的属性,并为资源设置相对应的变量。如下表所示。
表5-3 资源设置
展开阅读全文