基于MFC超市商品管理系统(VS2012)
- 格式:docx
- 大小:121.07 KB
- 文档页数:19
基于MFC的超市商品管理系统目录1 需求分析 (2)1.1 国内现状 (2)1.2 设计目的 (2)2 概要设计 (3)2.1 设计原则 (3)2.2 系统架构 (3)2.3 技术介绍 (3)2.4 开发环境 (4)3 详细设计 (5)3.1 整体功能设计 (5)3.2 系统界面设计 (5)3.3 后台系统设计 (6)4 调试分析 (8)5 主要代码分析 (9)6 用户使用说明 (13)6.1 项目背景 (13)6.2 功能 (13)6.3 运行环境 (13)结论 (14)致谢 (15)参考文献 (16)随着科学技术的迅猛发展,整个社会已进入了信息社会,计算机的应用在社会中的地位越来越重要。
传统的以书本记录的方式已不能满足要求,一些语言,MFC技术正缓解了这一问题。
为使商业企业的进销存信息管理自动化、标准化和科学化,需研制具有大规模、高效率的超市信息管理系统,即超市商品管理系统。
本系统采用MFC等开发工具,使用MFC的动态创建,永久保存,消息映射,消息传递等一系列技术,实现了对数据的直接访问和操作,使得数据和应用程序紧密结合在一起。
该超市管理系统要解决的问题是:如何实现超市的科学、高效的管理,包括商品基本信息管理、销售信息的管理。
其最终目的是通过此软件来实现超市商品的添加、删除、查询、修改。
关键词:MFC;添加;删除;查询;修改超市需要处理大量的库存信息,还要时刻更新产品的销售信息,不断添加商品信息。
面对不同种类的信息,需要合理的数据来保存数据信息,需要有效的程序结构支持各种数据操作的执行。
商店自动化的产品管理在欧美等国家早已经实现,也是零售业管理的基础。
它最主要的特点是能够实时的和准确的控制店内的销售情况。
如果可以能够实时掌握销售流程及销售情况,则可以有效地加速商品的周转率并提高服务质量,而且可以减少产品售价不符等所产生的问题。
顾客的消费要求的是希望在超市购物中能基本上都能购得所需的商品,并且还要既保证商品质量还要享受优质,方便的服务。
1 需求分析1.1 国内现状随着信息时代的到来,提供了大量的社会产品,城市集中度也进一步加强,由于人们生活节奏的不断加快,超市管理者对便利的要求进一步提高。
在吸收街坊式多店优点的基础上,出现了区域性的超市。
小型超市管理系统按分类、分级的模式对仓库进行全面的管理和监控缩短了超市信息流转时间,使企业的物资管理层次分明、井然有序,为采购、销售提供依据。
完善的小型超市管理功能,可对企业的存货进行全面的控制和管理,降低超市成本,增强企业的市场竞争力。
现在大多数超市不能有效的管理每一种商品,收款结算速度慢,容易出现营业差错,不宜进行商品调价,盘点效率底等,而且在超市日常管理中,商品进、销、存决策以经验为主,缺乏实时分析功能,管理人员对及时传递资料的要求始终得不到满足,随着超市形态的高速发展,其经营管理也变的愈加复杂,日常所需处理的数据量也逐渐增大,商业运转的中间环节也越来越多,原始的人工管理已无法应对这复杂的市场。
为此,我在本次设计之中选择了小型超市管理系统设计,依靠现代化的计算机信息处理技术来管理超市,从而节省了大量的人力、物力、改善了员工的工作条件,减轻了劳动强度,并且能够快速反映出商品的进销存状况和各种反馈信息分析,使管理人员快速对市场的变化做出相应决策,加快超市的系统建立的技术基础。
1.2 设计目的对于超市管理者来说,大量复杂的销售、进货、库存管理、供应商管理等难于通过传统的方法进行管理。
小型超市管理系统正是对上述的问题而开发的,通过计算机系统来管理货品销售与进货的情况,可以解决大量商品信息的查询和管理,便于更好的进行商品管理,同时也为销售员提供方便。
2 概要设计2.1 设计原则本系统主要是面向大众化的普通用户,所以要求系统要有很高的实用性,由于本系统会设计个人资料的敏感信息问题,可靠性和经济性也是我们考虑的重点。
2.2 系统架构根据对项目需求的分析,总结出项目的总体架构设计如图2-1所示:图2-1 总体架构本系统是对超市增加商品、删除商品、修改商品、查询商品、购买商品、等操作。
以便管理员对商品的信息直观而且有效的进行处理。
2.3 技术介绍本部分主要对超市管理系统系统的实现使用到的相关技术:技术一:MFC程序的初始化过程。
建立一个MFC窗口很容易,只用两步:一是从CWinApp派生一个应用程序类,然后建立应用程序对象,就可以产生一个自己需要的窗口(即需要什么样就在InitInstance()里创建就行了)。
整个程序,就改写一个InitInstance()函数,创建那么一个对象,就是一个完整的窗口程序。
技术二:运行时类型识别(RTTI)。
运行时类型识别(RTTI)即是程序执行过程中知道某个对象属于某个类,我们平时用C++编程接触的RTTI一般是编译器的RTTI,即是在新版本的VC++编译器里面选用“使能RTTI”,然后载入typeinfo.h文件,就可以使用一个叫typeid ()的运算子,它的地位与在C++编程中的sizeof()运算子类似的地方(包含一个头文件,然后就有一个熟悉好用的函数)。
typdid()关键的地方是可以接受两个类型的参数:一个是类名称,一个是对象指针。
所以我们判别一个对象是否属于某个类。
技术三:动态创建。
动态创建就是运行时创建指定类的对象,在MFC中大量使用。
如框架窗口对象、视对象,还有文档对象都需要由文档模板类对象来动态的创建。
技术四:永久保存。
对于MFC的很多地方不甚满意,总觉得它喜欢拿一组低能而神秘的宏来故弄玄虚,但对于它的连续存储(serialize)机制,MFC的连续存储(serialize)机制俗称串行化。
“在程序中尽管有着各种各样的数据,serialize机制会像流水一样按顺序存储到单一的文件中,而又能按顺序地取出,变成各种不同的对象数据。
技术五:消息映射。
消息映射就是用一个数据结构把“消息”与“响应消息函数名”串联起来。
这样,当窗口感知消息发生时,就对结构查找,找到相应的消息响应函数执行。
其实这个想法也不能简单地实现:我们每个不同的MFC窗口类,对同一种消息,有不同的响应方式。
即是说,对同一种消息,不同的MFC窗口会有不同的消息响应函数。
技术六:消息传递。
虽然是执行CWnd类的函数,但由于这个函数在CFrameWnd:: OnCmdMsg 里执行,即当前指针是CFrameWnd类指针,再有OnCmdMsg是一个虚函数,所以如果CFrameWnd改写了OnCommand,程序会执行CFrameWnd::OnCmdMsg(…)。
CFrameWnd:: OnCmdMsg完成了把WM_COMMAND消息传递到视对象、文档对象及应用程序对象实现消息响应。
2.4 开发环境开发坏境:Visual Studio 2012操作系统:Windows 103 详细设计3.1 整体功能设计(1)销售功能。
购买商品时,可以先筛选类别,然后浏览并选择需要的商品,购买界面会自动显示出商品的基本信息,包括商品名,单价,库存等信息。
如果有库存量,输入购买的数量,会自动计算出商品总价。
如果库存量不够,给出提示信息,结束购买。
(2)商品简单管理功能。
添加功能:主要完成商品信息的添加,有编号重复检查功能。
查询功能:可按商品编号、商品名称进行查询。
若存在相应信息,输出所查询的信息,若不存在该记录,则提示“该记录不存在!”。
修改功能:可根据查询结果对相应的记录进行修改。
删除功能:主要完成商品信息的删除。
如果该商品不在物品库中,则提示“该商品不存在”。
(3)统计功能。
输出当前库存中所有商品的总数及详细信息,可按商品的价格、库存量、生产厂家进行统计。
3.2 系统界面设计主界面为普通用户提供所有商品的基本信息,提供按商品编号、名称、价格等排序功能,提供商品分类筛选功能,商品购买并计算商品总价总功能,界面直观,清晰,操作简单,方便。
按类别筛选如图3-1,按品牌筛选如图3-2。
图3-1 按类别筛选图3-2 按品牌筛选3.3 后台系统设计主界面右下角有个管理员入口按钮,为超市内部管理员提供一个后台管理功能,点击按钮后,会弹出管理员登录界面,对管理员输入的账号和密码进行判断,正确登录成功,错误弹出对话框提示。
如图3-3登录界面,3-4管理员主界面:图3-3 管理员登录图3-4 管理员主界面管理员界面是为超市管理员提供的商品后台管理,功能包括商品的添加、删除、查询、修改和商品基本信息的统计。
其中添加功能有商品编号是否重复检查,查询功能可以按照商品的编号和名称进行查询,删除功能直接在列表中点击要删除的行,点击删除按钮就行了。
界面如下图:图3-5 添加商品图3-6 修改商品图3-7 查询商品4 调试分析在调试过程中遇到过很多问题,例如在实现购物功能的时候,需要根据商品购买的数量计算出总价格,还要判断购买的数量是否大于库存,如果大于库存则提示库存不足,结束购买。
一开始我没有考虑到所有的数据类型都是CString,所以我就直接把购买数量编辑框中的数据获取出来,直接跟商品单价相乘,出来的结果总是为0。
将购买数量直接于库存作比较,有时候对的有时候又是错的(因为CString型是按字符逐个比较),这两个问题困扰我很久(其实是同一个问题,数据类型转换),百思不得其解。
后来通过网上查阅相关资料,才明白我所有的数据类型都是CString型,不能直接相乘得到结果,或者直接做大小比较。
要想相乘得出总价格,或者判断库存情况,必须先将CString型的数据转换为相应的类型。
比如单价有小数,需要转换为double型,库存和购买数量都是整数,需要转换成int型。
于是我继续上网查找类型转换的方法,在查看了几篇博客、百度知道和其他文档之后,我尝试了一种方法,其类型转换的方法的代码如下:库存转换:kucun=_wtoi(strKucun);数量转换:shuliang=_wtoi(strShuliang);单价转换:danjia=_wtof(strDanjia);通过以上方法将数据类型进行转换之后,再进行调试,顺利得出了正确的结果。
只要输入的购买数量小于库存数量,会自动计算出商品总价格并显示到相应的编辑框中,如果输入的购买数量大于库存数量,则弹出库存不足的提示信息,并且将购买数量的编辑框清空,以免用户继续点击购买按钮,库存出现负数的情况。
5 主要代码分析商品添加功能实现代码:CInsert dialog;if (dialog.DoModal() == IDOK){CString str1 = dialog.returnNum();//按下确认执行以下代码…UINT i = listCtrl.GetItemCount();//返回当前List已有的数目for(int n=0;n<i;n++)//检查编号是否已经存在if(str1==sp[n].num){flag=0; break;}if(flag)//编号不存在,执行添加功能{//将新添加的信息显示到列表listCtrl.InsertItem(i, str1);listCtrl.SetItemText(i, 1, str2);…//将新添加的信息存到结构体数组sp[count].num = str1;…count++;//将新添加的信息写入文件CFile file;if (file.Open(_T("超市商品信息.txt"), CFile::modeWrite | CFile::modeCreate)){CArchive ar(&file, CArchive::store);ar << count;for (int i = 0; i < count; i++){ar << sp[i].num;…}ar.Close();file.Close();MessageBox(_T("添加成功!"),L"提示",MB_ICONASTERISK);}}elseMessageBox(_T("编号已存在,请重新输入!"),L"提示",MB_ICONERROR);}商品删除功能实现代码:int n = -1;POSITION pos = listCtrl.GetFirstSelectedItemPosition();n = listCtrl.GetNextSelectedItem(pos);if (n != -1){//从列表视图控件中删除某个列表项。