进销存管理系统毕业设计范例.docx
《进销存管理系统毕业设计范例.docx》由会员分享,可在线阅读,更多相关《进销存管理系统毕业设计范例.docx(66页珍藏版)》请在冰点文库上搜索。
进销存管理系统毕业设计范例
进销存管理系统
学院
专业
班级
学号
姓名
指导教师
教师职称
年
月
日
摘要
【摘要】
随着国家的政治经济政策的优化改革,使得国内中小企业得以蓬勃发展。
可是随着企业的发展,客户数量的的为断增多,财务工作繁杂化,库存产品零乱等一系列问题也接踵而至,给企业经营者运作带来了很大的困扰。
信息技术的迅猛发展,科学经营管理观念的迅速传播,使中小企业经营者逐渐认识到转变企业经营管理理念,改善企业经营管理模式是企业适应时代的发展急需解决的问题。
现代管理,应该建立在真实、有效的数据信息基础之上,应该是一种科学的、理性的管理体制,而这种管理与经营的联系与互助,又必须依赖于计算机的强大的数据统计功能,计算机管理系统便是实际的企业进销问题与计算机强大数据统计功能相结合的产物。
管理系统解决的了商业企业商品的进、销、存、退、换、盘、损、残、调、借、赠等一系列操作流程中的数据信息的处理问题,提供一系列的数据分析,帮助经营者合理的调整各个经营运作环节的运作节奏,并对商品流转过程进行了全程跟踪管理、相应款项流通的全程记录管理和票据信息统计的管理。
因此进销存管理系统的全面应用,规范业务流程、提高了企业的管理水平,提高资金流动的透明度,加快商品资金周转速度,进而全面提高了企业的经营水平、进而全面提升了企业的经济效益。
【关键词】进销存管理系统
0引言
企业经营如逆水行舟不进则退。
每一个努力发展的企业都明白,先进管理的重要作用,引进先进管理系统使企业经营变得规范、合理。
进销存管理系统无论是在功能设计还是业务流程上都尽可能做到满足经营管理运作流程的需求,并且操作方便、功能强大,即使操作者对计算机知识一窍不通也能一用就会。
它强化库存管理,规范业务流程,提高资金管理的透明度,加快商品资金周转,是企业经营管理中数据分析中必不可少的管理工具。
1系统需求分析
根据市场的需求,要求系统具有以下功能:
❑实现商品入库、入库退货操作。
❑实现商品销售、销售退货操作。
❑实现库存管理(调货、盘点)操作。
❑实现信息的查询、打印功能。
❑准确地进行账款记录、账款查询。
2总体设计
2.1项目规划
根据需求分析,设计系统框架。
进销存管理系统由等8部分组成。
设计各部分具体功能如下:
❑基础信息模块
基础信息模块包括药品信息、员工信息、供应商信息和客户信息4部分。
❑销售模块
销售模块由销售登记、销售退货、销售查询、销售退货查询4部分。
❑入库模块
入库模块主要由入库登记、入库退货、入库查询、入库退货查询4组成。
❑调货模块
调货模块包含调货登记和调货查询两部分。
❑库存模块
库存模块由库存盘点、库存查询、仓库管理3部分组成。
❑结账模块
结账模块主要包括销售结账、销售退货结账、入库结账、入库退货结账。
❑财务模块
财务模块由日结、月结、供应商往来账、客户往来账4部分组成。
❑系统管理模块
系统管理模块由修改用户密码、修改用户权限、修改用户3部分组成。
2.2系统功能结构
进销存管理系统的功能结构如图1所示。
图1进销存管理系统功能架构图
3设计目标
本系统是根据中小企业的实际需求而开发的,完全能够实现商品入库、销售管理,通过本系统可以达到以下目标:
❑系统运行稳定,安全可靠。
❑界面设计美观,人机交互界面友好。
❑信息查询灵活、方便、快捷、准确,数据存储安全可靠。
❑强大的报表预览、打印功能。
❑信息安全保密。
3系统设计
3.1开发及运行环境
1.硬件要求
CPU:
300MHz以上的处理器。
内存:
128MB,推荐256MB。
硬盘:
150MB以上剩余空间。
显示像素:
最低800*600,最佳效果1024*768。
2.软件要求
操作系统:
Windows2000/NT/XP/CE。
数据库:
SQLServer2000。
3.2数据库设计
1.数据库概要说明
本系统采用SQLServer2000数据库,系统数据库名为ypgl,中共包含46个表,其中作为临时表的有20个,作为数据存储表的有26个。
临时表:
lsdhinfo0、lsdhinfo1、lsgys0、lsgys1、lskcquery0、lskcquery1、lskh0、lskh1、lsrkquery0、lsrkquery1、lsrkthinfo0、lsrkthinfo1、lsxsquery0、lsxsquery1、lsxsthinfo0、lsxsthinfo1、lsyg0、lsyg1、lsypinfo0、lsypinfo1。
数据存储表:
tabbf、tabck、tabdhdj、tabdhph、tabgys、tabjsfs、tabkc、tabkcpddj、tabkcpdph、tabkh、tabpurview、tabpurviewctrl、tabrkdj、tabrkjz、tabrkph、tabrkthdj、tabrkthjz、tabrkthph、tabxsdj、tabxsjz、tabxsph、tabxsthdj、tabxsthjz、tabxsthph、tabyginfo、tabypinfo。
图2所示的即为本系统中数据库的数据表结构图,该数据表结构图包含系统所有数据表。
可以清晰地反应数据库信息。
图2数据库概要说明
2.主要数据表的结构
数据库中的数据表请参见附录B。
4功能模块设计
4.1主窗口设计
进销存管理系统主窗口由菜单、工具栏、客户区域和状态栏四部分组成,效果如图3所示。
图3进销存管理系统主窗口
1.菜单设计
(1)在工具栏中单击按钮
,或者从菜单中选择“View”/“Workspace”项,这时会弹出如图4所示的工作区窗口(Workspace窗口)。
在工作区窗口中,能看到该程序所使用的资源,且每种资源都有一个资源符号,主窗体也使用了一个资源符号IDD_A1_DIALOG,这是VC缺省提供的。
可以在这里添加或者删除各种资源。
图4Workspace窗口
(2)在工作区窗口(Workspace窗口)右键单击“a1resources”选项,在弹出菜单中选择“Insert...”选项,将弹出“InsertResource”对话框。
在该对话框中选择“Menu”选项,然后单击“New”按钮,将生成如图5所示的菜单资源。
图5编辑菜单资源
(3)右键双击菜单资源编辑器的虚线空白框,在弹出的菜单中选择“Properties”选项,将弹出“MenuItemProperties”对话框,在“MenuItemProperties”对话框的“caption”(标题)编辑框中键入:
“基础信息(&I)”(符号&可以使字母I有一个下划线,而且可以通过“Alt+I”访问该菜单项。
此时关闭“MenuItemProperties”对话框,将在菜单编辑器中生成主菜单“基础信息”。
双击“基础信息”菜单下的虚线空白框,在弹出的“MenuItemProperties”对话框中设计“药品信息(&M)”、“员工信息(&Y)”等菜单项。
(4)同上,可以设计其他主菜单及菜单项。
最后得到如图6所示的菜单界面。
图6菜单界面
2.工具栏设计
在应用程序中要经常使用工具栏,它是最常用的界面元素,对应着应用程序的最常用功能。
主窗口共有9个工具栏按钮,分别是“销售登记”、“销售退货”、“销售结账”、“入库登记”、“入库退货”、“入库结账”、“调货登记”、“库存登记”、“退出”工具栏按钮。
创建工具栏可使用MFC类库中的CToolBarCtrl类,该类用来生成工具条。
本系统主窗体的工具栏将引用MSDN提供的类CStandardBar,该类派生自CToolBarCtrl。
操作步骤如下:
(1)从基类CToolBarCtrl中派生需要的类CstandardBar。
选择“Insert”/“NewClass...”菜单项,在弹出来的“NewClass”对话框中设置“ClassType”为“MFCClass”,在“ClassInfomation”中的Name编辑框中键入“CstandardBar”,然后在“BaseClass”下拉列表框中选择“CtoolBarCtrl”,最后单击“OK”按钮。
(2)需要9个按钮,每个按钮有相应的文本和图片。
所以,需要添加如图7所示的图片资源,资源长为288像素,高为32像素,资源符号为:
IDR_STANDARDBAR。
图7图片资源
(3)添加字符串资源(StringTable),如表1所示。
表1字符串资源
资源符号
值
字符串资源
IDSTR_XSDJ
102
销售登记
IDSTR_XSTH
103
销售退货
IDSTR_XSJZ
104
销售结账
IDSTR_RKDJ
105
入库登记
IDSTR_RKTH
106
入库退货
IDSTR_RKJZ
107
入库结账
IDSTR_DHDJ
108
调货登记
IDSTR_KCPD
109
库存盘点
IDSTR_OUT
110
退出
(4)程序中引入资源,创建工具栏按钮。
创建工具栏按钮需要重写Create函数,该函数创建工具栏的步骤如下:
①先创建工具栏窗口,然后为工具栏类添加图片资源。
相关函数是:
SetBitmapSize(CSize(32,32));//设置单个位图的大小
VERIFY(AddBitmap(m_nButtonCount,IDR_STANDARDBAR)!
=-1);//添加位图
m_nButtonCount是指按钮图片的个数,IDR_STANDARDBAR对应着相应的图片。
②创建相应数量的按钮,并为每个按钮分配相应图片资源和文本资源,设置相关属性。
m_pTBButtons=newTBBUTTON[m_nButtonCount];//用来加入到工具栏里的按钮
……
m_pTBButtons[nIndex].iString=AddStrings(pString);
m_pTBButtons[nIndex].fsState=TBSTATE_ENABLED;
m_pTBButtons[nIndex].fsStyle=TBSTYLE_BUTTON;
m_pTBButtons[nIndex].dwData=0;
m_pTBButtons[nIndex].iBitmap=nIndex;//控制按钮的相关图片
m_pTBButtons[nIndex].idCommand=nIndex+IDSTR_XSDJ;//用于命令消息传递
在步骤②中,要注意如下事项:
①AddStrings(pString)返回一个字符串的基于0的编号,该值用来连接字符串到按钮上,其中的字符串参数pString需要两个结束符来表示结尾,必须将字符串写成如下形式:
pString="Onlyonestringtoadd\0";CString类不能提供这样的功能,因为不可能在CString中保存超过一个结束符的字符串。
所以,将CString中的字符串取出,以char定义的字符串保存,再对该字符串添加一个结束符,做法如下:
CStringstring;
string.LoadString(nIndex+IDSTR_XSDJ);//装载字符串资源
……
//取得字符串的长度为了添加一个结束符,给长度加1
intnStringLength=string.GetLength()+1;
……
TCHAR*pString=string.GetBufferSetLength(nStringLength);//按增加后的长度返回字符串
pString[nStringLength]=0;
函数GetBufferSetLength的过程分配了nStringLength+1长度的内存空间,并在加上结束符'\0'之后,复制原字符串到这个新的内存空间中,同时将原字符串的结束符也复制到新的位置,于是,该函数结束后,字符串pString已经有两个结束符了,最后一个语句略显多余或不足。
但为了保证该字符串确实有两个结束符,不能省略这两个结束符。
pString[nStringLength]=0;
pString[nStringLength-1]=0;
②fsState确定按钮的状态,fsStyle确定按钮的风格。
若给fsStyle赋值TBSTYLE_SEP,则该按钮表现为一个间隔。
dwData可以是用户自定义的数据,可以将一个指针或句柄传递给它,可以在某些消息响应函数中使用。
iBitmap是表示基于0的图像列表的编号。
③idCommand为与按钮连接的命令标识,当这个按钮被按下时,这个值将被放到WM_COMMAND中发送到父窗体。
如果fsStyle被设置为TBSTYLE_SEP,该值必须为0。
用Create函数创建工具栏的代码如下:
BOOLCStandardBar:
:
Create(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);
{
BOOLbRet=CToolBarCtrl:
:
Create(dwStyle,rect,pParentWnd,nID);//记录基类的返回值
m_nButtonCount=IDSTR_OUT-IDSTR_XSDJ+1;
SetBitmapSize(CSize(32,32));//设置单个位图的大小
VERIFY(AddBitmap(m_nButtonCount,IDR_STANDARDBAR)!
=-1);//添加位图
m_pTBButtons=newTBBUTTON[m_nButtonCount];//用来加入到工具栏里的按钮
for(intnIndex=0;nIndex{
CStringstring;
string.LoadString(nIndex+IDSTR_XSDJ);//装载字符串资源
//为每一个字符串再加一个'\0',用于向工具栏里加字符串
intnStringLength=string.GetLength()+1;
TCHAR*pString=string.GetBufferSetLength(nStringLength);
pString[nStringLength]=0;
pString[nStringLength-1]=0;
VERIFY((m_pTBButtons[nIndex].iString=AddStrings(pString))!
=-1);//返回字符串的编号
string.ReleaseBuffer();
m_pTBButtons[nIndex].fsState=TBSTATE_ENABLED;
m_pTBButtons[nIndex].fsStyle=TBSTYLE_BUTTON;
m_pTBButtons[nIndex].dwData=0;
m_pTBButtons[nIndex].iBitmap=nIndex;//控制按钮的相关图片
m_pTBButtons[nIndex].idCommand=nIndex+IDSTR_XSDJ;//用于命令消息传递
}
m_pTBButtons[m_nButtonCount-1].idCommand=IDOK;//用来响应退出消息
TBBUTTONsepButton;//用于分隔的按钮
sepButton.idCommand=0;
sepButton.fsStyle=TBSTYLE_SEP;
sepButton.fsState=TBSTATE_ENABLED;
sepButton.iString=0;
sepButton.iBitmap=0;
sepButton.dwData=0;
for(nIndex=0;nIndex{
VERIFY(AddButtons(1,&m_pTBButtons[nIndex]));//循环添加按钮
if(!
((nIndex+1)%3))
{
VERIFY(AddButtons(1,&sepButton));//每3个按钮为一组,两组间有一个分隔按钮
}
}
returnbRet;//返回CToolBarCtrl:
:
Create的返回值
}
(5)调用工具栏类。
先在类CA1Dlg中实例化CStandardBar的对象。
CStandardBarm_StandardBar;
别忘了在这个文件里包含CStandardBar类声明所在的头文件。
#include"StandardBar.h"
(6)增加消息WM_CREATE的响应函数,为CStandardBar对象创建相应窗口。
intCA1Dlg:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CDialog:
:
OnCreate(lpCreateStruct)==-1)
return-1;
m_StandardBar.Create(WS_BORDER|WS_VISIBLE|WS_CHILD
|TBSTYLE_WRAPABLE|CCS_TOP|CCS_ADJUSTABLE,
CRect(0,0,0,0),this,IDR_STANDARDBAR1);
m_StandardBar.AutoSize();//重新计算控件的大小
return0;
}
工具栏到这里就创建成功了。
3.为菜单和工具栏添加消息处理函数
在此之前,定义了菜单和工具栏界面,单击他们并没有实质的内容,现在为他们添加消息处理函数。
(1)单击菜单和工具栏按钮的两种消息都是命令消息,所以,只要让他们传递相同的消息,就能执行相同的消息处理函数。
从代码中可以看到对于工具栏的按钮来说,按钮的命令消息值与字符串资源符号的值相同,而且是顺序的,而对于相应的菜单项来说,消息值是随机的顺序值。
为了将两者对应起来,要修改菜单项的资源符号,将其改为相应的按钮的字符串资源符号。
例如:
将销售登记菜单项的资源符号改为IDSTR_XSDJ,并给它定义消息响应函数:
voidCA1Dlg:
:
OnXsdj()。
这样,无论是单击“销售登记”菜单项,还是单击“销售登记”按钮都会执行这个函数。
同理,完成其他的菜单项与按钮的对应。
(2)还有一个问题:
别忘了,工具栏中有一个“退出”按钮。
这个退出按钮与谁对应呢?
当用户按下〈Enter〉键或〈Esc〉键时,对话框就会退出,这里触发的两个消息分别是IDOK和IDCANCEL。
如果给“退出”按钮的命令消息值赋值为IDOK,那么单击该按钮时,对话框就会退出。
代码如下:
m_pTBButtons[m_nButtonCount-1].idCommand=IDOK;//用来响应退出消息
4.状态栏设计
为使应用程序操作界面更加友好,可以使用状态条显示程序当前程序的状态信息或提示信息。
在VC中提供了CStatusBarCtrl类显示状态栏。
在本程序中利用状态条显示操作者、日期、时间等信息。
其实还有CStatusBar类可以显示状态栏,但是这个类只能用于主框架(CFrameWnd)上。
分析功能:
显示操作员名字、公司名称及时间。
其中,公司名称是常量字符串,可以将其加为字符串资源;操作员名字,是登录的用户名,将其放在应用程序类中,这样,就可以在程序的任何地方都可以访问了;时间,需要设置OnTimer时间来处理当时间改变时,刷新显示。
(1)解决创建状态栏的相关问题
①访问应用程序对象。
CA1App*app=(CA1App*):
:
AfxGetApp();
//app是应用程序对象指针,可以访问应用程序对象的成员变量,例如:
MessageBox(app->m_sUserName);
②访问资源字符串。
先在“Workspace”中的“ResourceView”选项中建立字符串资源,定义符号IDS_COMPANY,对应资源为“明日腾龙科技有限责任公司()”。
在程序中使用如下代码:
CStringstr;
str.LoadString(IDS_COMPANY);
str保存相应的字符串资源。
③将访问时间转化为字符串。
CTimet=CTime:
:
GetCurrentTime();
CStrings=t.Format("%H:
%M:
%S");
s="当前系统时间:
"+s;
s会显示为“当前系统时间:
20:
09:
25”形式的字符串。
④OnTimer消息响应函数。
为实现每隔1秒刷新一次状态栏的显示内容,可以使用WM_TIMER的消息响应函数OnTimer。
要创建主窗体的OnTimer函数,首先在“Workspace”工作区“ClassView”选项卡中右键单击“CA1Dlg”选项,在弹出菜单中选择“AddWindowsMessageHandle...”菜单项,将弹出“NewWindowsMessageandeventhandlesforclassCAIDlg”对话框。
在该对话框中,可以选择要进行处理的消息句柄,并为其添加消息响应函数。
步骤是从左边的列表框中双击“WM_TIMER”,将其添加到右上边的列表框中,双击该列表框中的“WM_TIMER”项,可以看到VC++创建的函数OnTimer,可以设置这个函数每隔一定的时间响应一次。
函数SetTimer来设置OnTimer的消息响应频率。
UINTSetTimer(UINTnIDEvent,UINTnElapse,void(CALLBACKEXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD));
参数说明:
nIDEvent:
用来标识是哪一个Timer事件。
nElapse:
设置该Timer事件每隔多长时间发生一次,单位:
毫秒。
lpfnTimer:
设置回调函数,用来响应事件的发生,相当于OnTimer函数。
如果将其设为NULL,那么,WM_TIMER事件由窗口类来处理,即由OnTimer函数处理。
在本程序中,设定OnTimer函数1000毫秒响应一次。
SetTimer(12,1000,NULL);
⑤状态栏类CStatusBarCtrl的使用。
CRectrect;
this->GetClientRect(&rect);
intindicators[3];
indicators[0]=rect.Width()/2;
indicators[1]=rect.Width()*3/4;
indicators[2]=rect.Width();
m_StatusBarCtrl.SetParts(3,indicators);
以上代码用来初始化状态栏,函数SetParts用来设定该状态栏由几个面板组成,每个面板的宽