mfc超管理系统
摘 要随着中国经济的迅速发展,人们越来越重视效率的提升,利用一些管理系统可以提高员工的工作效率,同时提升质量。现在人们越来越重视计算机在行业中的运用,本着互联网+的模式,我在超市管理方面提出了自己的需求,利用管理系统,可以对员工的工作效率有着很大的提高,因此我本文的选题是“超市管理系统”,实现对超市日常业务的管理。本文首先介绍的MFC的一些基础的知识,以及现在用到的一些主流数据库的处理方式,然后我采用的是MFC的界面编程,数据库使用SQL SERVER 的ADO的连接方式。这两种都是很成熟的技术,MFC中有一些专门的控件来显示数据库中数据,有着很好的直观性。在数据库中的操作中设计复杂的SQL语句的构造方法、列表控件、Tab控件及树形控件的使用方法。然后我介绍了系统的开发背景,其次介绍系统 分析与设计、各个模块的设计重点、设计思想难点技术和解决方案,最后对本系统的开发过程进行总结。经过不懈的努力实现了前台管理,登记入库,账单查询,出库查询,销售管理,库存管理等一系列的功能,很好的完成了任务。【关 键 词】MFC ADO 控件 管理系统ABSTRACTWith the rapid development of Chinas economy, people pay more and more attention to the efficiency increases, some management systems can be used to improve the staffs working efficiency, improve quality at the same time.Now people pay more and more attention to the application of computers in industry, based on the model of Internet +, I put forward its own needs in the supermarket management, using management system, can be on the employees work efficiency has greatly improved, so I selected topic of this
*好棒文|www.hbsrm.com +Q: ^351916072*
article is "the supermarket management system", implement the management of the supermarket business daily.This article first introduced some basic knowledge of MFC, and now used in some mainstream database approach, and then I use the MFC interface programming, database using ADO connection of SQL SERVER.Both are very mature technology, there are some special control in MFC to display the data in the database, and has a good visual.In the database operation approach to design the structure of the complex SQL statements, list control, the Tab control and the use of the tree control.Then I introduced the system development background, then introduces the design of system analysis and design, each module key technical difficulties and solutions, design thought, finally summarized the development process of this system.Through unremitting efforts to realize the front desk management, registration of put in storage, query the bill, outbound query, sales management, inventory management and so on a series of functions, good finish the task.第一章 绪论 1一、选题背景 1二、可行性分析 2三、本文主要工作及结构 3第二章 相关技术综述 4一、MFC基础及深入理解 4(一)MFC基础 4(二)深入学习MFC 4二、数据库开发技术 5(一)ODBC 5(一) ADO 5第三章 系统需求分析 6一、功能需求 6(一)需求分析: 6(二)系统目标: 6(三)功能需求列表 8二、数据需求 9三、性能需求 10(一)响应时间需求 10(二)稳定性需求 10(三)适应性需求 10第四章 概要设计 11一、系统总体设计 11二、模块设计 12(一) 超市管理系统前后台设计与简单描述 12三、数据库设计 13(一)数据库分析 13(二) 管理系统E-R图 13(三)数据库、表的设计 15四、方案选择 18第五章 详细设计与实现 19一、用户登陆模块的实现 20二、前台销售模块设计 22三、入/出库模块设计 27四、库存模块设计 36五、后台模块设计 38第六章 系统测试 46第七章 结束语 50参考文献 51致 谢 52第一章 绪论本章介绍了管理系统的普及,很好的提高员工的办事效率,管理人员的组织能力,同时提出超市管理系统的提出背景和优势。接下来还介绍了超市超市管理系统的总体框架结构,并对本文的主要工作和结构做了交代。一、选题背景1.信息化的普及随着中国经济的发展,信息化已然成为我们追求的目标,信息化是以现代通信、网络、数据库技术为基础,对所研究对象各要素汇总至数据库,供特定人群生活、工作、学习、辅助决策等和人类息息相关的各种行为相结合的一种技术。同时管理系统正是提供了一种方式,它可以把信息进行整合,给人一种更好的决策空间,使人更有效率的工作,这将是以后发展不可或缺的一种方式,我们的生活信息这么多,必须要有一种管理系统,使之有条不紊的,所以信息化是目标,但是管理系统就成为了一种途径。2.超市管理系统提出背景随着计算机应用的不断深入,信息产业的兴起,各行各业几乎都与计算机有密切的联系,实现了不同程度的自动化操作,而且最近李克强总理提出互联网+的模式,这也突出计算机的重要性,促进我们加强对计算机的学习。而在我们生活的周围出现了大量的超市、便利店、专卖店等,如果他们要想在现在的现实中立足,必须提高自己的效率,必须自己拥有一套完善的并和自己自身特点的管理系统。而超市管理正是一个为解决当前超市商品普遍具有种类繁多、数量大、管理人员杂等特点而设计开发的软件系统。同时现在存在的一些管理系统都很枯燥,而且不能满足大多数超市的需求,系统开发的目的在于提升商品的信息化程度,减轻管理人员的整理、统计商品的负担,及时获取商品销售数据和库存书库,并同时提高管理效率和公司利益的最大化。同时我们作为现在程序员也有必要做出这样的软件,为广大超市管理人员服务。二、可行性分析为了便于管理层对技术和资金的投入进行决策,需要弟弟项目的可行程度进行分析,其中主要包括技术可行性、经济可行性、操作可行性、运营可行性等。1引言改革开放以来,我国发的各行隔夜得到了很好的发展。随着各种超市遍地课件,超市管理成为很重要的环节。随着我们经济的快速发展,超市页面临着数据和业务越来越大的现状,那么如何充分利用计算机来实现超市庞大商品、人员信息的控制和传输,从而方面销售行业的管理和决策,就成为了一个日益重要的课题。因此,开发这样的一套管理软件成为很有必要的事情。超市管理系统应该能够为用户提供充足的信息和快捷的销售、查询手段。根据超市管理的实际情况,设计的销售管理、入库统计、库存管理、系统管理等几个模块,实现了超市中商品的进货、销售、库存等管理的系统化、规范化和自动化。2技术可行性研究改系统界面友好,功能操作简单,在新系统投入使用时,只要对用户进行简单的说明,就可以很容易的操作该系统。该系统可以采用VS2010 和 SQL SERVER 数据库来完成,以前很多程序员很多开发过很多这样的项目,完全可以在要求时间内完成该系统的开发。3经济可行性研究经济可行性可以从项目提出者和项目开发者两个方面来说明。从项目提出者方面来说,超市企业使用该系统可以节约很多人力和物力,方便管理,由此可以见着不必要的开支。同时该系统可以提高企业的销售效率,即提高了企业的经济效益,所以从经济上是完全可以的。管理系统是一个信息化、智能化和先进管理理念的集合体。而管理是一个动态过程,在其运行过程中要采取多项措施。所以在管理中获得经济效益是一个综合效益,要对它进行直接定量的分析是比较的困难的。一般,新系统带来的经济效益是间接的,其最重要的表现就是减少了企业的管理费用和人力开支。所以这方面也是完全可以接受的。4操作可行性本系统采用大家熟悉的Windows操作系统,具有一般的计算机知识的人员都可以轻松上手。而且整个销售系统采用友好的交互界面,简洁明了,不需要对数据库非常了解也可以熟练操作。5结论根据上述分析,项目开发我认为此项目结构清晰,功能合理,而且使用现有技术能够进行开发,并可实现客户要求的全部功能。由于这是一个中小型系统,开发时间完全充裕,无论在技术上、经济上,还是操作上,该系统具有很高的开发可行性。三、本文主要工作及结构1.本文所完成的超市管理系统,功能包括:(1)前台管理,主要负责商品的交易(2)入库管理,主要登记入库,入库单查询,入库单明细,登记出库等(3)出库管理,类似于入库管理(4)销售管理,主要有销售记录查询,退货管理2.解决的技术难点包括:(1)在VS2010下于数据库的连接SQL SERVER2008(2)利用控件来显示从数据库中选出的数据进行显示(3)深刻了解MFC中消息处理机制第二章 相关技术综述 本章对超市管理系统所涉及的观念及使用到的技术做了很详细的介绍,主要内容包括MFC的概念及发展现状,数据库的开发技术简介,在MFC中列表控件、Tab控件及树形控件的使用方法。MFC基础及深入理解1.MFC基础在我们学习了C++的基础;语法理论之后,我们以前都是利用MS-DOS的方式进行练习编程的能力,但是我们以后更多的需要开发项目来实现可视化的编程,而Windows程序设计,与这种MS-DOS的编程截然不同。Windows程序设计和MS-DOS程序有者很大的区别,不仅仅在界面方面,还有在消息的处理机制上也有很大的区别,因为Windows程序设计是消息驱动的。在MFC中有一个很重要的视图,所谓的视图就是所谓的一个“窗口”它具有Windows应用窗口的一般特性,及用户可以通过其执行缩放、打开或关闭、移动、最小化和最大化等操作。实际上,MFC程序中的视图就是MFC类库汇总的CView或CView类的派生类创建的一个对象。2.深入学习MFC在学习了MFC的视图类之后,Windows应用软件的其中有很大的、很有特点的:不仅是有内容丰富的界面和很多函数接口之外,还在于这些内容丰富的界面有统一的标准,使之开发起来很容易,而且,让用户在熟悉Windows操作系统应用的前提下,很容易触类旁通地快速熟练使用其他应用软件。在学习了试图类之后,视图类对应的是视图窗口,而这并不是唯一的窗口,还有其他窗口。视图窗口是嵌套在主框架窗口(MainFrm.h)中的一个“子窗口”。主框架窗口包含着很多的东西,主要有包含标题栏和菜单栏,而各种各样的子窗口也包含很多东西,其中最主要的是又包括工具栏窗口、状态栏窗口和视图窗口, 是整个主框架窗口的主要部分。二、数据库开发技术1.ODBCODBC是开放数据库互连。一个要有数据开开发的项目,它可以不一览任何数据库(DBMS),不直接和数据库打交道,所有的操作都是用驱动来完成,也就是不管是什么数据库来靠函数的接口(API)来进行访问,而API是相对固定的,因此大大缩短了使用ODBC进行数据库研发的学习周期。ODBC是Visual 2010 继承开发环境中较为常用的数据连接方式,应用程序想到为每个数据库的表生成一个Set类,通过Set类对象来进行数据的访问。2.ADO 虽然我们的开发工具visual 2010 没有提供很好的应用程序的向导,但是我自己通过学习之后,很好的掌握了这种数据库开发的学习,其实ADO就是一个COM组件作为应用程序和数据仓库的中间层,如果从方便性和容易性而言,它不必任何技术要来的麻烦。ADO主要包括三个基本接口:_ConnectionPtr接口:返回一个记录集指针或一个空指针。通常使用他来创建一个数据连接或执行一个记录集不是一个好的使用方法。使用它会创建一个数据连接,然后,在使用其他对象执行数据输入输出操作。_ConmandPtr接口:这个接口是返回一个记录集,它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用该借口时,可以利用全局接口,也可以在_ConmandPtr接口里直接使用连接串。_RecordsetPtr接口:此接口是一个记录集对象。但是提供了更多的控制功能,如记录锁定、游标控制等。第三章 系统需求分析 本章的重点是弄清系统的需求,通过业务流程图描述系统的具体操作流程,通过功能列表分析系统的具体功能要点。在数据需求部分,通过对系统中存在的数据进行分析,合理设置每一类数据的数据类型,以满足系统需求。在性能需求部分,对系统的响应时间、稳定性及适应性做了简介。一、功能需求1.需求分析:通过市场的调查,针对现在各中,小型超市对经营业务和人事管理的实际需要及超市的特点,开发出本系统帮助超市解决现在面临的问题,提高超市的竞争力。数据库应用系统的开发应按照软件工程的开发方法进行分析、设计、编程和调试。如下图所表示为数据库应用系统的开发过程。需求分析包括对数据本身的需求分析和对功能的需求分析。两个分析的结果将分别作为数据库设计和程序设计的依据。本系统为超市管理系统,主要包括前台收银、库存、后台管理等。其中后台管理有可分为退货管理、用户管理、数据管理、数据维护等。库存管理又分为入库管理和出库管理。而入库管理和出库管理可分为登记入库,入库明细和登记出库,出库管理。当收银员登陆该系统是只能进行前台的收银管理,而不能进行后台各项管理,而当收银员出售商品时发现库存不够时,要立即通知经理进行进货管理。管理员可对系统进行各种操作。2.系统目标:系统要采用C/S结构模式,千团开发工具采用目前比较流行的VS2010,后台数据库系统采用大型数据库2008,系统运行平台为Windows。开发的系统进,销,存,查询为一体,并提供方便快捷操作界面,实现从报表到库存,方便管理者充分、准确、有效地了解经营状况,及时提供准确的统计数据、分析报告和更加深入的数据分析、预测,帮助管理者紧密地把握企业的动态,实行更科学的管理。下图是业务流程图: 图3-1 业务流程图如流程图所示,用户首先登陆超市管理系统,系统会对用户的登陆星系进行检查,如果出错的话,提示没有该用户,之后判断操作员的权限。如果该用户是普通的操作者,则他直接进入普通操作员的界面,进行扫描商品,取消交易,删除账单中的商品,结账等功能。如果该用户是管理员,他进入管理员的界面,里面的操作有入库,出库账单查询等操作,添加数据库里的商品等信息,录用的包括商品的详细信息,例如进价,售价和厂家的详细等。在普通操作员和管理员都进行的操作之后,系统都会自动更新数据库里的数据。3.功能需求列表根据业务需求,超市管理系统应该具备的功能包括:前台销售,后台的管理(登记入库,入库单查询,库存管理,销售管理)等功能。这些功能的详细描述见表3-1。表3-1 功能需求列表编号功能名称功能说明1登录操作员输入ID和密码,按“确定”进行登录。如果ID或密码错误,则系统会提示“没有该用户”,然后重新输入。找到满足条件的记录后根据身份进行不同的操作界面。收银员用户登陆后,对主框架进行隐藏,只显示前台的销售界面,这样用户只能操作此界面。2前台销售根据登陆账号权限不同,会显示不同的系统界面。如果是普通用户,则显示【前台管理】对话框。收银员通过该界面对交易商品进行管理。输入商品编号后,在【已购商品列表】中会显示顾客所购商品的详细信息。如果顾客想放弃某个商品,可单击【删除商品】或【取消交易】按钮。如果收银员下班可以通过【换收银员】按钮换班3登记入库如果是管理员或部门主管用户登录后会进入系统主界面,在该界面中单击【登记入库】按钮,进入【登记入库】选项卡,单击【登记入库】按钮,显示入库信息,在单击【新增】按钮,显示扩展窗口。在其中输入各项信息,在单击【入库确定】按钮,如果输入信息无误,在列表控件中显示添加完的信息。4入库明细在主界面上单击【入库明细】按钮,进入入库明细选项卡,选中【查询条件】复选框,输入操作员编号,或设定时间范围,单击【查询】按钮。如果输入信息无误,用户就可以在列表控件中看到满足条件的信息。选中该条记录,还可以在扩展窗口编辑框中显示该条记录相关的更详细的信息。5入库汇总在【入库情况汇总】选项卡中,可以通过各种方式进行汇总。在【汇总选择】下拉列表框中选择【年汇总】选项,或设定时间范围来汇总。单击【汇总】按钮,就可以在【操作结果】列表框中看到满足条件的信息,在【汇总情况】区域会显示入库汇总的数量。6出库管理在主界面菜单栏上选择【出库管理】命令,弹出【当前库存信息】窗口,在其中输入商品名称并设定最高,最低值后,单击【查询】按钮,如果输入信息无误,则可以在列表控件中看到满足条件的信息。7后台管理在主界面菜单栏上选择【后台管理】菜单,该菜单有2个子菜单:销售退货,用户管理。选择【销售退货】弹出【退货单】对话框,通过该对话框额可以帮顾客完成商品退货且更新销售信息;如果选择【用户管理】弹出【增加用户】的对话框,可以增加普通操作员和管理员。8系统管理用户管理模块主要实现各种权限用户的添加,注销,密码就权限的修改操作,但是操作者必须有管理员权限。二、数据需求在整个数据库的开发中药设计7个表单的操作,具体的数据需求见表3-2。表3-2 数据需求列表序号信息数据项数据描述数据类型1销售表交易号顾客消费之后产生表单字符串型(长约30位)商品号顾客所购买东西的编号字符串型(长约30位)数量顾客所购买东西的数量浮点型操作员号收银员的编码ID字符串型(长约50位)退货信息顾客要退货之后生成表字符串型(长约50位)退货数量顾客所退商品的数量浮点型2供应商供应商号用于标示供应商的编号字符串型姓名供应商的名称字符串型电话供应商的电话字符串型地址供应商字符型3商品表编号用于标示不同的商品字符串型商品名商品的名称字符串型特殊说明用于对产品的描述字符串型单位商品的出场单位字符串型进价商品进货时的价格字符串型售价商品出售时的价格浮点型折扣商品出售时的折扣浮点型数量仓库中商品的数量浮点型4库存信息库存号用于记录商品存放的仓库字符串型商品号用于记录商品的编号字符串型入库日期用于记录商品入库的时间时间类型类型用于记录商品的类型字符串型供应商号用于记录生产商品的厂家字符串型库存信息用于描述存放商品的仓库字符串型操作员号用于记录收银员的编号字符串型库存标志用于记录存放商品的仓库字符串型单价记录商品的单价Money数量记录商品在仓库的总数量浮点型总金额记录账单的总金额Money5库存管理商品号用于记录进入仓库的商品字符串型上限用于记录仓库最多的商品数浮点型下限用于记录仓库最低商品数浮点型当前数量记录仓库当前商品的数量浮点型6操作员操作员号用于标示操作员字符串型姓名用于标示操作员的姓名字符串型密码操作员自己设置的密码字符串型权限用于标志是否为管理员权限字符串型7数据库的备份还原备份号用于标志备好数据库号码整型备份时间用于记录备份的时间Datetime备份路径用于记录备份数据库的路径字符串型三、性能需求1.响应时间需求因为本系统是面向广大的超市管理员和收银员,所以当收银员收款时,必须要有足够快的响应时间,不能让顾客等待的时间太久,所以必须加强软件本身的计算能力,当商品加入购物单或从购物单删除时必须快速的算出总金额。其中最为关键的技术是与数据库之间的交流,软件必须很快的读出仓库是否有货或者价格的修改。所以算法要高效,提高运行速度。2.稳定性需求由于超市管理系统每天都要使用,而且每时每刻都在进行金钱的交易,所以必须要有很高的稳定,在每次打开和关闭的时候,必须要有数据库的备份,以免以前的数据的丢失,从而造成巨大的损失。3.适应性需求因为本系统要保证软件的简单、易使用性,在不同的电脑上都能正常的使用,适合普遍有计算机知识的操作人群。因为本系统是采用MFC的界面设计,使用的VS开发环境,所以在正常版本的Windows的操作系统都能使用。第四章 概要设计本章先介绍了超市管理系统整体的框架结构,对各部分做了简单的描述。然后从系统的顶层的模块开始,逐一介绍各个模块内部数据的具体传输。接下来,介绍了数据的设计情况,对数据库的每张表都做了详细的设计和较少,最后分析了系统开发是的要点,确定了需要使用的技术和开发工具。一、系统总体设计超市管理系统一共分为前台管理和后台操作。前台管理的操作员主要是收银员,其中包括在已购买商品单中添加商品,删除商品,取消交易,商品查询,换收银员,退出收银模块。后台主要是入库,库存销售管理等,超市管理系统的总体框架如下图:图4-1总体框架图二、模块设计本系统所有的操作可以分为主要两个模块,主要采用C/S的设计模式,主要是前台管理和后台的管理,前台主要是销售的界面,主要是一个界面;而后台相对比较包括出入库管理,库存管理和销售管理,系统管理模块。几个模块之间有着很大的联系,前台管理的模块相对较少,但是是整个系统设计的开始,所以有着举足轻重的作用。1.超市管理系统前后台设计与简单描述(1)登陆模块功能分析:登陆模块的功能主要是获取登陆者身份者的身份和验证密码的正确性,对收银员用户和管理员以外的用户进行限制登陆。淡然,用户成功登陆后要根据登陆者的身份不同,分别进入相应的操作界面,完成对应的界面初始化。结合需求分析可知,此模块实现的功能为:身份确定、密码验证、界面隐藏和显示。(2)前台销售销售模块功能分析:前台销售是顾客结账和收银员操作所涉及的主要界面,该模块的功能主要是让收银员方便对交易商品进行管理,统计、结账及相关的付诸功能,同时,也可以让顾客及时了解所购商品的详细信息。结合需求分析可知,此模块实现为商品买扫描输入、商品信息显示、商品价格汇总、屏幕锁定、收银员换班、结账找零等。(3)入/出库模块功能分析:入出库模块功能主要是让部门管理员方便对商品进行库存和入库管理,统计、利润分析及相关的辅助功能操作,也可以通过各种方式查询入出库明细信息。结合需求分析可知,此模块实现功能为登记入库、入库单查询、入库明细、登记出库、出库单查询、出库明细、出库汇总和出库汇总等。(4)库存模块设计:通过需求分析,库存管理界面实现的功能不是很多,主要是给采购人员采购商品及采购量功能参考。在设置库存量上、下限时有两种方式来实现。主要实现能更具商品名称或库存量进行设置、查询,对达到库存量下限的商品给出提示,提醒管理员要准备改商品的采购,也可根据库存报警下限主动查询商品。(5)后台模块功能分析:后台管理非常重要,所以在设计是要求只有对特定用户才能使用,在数据处理方面还实现了数据库的备份和还原功能。另外,对用户管理方面,实现了添加用户、注销用户、修改用户信息及删除用户等各种常见的管理操作。同时,对于销售后的服务及商品退货也放在此模块。三、数据库设计 数据库作为系统的基础,首先要保证其设计的合理性。在使用应用系统时,拥有设计合理的数据库往往可以起到事半功倍的效果。数据库设计设计多门学科的综合性技术,要求设计人员除了具备计算机科学的基础知识之外,还必须掌握程序设计的技巧和方法,具备数据库的基本知识和数据库设计技术,才能设计出符合具体应用领域要求的数据应用体统,目前数据库设计有两种不同的方法,即面向数据和面向过程设计方法。前者是以信息需求为主,兼顾处理需求,后者以处理需求为主,兼顾信息需求。数据库分析由于系统规模比较大,对数据库的性能要求高,故采用SQL Server 2008作为系统开发的数据库管理系统。SQL Server 2008能提供超大型系统所需的数据库服务,支持事务操作,这对数据的完整性有了很好的保障。作为一个超市管理系统,昨日的而销售及商品的出入库等情况对于超市来说都是非常的重要的,数据库管理系统解决了企业商品的进、销、存、退、换等一些列操作过程中的信息数据处理为题且提供了一系列的数据分析。管理系统E-R图 该系统包含的实体主要有:商品、库存单、销售单、管理员等,下面将分别介绍各实体及实体间的E-R图。通过其E-R图,读者可以更好地理解各实体的属性关系。商品和库存单E-R图,如下图所示:图4.2商品和库存单E-R图商品和销售单E-R图,如下图所示:图4.3商品和销售单E-R图商品和供应商E-R图,如下图所示:图4.4商品和供应商E-R图在系统的开发过程中,数据库的设计直接影响着系统的后期开发,故在数据库的设计过程中,需要为后期的维护和系统性能的扩展打下良好的基础。3.数据库、表的设计a数据库的名称为Sales,下面提供系统运行时动态创建数据库的方法SQL语句。表中详细信息见表4-1至4-101.销售表(tb_sale)表4-1 销售表(tb_sale)序号字段名数据类型字段大小是否为空主键描述1buyidvarchar50否是交易号2mercidvarchar20是否商品号3buycountfloat8是否数量4operidvarchar8是否操作员号5quitinfovarchar50是否退货信息6quitnumfloat8是否退货数量说明:这张表用于记录顾客消费的时候,生成的销售表,主要包括交易号、商品号、数量、操作员、退货信息、退货数量。各字段的详细内容如上表所示。销售的商品信息表 (tb_merchangiseinfo)表4-2 销售的商品信息表(tb_merchangiseinfo)序号字段名数据类型字段大小是否为空主键描述1idvarchar20否是编号2mernamevarchar20是否商品名3specvarchar4是否特殊4mercunitvarchar8是否单位5inpricefloat8是否进价6outpricefloat8是否售价7providvarchar8是否供应商号8discountfloat8是否折扣9numberfloat8是否数量说明:这张表记录供应商的信息。包括供应商的编号、商品名、特殊、单位、进价、售价、供应商号、折扣、数量信息。各字段的内容如上表所示。3.供应商表(tb_provider)表4-3供应商表(tb_provider)序号字段名数据类型字段大小是否为空主键描述1providvarchar8否是供应商号2provnamevarchar20是否姓名3provphonechar9是否电话4provaddrvarchar20是否地址说明:这张表用于记录供应商表的供应商号、姓名、电话、地址,各字段的详细内容如上表所示;库存表(tb_storage)表4-4 库存表(tb_storage)序号字段名数据类型字段大小是否为空主键描述1storidvarchar20否是库存号2merchandiseidvarchar20是否商品号3stordatedatetime8是否入库日期4stortypevarchar10是否类型5providvarchar8是否供应商号6storinfovarchar30是否库存信息7operidvarchar8是否操作员号8storflagvarchar2是否库存标志9unitpricemoney8是否单价10numbersfloat8是否数量11paymoneymoney8是否付款说明:这张表记录了数据主题的信息。包括主题ID、所属数据源、主题名、主题描述、是否注册等。这张表记录了库存表,主要记录了库存的基本信息,包括库存号、供应商号、入库日期、操作员等信息,其各字段的详细都是如表所示。5.库存管理表(tb_storemanage)表4-5 库存管理表(tb_storemanage)序号字段名数据类型字段大小是否为空主键描述1meridchar10否是商品号2downlimitfloat8是否下限3uplimitfloat8是否上限4nowvaluesfloat8是否当前数量说明:库存管理表(tb_storemanage)用来记录库存管理表的信息,包括库存商品号、设定的下限、上限、当前数量,各字段的详细信息如上表所示。操作员表(tb_operator)表4-6 操作员表(tb_operator)序号字段名数据类型字段大小是否为空主键描述1operidvarchar8否是操作员号2opernamevarchar8是否姓名3operpasswordvarchar8是否密码4operlevelvarchar10是否权限说明:操作员表(tb_operator):用来记录操作员的信息,包括操作员号、姓名、密码、权限,各字段的详细信息如上表所示。备份还原表 表4-7 备份还原表(tb_backup)序号字段名数据类型字段大小是否为空主键描述1idint4否是备份号2backuptimedatetime8是否备份时间3filepathvarchar50是否备份路径说明:备份表还原表:(tb_backup):用来记录备份文件的信息,包括备份号、备份时间、备份路径,各字段的详细信息如上表所示;四、方案选择技术的使用 微软基础类库mfc,以C++类的形式封装了Windows API,并且包含一个应用程序框架,例如单文档,多文档等框架模式,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类,在深入学习了C++之后,可以很容易的使用MFC来开发界面开发工具选择超市管理系统是典型的C/S的设计结构,分为前台和后台两个部分,界面都是采用MFC的设计,数据库为SQL Server2008,。Visual 2010 是微软公司推出的比较新的开发环境,是目前最流行的Windows平台应用程序开发环境。功能很多,其集成开发环境(IDE)的界面被重新设计和组织,,变得更加简单明了。其中MFC的开发,提供很好的界面设计和提供很多接口,提供给开发者,提高了开发者的效率。SQL Server 2008数据库是一种大型数据库,一般用于商业,政府等很多部门,它的功能十分的强大,具有处理大数据的能力,在网络上运用也很多。但是现在一些小的工程都用mysql SQL server等数据库系统,它的操作简单,功能相对齐全。但是相比较SQL Server来说,在处理能力还不行,所以我选择了SQL Server2008。第五章 详细设计与实现 本章主要内容是主要是介绍超市管理系统的各部分来具体实现代码,分别从与数据库的连接,前台和后台等一些操作,给出实现的具体代码和软件的功能截图。一、用户登陆模块的实现作为超市管理系统,由于使用对象收银员群体较大,故需要用户登陆模块记录当前人员邓丽信息。设计用户登陆模块是为了验证登陆者的身份和权限,只有收银员用户或管理员才能登陆与之对应的管理系统。在登陆界面,通过对各项登陆条件的验证,就可以确认用户的使用权限,根据权限不同显示不同的界面,下面将介绍登陆模块的具体开发过程。登录模块技术分析登录模块功能实现主要是通过遍历数据表(tb_operator),查找数据库中用户(operid)和密码(operpassword)与输入的用户和密码都一致的记录,找到满足条件条件的记录后根据身份进行不同的操作。收银员用户登录后,对主框架进行隐藏,只显示前台销售界面,这样,用户只能操作此界面;而管理员用户登陆后,系统主框架正常显示,用户可操作任何模块界面。开发登陆模块前,首先要完成其界面的设计,然后在具体实现各个模块功能。下面介绍界面的设计过程。插入对话框资源和其他各个空间,适当修改标题和ID号,布局好界面,最终登陆界面设计如下图: 登陆界面的实现首先在对话框上空白区域双击,给登陆对话框建立一个类PASSDLG,通过类想到给两个编辑框添加字符串变量m_user、m_pass保存用户名和密码,在应用类中编写代码实现模块功能具体代码如下:(并且一下代码仍然包括如何连接数据库)?PASSDLG?dlg1; CString?str; m_pMainWnd->ShowWindow(SW_HIDE); if(dlg1.DoModal()==IDOK) { CString?sqlstr; sqlstr.Format("select?*?from?tb_operator?where?operid=%s?and?operpassword=%s",dlg1.m_user,dlg1.m_pass);????????if(GetRecord(sqlstr)==0){AfxMessageBox("没有该用户!");return?true;}????????operid=dlg1.m_user;????????str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem("operlevel")->Value; str.TrimRight(); } else?return?true;????if(str!="管理员") { CForeMange?dlg; dlg.DoModal(); m_pMainWnd->ShowWindow(SW_HIDE); } else { m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); m_pMainWnd->UpdateWindow(); m_pMainWnd->SetWindowText("超市管理系统--HC1.0"); }上面的代码是根据用户身份不同显示不同的界面代码。和获取数据表中记录个数,实现对用户权限的判断,当用户是非管理员是,只显示前台销售界面;当用户是管理员时,系统汉族框架正常显示,用户可操作任何模块界面。其中数据表中的记录的个数,操作系统各GetRecord()函数封装,下面给出该函数的主要部分。int?CHCDBApp::GetRecord(CString?sqlstr){ m_record=NULL; m_record.CreateInstance(__uuidof(Recordset)); m_record->Open((_variant_t?)sqlstr,theApp.m_connection.GetInterfacePtr(), adOpenDynamic,adLockOptimistic,adCmdText); int?count=0; if(m_record!=NULL) { try { m_record->MoveFirst(); } catch(...) { return?0; } if(m_record->_EOF)return?0; while(!m_record->_EOF) { m_record->MoveNext(); count++;}} m_record->MoveFirst(); return?count;}连接数据库的操作用函数ConnercSql()封装,不仅能够很方便的判断连接是否成功,而且对于频繁连接数据库操作可以减少代码重复编写,提高开发效率。二、前台销售模块设计前台销售模块是超市管理系统中非常重要的模块。设计前台销售模块主要是为了方便不同的收银员通过该界面对交易商品进行管理。扫描商品条形码或输入商品编号后,能显示顾客所购商品详细信息,可进行统计最终应付款和找零操作。现在将从界面设计及各子模块的实现等方面介绍前台销售的具体开发过程。1.前台销售模块技术分析 设计本模块功能时考虑到信息的相关性对编辑框数据的输入时要实现自动关联,为了更方便用户数据的输入,各编辑框控件的焦点也实现了自动切换。为了让收银员把账单看得更清楚,对最后的汇总数据实现了改变字体、放大、高亮输出。考虑到收银员的短暂离开,为了保护数据的安全,设计了屏幕锁定功能,通过输入密码验证后才能完成本次交易管理。2.前台销售模块的设计开发前台销售功能具体功能钱,首先要完成其界面的设计,然后在具体实现模块功能。下面介绍界面的设计过程。插入对话框资源和其他各个空间,适合修改标题和ID号,布局好界面,最后前台销售界面社体如图。图5.2前台管理模块编号信息的动态获取上一节主要完成了界面的设计,由于功能代码均码没添加,所以单击界面上的控件都不会起作用,本节将介绍如何实现前台销售功能。首先,在对话框上的空白区域双击,给该前台销售对话框建立一个类CForeMange,通过类向导给各个编辑框、List控添加变量,给七个按钮添加单击消息函数,给商品编号对应的编辑框添加EN_KILLFOCUS消息,动态获取编号商品信息。在CForMange类中编写代码实现模块功能。下面将介绍编辑框数据输入时动态显示查找结果的方法,具体代码如下:void?CForeMange::OnKillfocusMercid()?{ CString?sqlstr; UpdateData(); if(m_id=="")return; sqlstr.Format("select?*?from?tb_merchangiseinfo?where?id=%s",m_id); if(GetRecord(sqlstr)==0) { MessageBox("没有该商品"); GetDlgItem(IDC_MERCID)->SetFocus(); return; }}商品信息键盘消息处理这里将介绍编辑框数据输入时动态显示商品信息的方法,也讨论对键盘各个消息的处理方法,实现键盘易用性,具体代码如下:BOOL?CForeMange::PreTranslateMessage(MSG*?pMsg)?{ if(pMsg->message==WM_KEYDOWN?&&?pMsg->wParam==VK_RETURN)?//截取回车键??? { if(::GetFocus()==m_mercnum) { UpdateData(); CString?sqlstr; sqlstr.Format("select?*?from?tb_merchangiseinfo?where?id=%s",m_id); if(GetRecord(sqlstr)==0) return?false; CString?str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem("number")->Value; if(double(atof(str))SetFocus(); ?allmoney=0; ?m_allmoney.Format("累计
金额:%.2f",allmoney); ?m_floatallmoney=allmoney; ?SetAllMoneyStyle(); ?return; ?} ?for(int?i=0;iGetWindowRect(&rectseparator); rectsmall.left=rectlarge.left; rectsmall.top=rectlarge.top; rectsmall.right=rectseparator.right; rectsmall.bottom=rectseparator.bottom; }????if(str=="退出查询") { SetWindowPos(NULL,0,0,rectsmall.Width(),rectsmall.Height(),SWP_NOMOVE|SWP_NOZORDER); } else { SetWindowPos(NULL,0,0,rectlarge.Width(),rectlarge.Height(),SWP_NOMOVE|SWP_NOZORDER); } CString?sqlstr; UpdateData(); sqlstr.Format("select?id,mercname,number,outprice,discount,spec?from?tb_merchangiseinfo?where?id=%s",m_id); SetList2Value(sqlstr);}上述按钮标题的动态更改,在输入商品后,按下回车键可实现购买的商品价格统计,输入实付金额后按下回车键可直接给出找零。实现窗口的动态扩展,在需要显示查询的详细信息时展开,退出时自动收缩。关键函数是SetWindows,调用这个函数可以改变子窗口、显示窗口和顶层窗口的大小位置和Z轴次序。其次上面的代码实现了商品详细信息的输出,通过List控件显示查询结果。上面的代码实现了列表信息输出用SetList2Value()函数进行分装,具体代码如下:void?CForeMange::SetList2Value(CString?sqlstr){ GetRecord(sqlstr); m_list2.DeleteAllItems(); int?rows=0; try { for(int?i=0;i<6;i++) { CString?str; str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem(long(i))->Value; if(i==0)m_list2.InsertItem(rows,str); else m_list2.SetItemText(rows,i,str); } UpdateData(false); } catch(...) { return; }}在数据库应用程序中列表控件输出数据比较方便,上面介绍了列表控件和数据表数据关联的使用过程。屏幕锁定和收银员换班屏幕锁定实现了方法比较简单,主要是通过显示无标题的模态对话框而实现的。当需要解锁时,输入正确密码后,该界面退出就可以了。当然,还可以通过钩子来实现,在此就不多说明了。收银员换班功能主要是为了实现对不同的收银员统计销售进而而设计的,具体代码如下:void?CForeMange::OnButton6()?{ PASSDLG?dlg1; if(dlg1.DoModal()==IDOK) { CString?sqlstr; sqlstr.Format("select?*?from?tb_operator?where?operid=%s?and?operpassword=%s",dlg1.m_user,dlg1.m_pass);????????if(GetRecord(sqlstr)==0){MessageBox("没有该用户!");return;}????????operid=dlg1.m_user; }上面的实现过程主要是打开遍历tb_operator 数据表,如果输入的用户和密码都正确,则把当前操作员显示为输入用户,实现了换收银员操作。三、入/出库模块设计 出入库模块设计主要是方便管理商品登记入库、出库登记报警操作。通过该模块可以更好的统计汇总商品出入库和库存信息,分析商品销售利润,建立库存报警模块,为超市下一次进货提供参考数据。下面将从界面设计和各子模块的实现方面介绍出入库模块的具体开发过程。出入库模块的设计下面主要是界面的设计过程。插入对话框资源和其他各控件,适当修改标题和ID号,安排好界面后,最终登记入库界面设计如图:图5.3入库模块界面入库单查询和入库明细界面在查询条件上有差别,并且入库明细界面读了个显示明细信息的List控件,读者在设计时,可以采用同一个界面处理。入库汇总界面有各种方式查询,查询条件可以复合,允许通过操作员编号、入库单或设定时间范围来查询,同时还需要显示入库汇总的数量,故界面上控件很多,最终入库汇总界面设定如下图:图5.3入库汇总管理模块入登记入库界面的实现:上面主要完成了界面的设计,给各个控件分别添加消息函数及变量,编写功能代码,本部分主要介绍如何实现入出库的查询、统计功能。该界面实现了其中一个关键技术是如何正确获取入库单号,代码如下:CString?CGATHERIN::GetStroId(){???UpdateData();??m_recordstorid=NULL;??m_recordstorid.CreateInstance(__uuidof(Recordset));??CString?sqlstr;??CString?str=m_date.Format("%Y-%m-%d");??sqlstr.Format("select?*from?tb_storage?where?stordate=%s?and?storflag=1",str);??m_recordstorid->Open((_variant_t?)sqlstr,theApp.m_connection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);??if(GetRecordCount(m_recordstorid))??{ ??m_recordstorid->Close(); ??sqlstr.Format("select?Max(storid)?as?maxstorid?from?tb_storage?where?stordate=%s",str); ??m_recordstorid->Open((_variant_t?)sqlstr,theApp.m_connection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); ??if(GetRecordCount(m_recordstorid)) ??{ ??str=(LPCSTR)(_bstr_t)m_recordstorid->Fields->GetItem("maxstorid")->Value; ??CString?str1,str2; ??str1=str.Mid(0,8); ??str2=str.Mid(8); ??str2.TrimRight(); ??int?num=atoi(str2); ??num+=1; ??CString?str3; ??str3.Format("%d",num); ??for(int?j=0;jShowWindow(flag); GetDlgItem(IDC_STATIC2)->ShowWindow(flag); . . GetDlgItem(IDC_EDIT10)->ShowWindow(flag); GetDlgItem(IDC_COMBO3)->ShowWindow(flag); }注意:此处ShowWindows()函数带参数,参数的值是bool类型,在界面初始化时需要隐藏部分空间。故在该对话框界面对应的CGATHERIN类的OnInitDialog()函数中添加ShowWindows(false),而在【新增】按钮消息函数中添加ShowWindows(true)就实现了按钮的显示效果。入库明细界面的实现 该界面实现通过各种方式查询明细信息 ,查询条件可以是操作员编号,也可以通过设定时间范围来查询,通过列表控件显示信息,同时,还可以显示该记录的更详细的信息。其中查询功能实现起来稍微有点麻烦,代码很多。void?CINDETAIL::OnButton1()?{ CString?sqlstr; if((m_check.GetCheck()==false)&&(m_check2.GetCheck()==false)) { MessageBox("请设置查询条件","系统提示",64); return?; } if(m_check.GetCheck()==true&&(m_check2.GetCheck()==false)) { UpdateData(); if(m_edit2=="") { MessageBox("请设置查询条件","系统提示",64); return?; } m_list.DeleteAllItems(); CString?fileds;????????switch(m_comquery.GetCurSel()) { case?0:fileds="operid";break; case?1:fileds="provid";break; case?2:fileds="storid";break; case?3:fileds="merchandiseid";break; } ????????sqlstr.Format("select?*?from?tb_storage?where?%s=%s?and?storflag=1",fileds,m_edit2);????????GetRecord(sqlstr); } if(m_check.GetCheck()==true&&(m_check2.GetCheck()==true)) { UpdateData(); if(m_edit2=="") { MessageBox("请设置查询条件","系统提示",64); return?; } CString?sqlstr; m_list.DeleteAllItems(); CString?fileds;????????switch(m_comquery.GetCurSel()) { case?0:fileds="operid";break; case?1:fileds="provid";break; case?2:fileds="storid";break; case?3:fileds="merchandiseid";break; }????????sqlstr.Format("select?*?from?tb_storage?where?%s=%s?and?storflag=1?and?stordate?between?%s?and?%s",fileds,m_edit2,m_begintime.Format("%Y-%m-%d"),m_endtime.Format("%Y-%m-%d")); GetRecord(sqlstr); } if(m_check.GetCheck()==false&&(m_check2.GetCheck()==true)) { UpdateData();????????CString?sqlstr;????????sqlstr.Format("select?*?from?tb_storage?where?stordate?between?%s?and?%s",m_begintime.Format("%Y-%m-%d"),m_endtime.Format("%Y-%m-%d"));????????GetRecord(sqlstr); } int?row=0; while(!m_record->_EOF) { CString?temp; temp=(LPCSTR)(_bstr_t)m_record->GetFields()->GetItem("merchandiseid")->Value; m_list.InsertItem(row,temp); sqlstr.Format("select?*?from?tb_merchangiseinfo?where?id=%s",temp); GetMercRecord(sqlstr); temp=(LPCSTR)(_bstr_t)m_mercRecord->GetFields()->GetItem("mercname")->Value; m_list.SetItemText(row,1,temp); temp=(LPCSTR)(_bstr_t)m_mercRecord->GetFields()->GetItem("inprice")->Value; m_list.SetItemText(row,2,temp); temp=(LPCSTR)(_bstr_t)m_record->GetFields()->GetItem("numbers")->Value; m_list.SetItemText(row,3,temp); temp=(LPCSTR)(_bstr_t)m_record->GetFields()->GetItem("paymoney")->Value; m_list.SetItemText(row,4,temp); temp=(LPCSTR)(_bstr_t)m_mercRecord->GetFields()->GetItem("discount")->Value; m_list.SetItemText(row,5,temp); temp=(LPCSTR)(_bstr_t)m_record->GetFields()->GetItem("operid")->Value; m_list.SetItemText(row,6,temp); temp=(LPCSTR)(_bstr_t)m_record->GetFields()->GetItem("storid")->Value; m_list.SetItemText(row,7,temp); m_record->MoveNext(); row++; } CString?str; str.Format("找到了%d条记录",row); MessageBox(str);}上面的代码主要是完成对话框界面中各控件的初始化设置。并根据组合框中的选项执行对应查询操作。其中上面的代码通过GetCheck来判断用户是否选中对应选项,组合框选中选项的索引号是通过GetCurSel获取的。下面根据获取复选框选中的选项构造查询语句。相关代码如下:if(m_check.GetCheck()==true&&(m_check2.GetCheck()==true)) { UpdateData(); if(m_edit2=="") { MessageBox("请设置查询条件","系统提示",64); return?; } CString?sqlstr; m_list.DeleteAllItems(); CString?fileds;????????switch(m_comquery.GetCurSel()) { case?0:fileds="operid";break; case?1:fileds="provid";break; case?2:fileds="storid";break; case?3:fileds="merchandiseid";break; }????????sqlstr.Format("select?*?from?tb_storage?where?%s=%s?and?storflag=1?and?stordate?between?%s?and?%s",fileds,m_edit2,m_begintime.Format("%Y-%m-%d"),m_endtime.Format("%Y-%m-%d")); GetRecord(sqlstr); } if(m_check.GetCheck()==false&&(m_check2.GetCheck()==true)) { UpdateData();????????CString?sqlstr;????????sqlstr.Format("select?*?from?tb_storage?where?stordate?between?%s?and?%s",m_begintime.Format("%Y-%m-%d"),m_endtime.Format("%Y-%m-%d"));????????GetRecord(sqlstr); }上面的代码实现了两个复选框都轩中式用户所设定的查询条件,构造对应的SQL语句。还实现了选中其中一个复选框时用户所设定的查询条件,执行对应的SQL语句。上面的代码实现了根据用户选中复选框的不同情况,所设定的查询条件,构造不同的语句,并执行查询。下面获取查询结果数据并插入列表控件中。相关代码如下; int?row=0; while(!m_record->_EOF) { CString?temp; temp=(LPCSTR)(_bstr_t)m_record->GetFields()->GetItem("merchandiseid")->Value; m_list.InsertItem(row,temp); sqlstr.Format("select?*?from?tb_merchangiseinfo?where?id=%s",temp); GetMercRecord(sqlstr); temp=(LPCSTR)(_bstr_t)m_mercRecord->GetFields()->GetItem("mercname")->Value; m_list.SetItemText(row,1,temp); temp=(LPCSTR)(_bstr_t)m_mercRecord->GetFields()->GetItem("inprice")->Value; m_list.SetItemText(row,2,temp); temp=(LPCSTR)(_bstr_t)m_record->GetFields()->GetItem("numbers")->Value; m_list.SetItemText(row,3,temp); temp=(LPCSTR)(_bstr_t)m_record->GetFields()->GetItem("paymoney")->Value; m_list.SetItemText(row,4,temp); temp=(LPCSTR)(_bstr_t)m_mercRecord->GetFields()->GetItem("discount")->Value; m_list.SetItemText(row,5,temp); temp=(LPCSTR)(_bstr_t)m_record->GetFields()->GetItem("operid")->Value; m_list.SetItemText(row,6,temp); temp=(LPCSTR)(_bstr_t)m_record->GetFields()->GetItem("storid")->Value; m_list.SetItemText(row,7,temp); m_record->MoveNext(); row++; } CString?str; str.Format("找到了%d条记录",row); MessageBox(str);上面的代码主要实现了根据字段取对应数据的操作。当我自己在开发是关键函数GetFields()和GetItem()的使用方法。GetItem()中参数是待获取数据对应的字段名称。该界面还实现了商品的详细信息显示,本系统该把该功能封装成GetMerc()函数 。给列表控件添加LVN_ITEMCHANGED消息,响应鼠标单击列表的动作,在改消息函数中执行函数GetMerc。该函数的具体代码如下:CString?CINDETAIL::GetMerc(CString?sqlstr){ if(?m_mercRecord!=NULL) { m_mercRecord=NULL; m_mercRecord.CreateInstance(__uuidof(Recordset)); } for?(int?i=0;i?Open((_variant_t?)sqlstr,theApp.m_connection.GetInterfacePtr(), ????????????????adOpenDynamic,adLockOptimistic,adCmdText); CString?str[10],returnstr; str[0]="商品编号:"; str[1]="商品名称:"; str[2]="型号规格:"; str[3]="单位:?"; str[4]="进价:"; str[5]="供应商:"; str[6]="折扣:"; str[7]="入库编号:"; str[8]="入库类型:"; str[9]="备注:"; CString?temp; int?rows=0; int?a=GetRecordCount(m_mercRecord); for(int?j=0;jFields->GetItem((long)i)->Value; returnstr+=str[i]+temp+"
???"; } m_list2ctrl.InsertString(rows,returnstr); returnstr=""; rows++; m_mercRecord->MoveNext(); } UpdateData(false); return?returnstr;}入库汇总界面的实现入库汇总界面实现各种方式进行汇总,其中汇总选择组合框中提供无五种方式,这是设计的重点。该模块对应实现代码和登记入库界面的实现,操作结果和汇总结果是用函数ShowList2()封装实现的。本系统 中封装成函数GetAllNum()和GetAllMoney()来实现统计。另外,关于时间范围的查询,在前面有类似的SQL语句构造方法,此处不多介绍void?CINSTOCKMANGE::ShowList2(CString?sqlstr){ m_record->Close(); m_record->Open(_bstr_t(sqlstr),theApp.m_connection.GetInterfacePtr(), ???????????adOpenDynamic,adLockOptimistic,adCmdText); int?rows=0; m_list2.DeleteAllItems(); if(GetRecordCount(m_record)) { while(!m_record->_EOF) { for(int?i=0;i<8;i++) { CString?temp=(LPCSTR)(_bstr_t)m_record->Fields->GetItem(long(i))->Value; if(i==0) { m_list2.InsertItem(rows,temp); } else m_list2.SetItemText(rows,i,temp); } rows++; m_record->MoveNext(); } GetAllNum(sqlstr1); GetAllMoney(sqlstr2); } else { m_allnum="累计
数量:"; m_allmoney="累计
金额:"; m_allmoneyctrl.SetText(m_allmoney); m_allnumctrl.SetText(m_allnum); }}四、库存模块设计 超市销售商品肯定要考虑到利益自大话,当然只有降低进价才能有大的利润空间,而只有大批量采购才能有比较低的进价,那么什么时候采购和数量多少就必须有可靠的参考信息,困村管理就显得那么重要了。库存管理主要帮助企业及时了解商品存储信息,为采购人员提供参考数据,能保证商品供给充分,满足顾客需求。库存模块技术分析 实现库存模块功能比较容易,设计的知识点不是很多。商品名称和库存量复选框选中与否可通过GetCheck()函数判断获取。然后通过Format()函数构造查询语句,执行查询操作,查询结果显示在库存信息列表控件中。当时我制作的时候尝试把查询语句的构造封装成函数Justify()来实现。库存模块设计 开发库存模块具体功能前,首先要完成其界面的设计,然后再具体实现模块功能。下面先介绍主要界面的设计过程。插入对话框资源和其他各个控件,适当修改标题和ID号,布局好界面,最终库存界面如下图所示:图5.5库存模块库存界面的实现 上面我们主要完成了库存界面的设计,给各个控件分别添加消息函数及变量,编写功能代码,下面我将主要介绍如何实现构造查询语句函数的封装。函数Justify()具体的实现代码:CString?CSTOCKMANAGE::Justify(){ UpdateData();????CString?sqlstr; if((m_check1.GetCheck()==true)&&(m_check2.GetCheck()==true)) { MessageBox("请不要同时选择!"); return?""; } else?if((m_check1.GetCheck()==false)&&(m_check2.GetCheck()==true)) { if(m_mercid==""){MessageBox("请输入要查询的条件");return?"";} sqlstr.Format("select?a.mercid,b.mercname,b.inprice,a.downlimit,a.uplimit,a.nowvalues?from?tb_storemanage?a?inner?join?tb_merchangiseinfo b?on?a.mercid=b.id?where?a.mercid=%s",m_mercid); } else?if((m_check1.GetCheck()==true)&&(m_check2.GetCheck()==false)) { sqlstr.Format("select?a.mercid,b.mercname,b.inprice,a.downlimit,a.uplimit,a.nowvalues?from?tb_storemanage?a?inner?join?tb_merchangiseinfo b?on?a.mercid=b.id?where?a.downlimit>=%.2f?and?a.uplimit<=%.2f",m_min,m_max); } else { MessageBox("请输入要查询的条件"); return?""; }从上面的代码可以看出该函数的返回值是字符串类型,返回的就是构造后的SQL语句。还有判断用户查询选择的条件。具体是根据函数GetCheck()返回的值判断是否选中。实现根据商品名称查询库存信息的SQL语句构造。其中还实现了库存上、下限查询库存信息的SQL语句。五、后台模块设计 后台管理模块是管理系统常见的模块,该模块主要是为了系统管理员或部门主管人员设计的,抓药是处理用户的添加、注销、密码和权限的修改、数据库的备份、还原及商品售后服务、退货等问题。这些操作都要设计数据的安全性问题,因此,在进行相关操作时都需要有相关权限才能够完成。后台模块功能设计 后台管理非常重要,所以在设计时要求只有特定于欧诺个户才能使用,在数据处理方面还实现数据库的备份和还原功能。另外,对用户管理方面,实现了添加用户、注销用户修改用户信息及删除用户等各种常见的管理操作。同时,对于销售后服务及商品退货也放在此模块。后台模块技术分析 本模块中比较重要的一个子模块就是实现用户的各种操作,几乎使用了各种SQL语句来实现功能模块。本系统中添加用户的操作比较简单,并且容易实现,增加了密码验证功能。删除用户操作比较麻烦,因为要删除用户不能直接获取到。修改密码操作和添加一样,不仅要验证还原密码,对更改的密码也需要验证。另一个设计重点是数据库的备份、还原的实现,当然主要还是通过SQL语句的执行来实现的,在设计时分开处理。数据库备份语句比较容易,但还原实现起来比较麻烦,需要先断开原链接,通过链接master数据库后再执行还原语句。退货模块实现比较烦琐,退货前先检查销售单,具体可根据商品编码】销售时间来找到该销售单,完成退货操作后,本系统在设计时彩球保留该条销售信息,在备注里显示“该商品已退货”,这样保证退货信息能够查询。后台模块的设计图5.6后台管理模块销售单退货界面的实现 上面主要完成了界面的设计,同样先给各控件添加消息函数及变量,下面是实现的主要代码,首先介绍如何实现销售退货功能。【退货】按钮消息函数的实现代码如下:?????int?i=m_list3.GetItemCount(); ??CString?sqlstr1,sqlstr,sqlstr2,sqlstr3; ??sqlstr1="update?tb_sale?set?quitinfo=该商品已退货%s??where?buyid=%s"; ??sqlstr2="update?tb_sale?set?quitnum=%s??where?buyid=%s";??????for(int?j=0;j_EOF) { CString?str?=?((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("opername")); str.TrimRight(); if(str==m_id) { AfxMessageBox("该用户名已存在!
请重新选择新用户进行注册!"); m_id=m_name=m_pass=m_passr=""; ????UpdateData(false); return; } m_pRecordset->MoveNext(); } if(m_pass==m_passr) { CString?str,str2; _variant_t?va; str.Format("insert?into?tb_operator?values(%s,%s,%s,%s)",m_id,m_name,m_pass,tempstr); m_pRecordset?=m_pConnection->Execute(_bstr_t(str),&va,adCmdText); AfxMessageBox("添加成功!!"); m_id=m_name=m_pass=m_passr=""; UpdateData(false); ShowData(); } else { AfxMessageBox("对不起!确认密码不正确!
请您重新输入!"); m_passr=""; UpdateData(false); return; } } else? { AfxMessageBox("请输入正确的用户名!"); return; }上面的代码主要实现了对用户权限的组合框中权限的获取,判断数据表中是否有待注册新用户的id,吐过有,则不允许再重复注册。实现判断两次输入的密码是否一致,即密码验证,如果不一致,则终止注册。同时会在列表框中完成用户的更新显示的。其中利用ShowData()封装完成列表框中用户的更新显示。该函数代码参考如下:void?SYSDLG::ShowData(){ _variant_t?va; m_pRecordset?=m_pConnection->Execute("select?*?from?tb_operator?order?by?operid",&va,adCmdText); for(int?i=m_list.GetCount();i>=0;i--) m_list.DeleteString(i); int?k=0; while(!m_pRecordset->_EOF) {? CString?str1?=?((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("opername")); CString?str2?=?((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("operlevel")); str1.TrimRight(); str2.TrimRight(); m_list.InsertString(k,str1+"["+str2+"]"); k++; m_pRecordset->MoveNext(); }}其中实现了打开用户信息表,实现列表框数据显示,显示样式为“用户名+权限”。当用户选中列表框某一行记录后,单击【注销用户】按钮,可实现该用户的删除操作。按钮实现代码如下:if(m_list.GetCurSel()==-1) { AfxMessageBox("请选择要删除的记录!"); return; } else { if(MessageBox("确定要删除吗?","提醒!",MB_YESNO)==IDYES) { CString?tempstr; _variant_t?va; m_list.GetText(m_list.GetCurSel(),tempstr); CString?temp=tempstr.Left(tempstr.GetLength()-8); CString?str; str.Format("delete?from?tb_operator?where?opername?like?%s%%",temp); m_pRecordset?=m_pConnection->Execute(_bstr_t(str),&va,adCmdText); AfxMessageBox("删除成功!!"); ShowData(); } else return;其中实现了判断用户是否选中列表框,GetCurSel()返回值为-1表示没有选中记录。代码实现提醒对话框显示,让用户确认删除,还实现了根据用户来删除用户。其中,利用ShowData()实现列表框中用户的更新显示。用户选中列表框莫一行记录后,输入原密码、新密码及确认密码也可以实现修改密码。实现代码如下:UpdateData(); CString?tempstr; CString?temp; CString?oldpass; if(m_list.GetCurSel()==-1) { MessageBox("请选择要修改的记录!"); return; } else { m_list.GetText(m_list.GetCurSel(),tempstr); temp=tempstr.Left(tempstr.GetLength()-8); _variant_t?va; m_pRecordset?=m_pConnection->Execute("select?*?from?tb_operator?order?by?opername",&va,adCmdText); while(!m_pRecordset->_EOF) { CString?str1?=?((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("opername")); CString?str2?=?((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("operlevel")); str1.TrimRight(); str2.TrimRight(); if(str1==temp) { UpdateData(); oldpass?=?((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("operpassword")); oldpass.TrimRight(); UpdateData(false); break; } m_pRecordset->MoveNext(); }代码实现获取列表框中被选中记录的用户名。实现方法是把获取的整个字符串去掉用户后面的“【”、“管理员”“收银员”“】”代码实现用户的原密码的获取。数据库备份界面的实现图5.6数据库备份界面备份界面允许用户改变路径来保存备份文件。改变路径按钮实现代码如下:????CFileDialog?cfile(FALSE,"org",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "备份文件(*.bak)|*.bak|All?Files?(*.*)|*.*||"); if(cfile.DoModal()==IDOK) { ???CString?str;? ???str=cfile.GetPathName(); ???????if(str!="")?????????m_edit=str; ???UpdateData(false); }????else?return;备上面代码实现了打开对话框的信息的设置,默认打开扩展名为.bat的文件,也可以选择显示所有文件,如果不选择则默认为“f:\huchao.bat”。设置好路径和备份名,单击【备份】按钮执行备份,悲痛实现了保存多个备份文件的功能,代码中 if(MessageBox("确定备份?","系统提示",MB_ICONQUESTION|MB_YESNO)==6) { ???CString?sqlstr;???????if(m_edit) ???{??try ???{ ???sqlstr.Format("select?Max(id)?as?maxid?from?tb_backup"); ???_RecordsetPtr?rs=NULL; ???rs.CreateInstance(__uuidof(Recordset)); ???rs->Open((_variant_t?)sqlstr,m_connection.GetInterfacePtr(), ?????????adOpenDynamic,adLockOptimistic,adCmdText); ???CString?a=(LPCSTR)(_bstr_t)rs->Fields->GetItem("maxid")->Value; ???int?b=atoi(a); ???b++; ???sqlstr.Format("insert?into?tb_backup?values?(%d,%s,%s)",b, ?????????????CTime::GetCurrentTime().Format("%Y-%m-%d"),m_edit); ???rs=NULL; ???rs.CreateInstance(__uuidof(Recordset)); ???rs->Open((_variant_t?)sqlstr,m_connection.GetInterfacePtr(), ????????adOpenDynamic,adLockOptimistic,adCmdText); ???sqlstr.Format("backup?database?Sales?to?disk=%s",m_edit); ???m_connection->Execute((_bstr_t)sqlstr,NULL,adCmdUnknown);???????????????MessageBox("备份成功!"); ???m_connection->Close(); ??? ???CDialog::OnOK(); ???} ???catch(...) ???{ ???MessageBox("备份失败!"); ???return; ???}图5.7还原模块界面还原模块实现起来要比备份复杂些。主要是因为还原的时候要断开连接,否则是不允许还原的。还原界面中选择路径和备份是一样的,再次不在重复说明。首先介绍如何在列表控件中显示所有备份文件,相关代码如下:void?CRESTOREDLG::SetListStyle(){????m_list.InsertColumn(0,"序号",LVCFMT_LEFT,100); m_list.InsertColumn(1,"时间",LVCFMT_LEFT,140); m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);????m_record=NULL; m_record.CreateInstance(__uuidof(Recordset)); CString?sqlstr; sqlstr.Format("select?*?from?tb_backup"); m_record->Open((_variant_t?)sqlstr,theApp.m_connection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); try { int?i=0; while(!m_record->_EOF) { CString?str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem("id")->Value; // m_list.InsertItem(i,str); COleDateTime?tm; tm=(COleDateTime)m_record->Fields->GetItem("backuptime")->Value; //????m_list.SetItemText(i,1,tm.Format("%Y-%m-%d-%H:%M:%S")); i++; m_record->MoveNext(); }至此,所有模块设计均已介绍完毕,读者在具体设计时可参考光盘中本章详细代码,对那些控件的变量要添加及其类型和相关的消息函数都要认真搞清楚才能顺利进行。第六章 系统测试 超市管理系统完成后,各模块与数据库的连接能够正常的工作,接口数据传输良好,符合当初的设计要求。超市管理的登陆界面如图:图6.1登陆界面出现登陆界面时,用户可以根据id号和密码进行登陆,很好的与数据库进行了连接。经过测试登陆成功。如果是普通的员工,输入id:01 密码:123时出现的销售界面,如下图所示:图6.2前台销售界面如果员工输入编号是,上面的List列表会自动的显示商品的详细信息,而且会随着下面编号的输入和数量的更新而更新,出现在累计金额一栏中,显示出总的金额,当输入实付金额时,在现在的找回金额一栏,直接回呈现应该找的金额数。而且但员工输入编号是,可以点击商品查询按钮,下面会呈现商品的具体信息,包括数量、折扣等信息。还可以选中上面的List列表的里的商品,可以点击删除商品来删除购物车里的商品。员工如果要退出收银的话,还要输入自己的ID号和密码,才能顺利的退出。如果操作员是管理员的话,例如输入的ID号:1 密码是:123.则进入的界面是如下图所示:图6.3后台管理界面这部分主要包括了管理员的一些权限,主要有前台管理,出入库管理,销售管理和后台管理。如果点击了出入库管理,里面会呈现登记的入库管理界面,里面会自动生成入库编号,入库时间等信息的录入。经过检测这部分完全的能够正确的操作。图6.4入出库管理界面如果点击入库单查询,则出现如下的界面,可以根据查询的条件:操作员、入库编号等查询,利用列表控件进行信息的显示:图6.5入库单管理界面下面主要测试的退货功能的实现:图6.5销售单管理界面如果在前台的销售模块,操作员点击了确认付款了之后,就会在后台的销售单号、操作员、数量、备注。如果管理员在销售单编:输入单编号,可以点击编号查询,在下面的List列表中,可以显示销售单的详细信息。如果管理点击系统管理,这个主要是对操作员的管理,在相应的位置填上ID号,用户名称,密码之后,单击添加用户之后,在列表之中马山会显示相应的员工或者管理员。图6.6系统管理界面第七章 结束语在计算迅速发展的今天,我们生活的每个角落都充满着计算机的身影,信息产业的兴起,各行各业几乎都与计算机有着密切的关系,实现了不同程度的自动化。在我们的生活中周围有着大量的超市、便利店等,这些企业若想有这很大的发展,必须拥有自己一套完整的管理系统,而超市管理系统正是这样的一个系统,它可以提升商品化的信息程度,减轻管理人员的整理、统计商品负担,及时获取商品销售数据和库存数据,并同时提高效率和公司利益最大化。下面我想总结一下知识点:该系统的开发已经全部的介绍完毕,在整个的开发过程中用了许多开发技巧和重要知识点。下面将对这些技巧及知识点进行简单介绍:分割试图的丝线:通过分割视图可以把界面按自己的需要合理布局。各个功能模块之间既可以独立处理模块功能又能互相传递数据。本系统实现静态分割,主要通过添加CMainFrame::OnCreateClient()消息函数实现的。列表控件的应用:在本系统中,使用了大量的列表控件来显示数据库中的记录,这样使界面结构更加的清晰、操作简单。因此比较收客户的欢迎。Tab空间的应用:在本系统的实际开发中,经常需要在一个框架中显示各个界面的数据,这时就需要Tab控件。其主要可以把各个界面整合显示在一个界面上,这样界面设计紧凑整齐,模块清晰,也实现了代码的简化。扩展窗口的设计:本系统在设计显示查询的详细信息界面时采用弹出扩展窗口方式实现。具体是通过在窗口中放置一个Picture控件,当窗口在改变时,只是右下角的纵坐标改变,而改变后的纵坐标是Picture控件的纵坐标,可以欧诺个过获得对话框和Picture控件的矩形区域来收缩对话框。这样设计使界面更加的紧凑,界面控件布局清晰、合理。提高键盘易用性:所谓键盘易用性,一般是指在需要输入很多不同信息的界面中当一种信息输入完成后,按【Enter】键,输入焦点自动跳转到下一个要输入信息的控件。为了提高工作效率,提高键盘易用性十分必要。在本系统中就实现了这样人性化的功能。备份文件信息存储:本系统设计了数据表专门来存储备份信息,这样设计可以让用户根据需要选择文件来还原,设计更人性化。参考文献[1] 胡超 闫玉宝编著 《亮剑Visual C++项目开发案例导航》 电子工业出版社[2] 张海藩 编著 《软件工程导论(第五版)》 清华大学出版社[3] 祝明慧 车玉生等编著 《Visual C++从入门到精通》 机械工业出版社[4] 郑慧 范忠诚 等编著 《零基础学Visual C++》 机械工业出版社[5] 胡超 闫玉宝 编著 《由浅入深Visual C++》 电子工业出版社 [6] 刘荷花 陈信明 主编 《Visual C++程序设计》 吉林电子出版社[7] David M.Kroenke David J.Auer 著 姜玲玲 冯飞译《数据库原理》(第三版)清华大学出版社致 谢在本文完成之际,谨向给予我指导、关系、支持和帮助的各位老师、同学及清幽之一衷心的感谢!首先我要感谢我的毕业设计的指导老师张福涛老师,他是一位值得尊敬的老师,学识渊博,一直严格地要求我们,同时也以一种更高的标准来要求自己,作为出国访问学者的他,有着一种宽阔的眼光,看待问题都是以一种很独特角度来给我们分析。在我的整个毕业设计的过程中,他从选题、设计、学习、论文的改写、定稿的各个阶段都给了我很大的帮助,让我很感动,也让我受益匪浅。再次我向我的导师张福涛老师由衷的感谢。接下里我要感谢我大学四年来,让我成长的专业老师们:在我刚刚步入大学的时候是刘景老师给我们上的《计算机导论》和《C++程序设计》的课程,他开启了我的的计算机生涯,培养了我的兴趣,让我深深的爱上了计算机这个专业,我决定全身心的投入到其中,我非常感谢刘景老师,我的启蒙导师。还有陈正鸣老师,他是我们专业领军的任务,在他身上学到了很多东西,他给我们上的课程是《图形学》,毕业于浙江大学的他上课诙谐幽默,但是也是很严格的,精益求精,一丝不苟的教学态度深深感染了我们,而且他的上课教材是全英文的,对我的阅读外文文献的能力有了很大的提高,最后的课程设计也是让我们学习了图形填充算法,让我们的编程能力有了很大的提高。还有陈慧萍、牟燕、丁海军等老师,在大学期间都给予了我很大帮助,我也非常的感谢他们。最后我感谢我的父母,这么多年对我的养育之恩,我也会努力的奋斗,拼搏出自己的一片天地。最后由衷的感谢帮助过我的人和爱我的人!
【KEY WORDS】MFC ADO Controls Management system目 录
*好棒文|www.hbsrm.com +Q: ^351916072*
article is "the supermarket management system", implement the management of the supermarket business daily.This article first introduced some basic knowledge of MFC, and now used in some mainstream database approach, and then I use the MFC interface programming, database using ADO connection of SQL SERVER.Both are very mature technology, there are some special control in MFC to display the data in the database, and has a good visual.In the database operation approach to design the structure of the complex SQL statements, list control, the Tab control and the use of the tree control.Then I introduced the system development background, then introduces the design of system analysis and design, each module key technical difficulties and solutions, design thought, finally summarized the development process of this system.Through unremitting efforts to realize the front desk management, registration of put in storage, query the bill, outbound query, sales management, inventory management and so on a series of functions, good finish the task.第一章 绪论 1一、选题背景 1二、可行性分析 2三、本文主要工作及结构 3第二章 相关技术综述 4一、MFC基础及深入理解 4(一)MFC基础 4(二)深入学习MFC 4二、数据库开发技术 5(一)ODBC 5(一) ADO 5第三章 系统需求分析 6一、功能需求 6(一)需求分析: 6(二)系统目标: 6(三)功能需求列表 8二、数据需求 9三、性能需求 10(一)响应时间需求 10(二)稳定性需求 10(三)适应性需求 10第四章 概要设计 11一、系统总体设计 11二、模块设计 12(一) 超市管理系统前后台设计与简单描述 12三、数据库设计 13(一)数据库分析 13(二) 管理系统E-R图 13(三)数据库、表的设计 15四、方案选择 18第五章 详细设计与实现 19一、用户登陆模块的实现 20二、前台销售模块设计 22三、入/出库模块设计 27四、库存模块设计 36五、后台模块设计 38第六章 系统测试 46第七章 结束语 50参考文献 51致 谢 52第一章 绪论本章介绍了管理系统的普及,很好的提高员工的办事效率,管理人员的组织能力,同时提出超市管理系统的提出背景和优势。接下来还介绍了超市超市管理系统的总体框架结构,并对本文的主要工作和结构做了交代。一、选题背景1.信息化的普及随着中国经济的发展,信息化已然成为我们追求的目标,信息化是以现代通信、网络、数据库技术为基础,对所研究对象各要素汇总至数据库,供特定人群生活、工作、学习、辅助决策等和人类息息相关的各种行为相结合的一种技术。同时管理系统正是提供了一种方式,它可以把信息进行整合,给人一种更好的决策空间,使人更有效率的工作,这将是以后发展不可或缺的一种方式,我们的生活信息这么多,必须要有一种管理系统,使之有条不紊的,所以信息化是目标,但是管理系统就成为了一种途径。2.超市管理系统提出背景随着计算机应用的不断深入,信息产业的兴起,各行各业几乎都与计算机有密切的联系,实现了不同程度的自动化操作,而且最近李克强总理提出互联网+的模式,这也突出计算机的重要性,促进我们加强对计算机的学习。而在我们生活的周围出现了大量的超市、便利店、专卖店等,如果他们要想在现在的现实中立足,必须提高自己的效率,必须自己拥有一套完善的并和自己自身特点的管理系统。而超市管理正是一个为解决当前超市商品普遍具有种类繁多、数量大、管理人员杂等特点而设计开发的软件系统。同时现在存在的一些管理系统都很枯燥,而且不能满足大多数超市的需求,系统开发的目的在于提升商品的信息化程度,减轻管理人员的整理、统计商品的负担,及时获取商品销售数据和库存书库,并同时提高管理效率和公司利益的最大化。同时我们作为现在程序员也有必要做出这样的软件,为广大超市管理人员服务。二、可行性分析为了便于管理层对技术和资金的投入进行决策,需要弟弟项目的可行程度进行分析,其中主要包括技术可行性、经济可行性、操作可行性、运营可行性等。1引言改革开放以来,我国发的各行隔夜得到了很好的发展。随着各种超市遍地课件,超市管理成为很重要的环节。随着我们经济的快速发展,超市页面临着数据和业务越来越大的现状,那么如何充分利用计算机来实现超市庞大商品、人员信息的控制和传输,从而方面销售行业的管理和决策,就成为了一个日益重要的课题。因此,开发这样的一套管理软件成为很有必要的事情。超市管理系统应该能够为用户提供充足的信息和快捷的销售、查询手段。根据超市管理的实际情况,设计的销售管理、入库统计、库存管理、系统管理等几个模块,实现了超市中商品的进货、销售、库存等管理的系统化、规范化和自动化。2技术可行性研究改系统界面友好,功能操作简单,在新系统投入使用时,只要对用户进行简单的说明,就可以很容易的操作该系统。该系统可以采用VS2010 和 SQL SERVER 数据库来完成,以前很多程序员很多开发过很多这样的项目,完全可以在要求时间内完成该系统的开发。3经济可行性研究经济可行性可以从项目提出者和项目开发者两个方面来说明。从项目提出者方面来说,超市企业使用该系统可以节约很多人力和物力,方便管理,由此可以见着不必要的开支。同时该系统可以提高企业的销售效率,即提高了企业的经济效益,所以从经济上是完全可以的。管理系统是一个信息化、智能化和先进管理理念的集合体。而管理是一个动态过程,在其运行过程中要采取多项措施。所以在管理中获得经济效益是一个综合效益,要对它进行直接定量的分析是比较的困难的。一般,新系统带来的经济效益是间接的,其最重要的表现就是减少了企业的管理费用和人力开支。所以这方面也是完全可以接受的。4操作可行性本系统采用大家熟悉的Windows操作系统,具有一般的计算机知识的人员都可以轻松上手。而且整个销售系统采用友好的交互界面,简洁明了,不需要对数据库非常了解也可以熟练操作。5结论根据上述分析,项目开发我认为此项目结构清晰,功能合理,而且使用现有技术能够进行开发,并可实现客户要求的全部功能。由于这是一个中小型系统,开发时间完全充裕,无论在技术上、经济上,还是操作上,该系统具有很高的开发可行性。三、本文主要工作及结构1.本文所完成的超市管理系统,功能包括:(1)前台管理,主要负责商品的交易(2)入库管理,主要登记入库,入库单查询,入库单明细,登记出库等(3)出库管理,类似于入库管理(4)销售管理,主要有销售记录查询,退货管理2.解决的技术难点包括:(1)在VS2010下于数据库的连接SQL SERVER2008(2)利用控件来显示从数据库中选出的数据进行显示(3)深刻了解MFC中消息处理机制第二章 相关技术综述 本章对超市管理系统所涉及的观念及使用到的技术做了很详细的介绍,主要内容包括MFC的概念及发展现状,数据库的开发技术简介,在MFC中列表控件、Tab控件及树形控件的使用方法。MFC基础及深入理解1.MFC基础在我们学习了C++的基础;语法理论之后,我们以前都是利用MS-DOS的方式进行练习编程的能力,但是我们以后更多的需要开发项目来实现可视化的编程,而Windows程序设计,与这种MS-DOS的编程截然不同。Windows程序设计和MS-DOS程序有者很大的区别,不仅仅在界面方面,还有在消息的处理机制上也有很大的区别,因为Windows程序设计是消息驱动的。在MFC中有一个很重要的视图,所谓的视图就是所谓的一个“窗口”它具有Windows应用窗口的一般特性,及用户可以通过其执行缩放、打开或关闭、移动、最小化和最大化等操作。实际上,MFC程序中的视图就是MFC类库汇总的CView或CView类的派生类创建的一个对象。2.深入学习MFC在学习了MFC的视图类之后,Windows应用软件的其中有很大的、很有特点的:不仅是有内容丰富的界面和很多函数接口之外,还在于这些内容丰富的界面有统一的标准,使之开发起来很容易,而且,让用户在熟悉Windows操作系统应用的前提下,很容易触类旁通地快速熟练使用其他应用软件。在学习了试图类之后,视图类对应的是视图窗口,而这并不是唯一的窗口,还有其他窗口。视图窗口是嵌套在主框架窗口(MainFrm.h)中的一个“子窗口”。主框架窗口包含着很多的东西,主要有包含标题栏和菜单栏,而各种各样的子窗口也包含很多东西,其中最主要的是又包括工具栏窗口、状态栏窗口和视图窗口, 是整个主框架窗口的主要部分。二、数据库开发技术1.ODBCODBC是开放数据库互连。一个要有数据开开发的项目,它可以不一览任何数据库(DBMS),不直接和数据库打交道,所有的操作都是用驱动来完成,也就是不管是什么数据库来靠函数的接口(API)来进行访问,而API是相对固定的,因此大大缩短了使用ODBC进行数据库研发的学习周期。ODBC是Visual 2010 继承开发环境中较为常用的数据连接方式,应用程序想到为每个数据库的表生成一个Set类,通过Set类对象来进行数据的访问。2.ADO 虽然我们的开发工具visual 2010 没有提供很好的应用程序的向导,但是我自己通过学习之后,很好的掌握了这种数据库开发的学习,其实ADO就是一个COM组件作为应用程序和数据仓库的中间层,如果从方便性和容易性而言,它不必任何技术要来的麻烦。ADO主要包括三个基本接口:_ConnectionPtr接口:返回一个记录集指针或一个空指针。通常使用他来创建一个数据连接或执行一个记录集不是一个好的使用方法。使用它会创建一个数据连接,然后,在使用其他对象执行数据输入输出操作。_ConmandPtr接口:这个接口是返回一个记录集,它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用该借口时,可以利用全局接口,也可以在_ConmandPtr接口里直接使用连接串。_RecordsetPtr接口:此接口是一个记录集对象。但是提供了更多的控制功能,如记录锁定、游标控制等。第三章 系统需求分析 本章的重点是弄清系统的需求,通过业务流程图描述系统的具体操作流程,通过功能列表分析系统的具体功能要点。在数据需求部分,通过对系统中存在的数据进行分析,合理设置每一类数据的数据类型,以满足系统需求。在性能需求部分,对系统的响应时间、稳定性及适应性做了简介。一、功能需求1.需求分析:通过市场的调查,针对现在各中,小型超市对经营业务和人事管理的实际需要及超市的特点,开发出本系统帮助超市解决现在面临的问题,提高超市的竞争力。数据库应用系统的开发应按照软件工程的开发方法进行分析、设计、编程和调试。如下图所表示为数据库应用系统的开发过程。需求分析包括对数据本身的需求分析和对功能的需求分析。两个分析的结果将分别作为数据库设计和程序设计的依据。本系统为超市管理系统,主要包括前台收银、库存、后台管理等。其中后台管理有可分为退货管理、用户管理、数据管理、数据维护等。库存管理又分为入库管理和出库管理。而入库管理和出库管理可分为登记入库,入库明细和登记出库,出库管理。当收银员登陆该系统是只能进行前台的收银管理,而不能进行后台各项管理,而当收银员出售商品时发现库存不够时,要立即通知经理进行进货管理。管理员可对系统进行各种操作。2.系统目标:系统要采用C/S结构模式,千团开发工具采用目前比较流行的VS2010,后台数据库系统采用大型数据库2008,系统运行平台为Windows。开发的系统进,销,存,查询为一体,并提供方便快捷操作界面,实现从报表到库存,方便管理者充分、准确、有效地了解经营状况,及时提供准确的统计数据、分析报告和更加深入的数据分析、预测,帮助管理者紧密地把握企业的动态,实行更科学的管理。下图是业务流程图: 图3-1 业务流程图如流程图所示,用户首先登陆超市管理系统,系统会对用户的登陆星系进行检查,如果出错的话,提示没有该用户,之后判断操作员的权限。如果该用户是普通的操作者,则他直接进入普通操作员的界面,进行扫描商品,取消交易,删除账单中的商品,结账等功能。如果该用户是管理员,他进入管理员的界面,里面的操作有入库,出库账单查询等操作,添加数据库里的商品等信息,录用的包括商品的详细信息,例如进价,售价和厂家的详细等。在普通操作员和管理员都进行的操作之后,系统都会自动更新数据库里的数据。3.功能需求列表根据业务需求,超市管理系统应该具备的功能包括:前台销售,后台的管理(登记入库,入库单查询,库存管理,销售管理)等功能。这些功能的详细描述见表3-1。表3-1 功能需求列表编号功能名称功能说明1登录操作员输入ID和密码,按“确定”进行登录。如果ID或密码错误,则系统会提示“没有该用户”,然后重新输入。找到满足条件的记录后根据身份进行不同的操作界面。收银员用户登陆后,对主框架进行隐藏,只显示前台的销售界面,这样用户只能操作此界面。2前台销售根据登陆账号权限不同,会显示不同的系统界面。如果是普通用户,则显示【前台管理】对话框。收银员通过该界面对交易商品进行管理。输入商品编号后,在【已购商品列表】中会显示顾客所购商品的详细信息。如果顾客想放弃某个商品,可单击【删除商品】或【取消交易】按钮。如果收银员下班可以通过【换收银员】按钮换班3登记入库如果是管理员或部门主管用户登录后会进入系统主界面,在该界面中单击【登记入库】按钮,进入【登记入库】选项卡,单击【登记入库】按钮,显示入库信息,在单击【新增】按钮,显示扩展窗口。在其中输入各项信息,在单击【入库确定】按钮,如果输入信息无误,在列表控件中显示添加完的信息。4入库明细在主界面上单击【入库明细】按钮,进入入库明细选项卡,选中【查询条件】复选框,输入操作员编号,或设定时间范围,单击【查询】按钮。如果输入信息无误,用户就可以在列表控件中看到满足条件的信息。选中该条记录,还可以在扩展窗口编辑框中显示该条记录相关的更详细的信息。5入库汇总在【入库情况汇总】选项卡中,可以通过各种方式进行汇总。在【汇总选择】下拉列表框中选择【年汇总】选项,或设定时间范围来汇总。单击【汇总】按钮,就可以在【操作结果】列表框中看到满足条件的信息,在【汇总情况】区域会显示入库汇总的数量。6出库管理在主界面菜单栏上选择【出库管理】命令,弹出【当前库存信息】窗口,在其中输入商品名称并设定最高,最低值后,单击【查询】按钮,如果输入信息无误,则可以在列表控件中看到满足条件的信息。7后台管理在主界面菜单栏上选择【后台管理】菜单,该菜单有2个子菜单:销售退货,用户管理。选择【销售退货】弹出【退货单】对话框,通过该对话框额可以帮顾客完成商品退货且更新销售信息;如果选择【用户管理】弹出【增加用户】的对话框,可以增加普通操作员和管理员。8系统管理用户管理模块主要实现各种权限用户的添加,注销,密码就权限的修改操作,但是操作者必须有管理员权限。二、数据需求在整个数据库的开发中药设计7个表单的操作,具体的数据需求见表3-2。表3-2 数据需求列表序号信息数据项数据描述数据类型1销售表交易号顾客消费之后产生表单字符串型(长约30位)商品号顾客所购买东西的编号字符串型(长约30位)数量顾客所购买东西的数量浮点型操作员号收银员的编码ID字符串型(长约50位)退货信息顾客要退货之后生成表字符串型(长约50位)退货数量顾客所退商品的数量浮点型2供应商供应商号用于标示供应商的编号字符串型姓名供应商的名称字符串型电话供应商的电话字符串型地址供应商字符型3商品表编号用于标示不同的商品字符串型商品名商品的名称字符串型特殊说明用于对产品的描述字符串型单位商品的出场单位字符串型进价商品进货时的价格字符串型售价商品出售时的价格浮点型折扣商品出售时的折扣浮点型数量仓库中商品的数量浮点型4库存信息库存号用于记录商品存放的仓库字符串型商品号用于记录商品的编号字符串型入库日期用于记录商品入库的时间时间类型类型用于记录商品的类型字符串型供应商号用于记录生产商品的厂家字符串型库存信息用于描述存放商品的仓库字符串型操作员号用于记录收银员的编号字符串型库存标志用于记录存放商品的仓库字符串型单价记录商品的单价Money数量记录商品在仓库的总数量浮点型总金额记录账单的总金额Money5库存管理商品号用于记录进入仓库的商品字符串型上限用于记录仓库最多的商品数浮点型下限用于记录仓库最低商品数浮点型当前数量记录仓库当前商品的数量浮点型6操作员操作员号用于标示操作员字符串型姓名用于标示操作员的姓名字符串型密码操作员自己设置的密码字符串型权限用于标志是否为管理员权限字符串型7数据库的备份还原备份号用于标志备好数据库号码整型备份时间用于记录备份的时间Datetime备份路径用于记录备份数据库的路径字符串型三、性能需求1.响应时间需求因为本系统是面向广大的超市管理员和收银员,所以当收银员收款时,必须要有足够快的响应时间,不能让顾客等待的时间太久,所以必须加强软件本身的计算能力,当商品加入购物单或从购物单删除时必须快速的算出总金额。其中最为关键的技术是与数据库之间的交流,软件必须很快的读出仓库是否有货或者价格的修改。所以算法要高效,提高运行速度。2.稳定性需求由于超市管理系统每天都要使用,而且每时每刻都在进行金钱的交易,所以必须要有很高的稳定,在每次打开和关闭的时候,必须要有数据库的备份,以免以前的数据的丢失,从而造成巨大的损失。3.适应性需求因为本系统要保证软件的简单、易使用性,在不同的电脑上都能正常的使用,适合普遍有计算机知识的操作人群。因为本系统是采用MFC的界面设计,使用的VS开发环境,所以在正常版本的Windows的操作系统都能使用。第四章 概要设计本章先介绍了超市管理系统整体的框架结构,对各部分做了简单的描述。然后从系统的顶层的模块开始,逐一介绍各个模块内部数据的具体传输。接下来,介绍了数据的设计情况,对数据库的每张表都做了详细的设计和较少,最后分析了系统开发是的要点,确定了需要使用的技术和开发工具。一、系统总体设计超市管理系统一共分为前台管理和后台操作。前台管理的操作员主要是收银员,其中包括在已购买商品单中添加商品,删除商品,取消交易,商品查询,换收银员,退出收银模块。后台主要是入库,库存销售管理等,超市管理系统的总体框架如下图:图4-1总体框架图二、模块设计本系统所有的操作可以分为主要两个模块,主要采用C/S的设计模式,主要是前台管理和后台的管理,前台主要是销售的界面,主要是一个界面;而后台相对比较包括出入库管理,库存管理和销售管理,系统管理模块。几个模块之间有着很大的联系,前台管理的模块相对较少,但是是整个系统设计的开始,所以有着举足轻重的作用。1.超市管理系统前后台设计与简单描述(1)登陆模块功能分析:登陆模块的功能主要是获取登陆者身份者的身份和验证密码的正确性,对收银员用户和管理员以外的用户进行限制登陆。淡然,用户成功登陆后要根据登陆者的身份不同,分别进入相应的操作界面,完成对应的界面初始化。结合需求分析可知,此模块实现的功能为:身份确定、密码验证、界面隐藏和显示。(2)前台销售销售模块功能分析:前台销售是顾客结账和收银员操作所涉及的主要界面,该模块的功能主要是让收银员方便对交易商品进行管理,统计、结账及相关的付诸功能,同时,也可以让顾客及时了解所购商品的详细信息。结合需求分析可知,此模块实现为商品买扫描输入、商品信息显示、商品价格汇总、屏幕锁定、收银员换班、结账找零等。(3)入/出库模块功能分析:入出库模块功能主要是让部门管理员方便对商品进行库存和入库管理,统计、利润分析及相关的辅助功能操作,也可以通过各种方式查询入出库明细信息。结合需求分析可知,此模块实现功能为登记入库、入库单查询、入库明细、登记出库、出库单查询、出库明细、出库汇总和出库汇总等。(4)库存模块设计:通过需求分析,库存管理界面实现的功能不是很多,主要是给采购人员采购商品及采购量功能参考。在设置库存量上、下限时有两种方式来实现。主要实现能更具商品名称或库存量进行设置、查询,对达到库存量下限的商品给出提示,提醒管理员要准备改商品的采购,也可根据库存报警下限主动查询商品。(5)后台模块功能分析:后台管理非常重要,所以在设计是要求只有对特定用户才能使用,在数据处理方面还实现了数据库的备份和还原功能。另外,对用户管理方面,实现了添加用户、注销用户、修改用户信息及删除用户等各种常见的管理操作。同时,对于销售后的服务及商品退货也放在此模块。三、数据库设计 数据库作为系统的基础,首先要保证其设计的合理性。在使用应用系统时,拥有设计合理的数据库往往可以起到事半功倍的效果。数据库设计设计多门学科的综合性技术,要求设计人员除了具备计算机科学的基础知识之外,还必须掌握程序设计的技巧和方法,具备数据库的基本知识和数据库设计技术,才能设计出符合具体应用领域要求的数据应用体统,目前数据库设计有两种不同的方法,即面向数据和面向过程设计方法。前者是以信息需求为主,兼顾处理需求,后者以处理需求为主,兼顾信息需求。数据库分析由于系统规模比较大,对数据库的性能要求高,故采用SQL Server 2008作为系统开发的数据库管理系统。SQL Server 2008能提供超大型系统所需的数据库服务,支持事务操作,这对数据的完整性有了很好的保障。作为一个超市管理系统,昨日的而销售及商品的出入库等情况对于超市来说都是非常的重要的,数据库管理系统解决了企业商品的进、销、存、退、换等一些列操作过程中的信息数据处理为题且提供了一系列的数据分析。管理系统E-R图 该系统包含的实体主要有:商品、库存单、销售单、管理员等,下面将分别介绍各实体及实体间的E-R图。通过其E-R图,读者可以更好地理解各实体的属性关系。商品和库存单E-R图,如下图所示:图4.2商品和库存单E-R图商品和销售单E-R图,如下图所示:图4.3商品和销售单E-R图商品和供应商E-R图,如下图所示:图4.4商品和供应商E-R图在系统的开发过程中,数据库的设计直接影响着系统的后期开发,故在数据库的设计过程中,需要为后期的维护和系统性能的扩展打下良好的基础。3.数据库、表的设计a数据库的名称为Sales,下面提供系统运行时动态创建数据库的方法SQL语句。表中详细信息见表4-1至4-101.销售表(tb_sale)表4-1 销售表(tb_sale)序号字段名数据类型字段大小是否为空主键描述1buyidvarchar50否是交易号2mercidvarchar20是否商品号3buycountfloat8是否数量4operidvarchar8是否操作员号5quitinfovarchar50是否退货信息6quitnumfloat8是否退货数量说明:这张表用于记录顾客消费的时候,生成的销售表,主要包括交易号、商品号、数量、操作员、退货信息、退货数量。各字段的详细内容如上表所示。销售的商品信息表 (tb_merchangiseinfo)表4-2 销售的商品信息表(tb_merchangiseinfo)序号字段名数据类型字段大小是否为空主键描述1idvarchar20否是编号2mernamevarchar20是否商品名3specvarchar4是否特殊4mercunitvarchar8是否单位5inpricefloat8是否进价6outpricefloat8是否售价7providvarchar8是否供应商号8discountfloat8是否折扣9numberfloat8是否数量说明:这张表记录供应商的信息。包括供应商的编号、商品名、特殊、单位、进价、售价、供应商号、折扣、数量信息。各字段的内容如上表所示。3.供应商表(tb_provider)表4-3供应商表(tb_provider)序号字段名数据类型字段大小是否为空主键描述1providvarchar8否是供应商号2provnamevarchar20是否姓名3provphonechar9是否电话4provaddrvarchar20是否地址说明:这张表用于记录供应商表的供应商号、姓名、电话、地址,各字段的详细内容如上表所示;库存表(tb_storage)表4-4 库存表(tb_storage)序号字段名数据类型字段大小是否为空主键描述1storidvarchar20否是库存号2merchandiseidvarchar20是否商品号3stordatedatetime8是否入库日期4stortypevarchar10是否类型5providvarchar8是否供应商号6storinfovarchar30是否库存信息7operidvarchar8是否操作员号8storflagvarchar2是否库存标志9unitpricemoney8是否单价10numbersfloat8是否数量11paymoneymoney8是否付款说明:这张表记录了数据主题的信息。包括主题ID、所属数据源、主题名、主题描述、是否注册等。这张表记录了库存表,主要记录了库存的基本信息,包括库存号、供应商号、入库日期、操作员等信息,其各字段的详细都是如表所示。5.库存管理表(tb_storemanage)表4-5 库存管理表(tb_storemanage)序号字段名数据类型字段大小是否为空主键描述1meridchar10否是商品号2downlimitfloat8是否下限3uplimitfloat8是否上限4nowvaluesfloat8是否当前数量说明:库存管理表(tb_storemanage)用来记录库存管理表的信息,包括库存商品号、设定的下限、上限、当前数量,各字段的详细信息如上表所示。操作员表(tb_operator)表4-6 操作员表(tb_operator)序号字段名数据类型字段大小是否为空主键描述1operidvarchar8否是操作员号2opernamevarchar8是否姓名3operpasswordvarchar8是否密码4operlevelvarchar10是否权限说明:操作员表(tb_operator):用来记录操作员的信息,包括操作员号、姓名、密码、权限,各字段的详细信息如上表所示。备份还原表 表4-7 备份还原表(tb_backup)序号字段名数据类型字段大小是否为空主键描述1idint4否是备份号2backuptimedatetime8是否备份时间3filepathvarchar50是否备份路径说明:备份表还原表:(tb_backup):用来记录备份文件的信息,包括备份号、备份时间、备份路径,各字段的详细信息如上表所示;四、方案选择技术的使用 微软基础类库mfc,以C++类的形式封装了Windows API,并且包含一个应用程序框架,例如单文档,多文档等框架模式,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类,在深入学习了C++之后,可以很容易的使用MFC来开发界面开发工具选择超市管理系统是典型的C/S的设计结构,分为前台和后台两个部分,界面都是采用MFC的设计,数据库为SQL Server2008,。Visual 2010 是微软公司推出的比较新的开发环境,是目前最流行的Windows平台应用程序开发环境。功能很多,其集成开发环境(IDE)的界面被重新设计和组织,,变得更加简单明了。其中MFC的开发,提供很好的界面设计和提供很多接口,提供给开发者,提高了开发者的效率。SQL Server 2008数据库是一种大型数据库,一般用于商业,政府等很多部门,它的功能十分的强大,具有处理大数据的能力,在网络上运用也很多。但是现在一些小的工程都用mysql SQL server等数据库系统,它的操作简单,功能相对齐全。但是相比较SQL Server来说,在处理能力还不行,所以我选择了SQL Server2008。第五章 详细设计与实现 本章主要内容是主要是介绍超市管理系统的各部分来具体实现代码,分别从与数据库的连接,前台和后台等一些操作,给出实现的具体代码和软件的功能截图。一、用户登陆模块的实现作为超市管理系统,由于使用对象收银员群体较大,故需要用户登陆模块记录当前人员邓丽信息。设计用户登陆模块是为了验证登陆者的身份和权限,只有收银员用户或管理员才能登陆与之对应的管理系统。在登陆界面,通过对各项登陆条件的验证,就可以确认用户的使用权限,根据权限不同显示不同的界面,下面将介绍登陆模块的具体开发过程。登录模块技术分析登录模块功能实现主要是通过遍历数据表(tb_operator),查找数据库中用户(operid)和密码(operpassword)与输入的用户和密码都一致的记录,找到满足条件条件的记录后根据身份进行不同的操作。收银员用户登录后,对主框架进行隐藏,只显示前台销售界面,这样,用户只能操作此界面;而管理员用户登陆后,系统主框架正常显示,用户可操作任何模块界面。开发登陆模块前,首先要完成其界面的设计,然后在具体实现各个模块功能。下面介绍界面的设计过程。插入对话框资源和其他各个空间,适当修改标题和ID号,布局好界面,最终登陆界面设计如下图: 登陆界面的实现首先在对话框上空白区域双击,给登陆对话框建立一个类PASSDLG,通过类想到给两个编辑框添加字符串变量m_user、m_pass保存用户名和密码,在应用类中编写代码实现模块功能具体代码如下:(并且一下代码仍然包括如何连接数据库)?PASSDLG?dlg1; CString?str; m_pMainWnd->ShowWindow(SW_HIDE); if(dlg1.DoModal()==IDOK) { CString?sqlstr; sqlstr.Format("select?*?from?tb_operator?where?operid=%s?and?operpassword=%s",dlg1.m_user,dlg1.m_pass);????????if(GetRecord(sqlstr)==0){AfxMessageBox("没有该用户!");return?true;}????????operid=dlg1.m_user;????????str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem("operlevel")->Value; str.TrimRight(); } else?return?true;????if(str!="管理员") { CForeMange?dlg; dlg.DoModal(); m_pMainWnd->ShowWindow(SW_HIDE); } else { m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); m_pMainWnd->UpdateWindow(); m_pMainWnd->SetWindowText("超市管理系统--HC1.0"); }上面的代码是根据用户身份不同显示不同的界面代码。和获取数据表中记录个数,实现对用户权限的判断,当用户是非管理员是,只显示前台销售界面;当用户是管理员时,系统汉族框架正常显示,用户可操作任何模块界面。其中数据表中的记录的个数,操作系统各GetRecord()函数封装,下面给出该函数的主要部分。int?CHCDBApp::GetRecord(CString?sqlstr){ m_record=NULL; m_record.CreateInstance(__uuidof(Recordset)); m_record->Open((_variant_t?)sqlstr,theApp.m_connection.GetInterfacePtr(), adOpenDynamic,adLockOptimistic,adCmdText); int?count=0; if(m_record!=NULL) { try { m_record->MoveFirst(); } catch(...) { return?0; } if(m_record->_EOF)return?0; while(!m_record->_EOF) { m_record->MoveNext(); count++;}} m_record->MoveFirst(); return?count;}连接数据库的操作用函数ConnercSql()封装,不仅能够很方便的判断连接是否成功,而且对于频繁连接数据库操作可以减少代码重复编写,提高开发效率。二、前台销售模块设计前台销售模块是超市管理系统中非常重要的模块。设计前台销售模块主要是为了方便不同的收银员通过该界面对交易商品进行管理。扫描商品条形码或输入商品编号后,能显示顾客所购商品详细信息,可进行统计最终应付款和找零操作。现在将从界面设计及各子模块的实现等方面介绍前台销售的具体开发过程。1.前台销售模块技术分析 设计本模块功能时考虑到信息的相关性对编辑框数据的输入时要实现自动关联,为了更方便用户数据的输入,各编辑框控件的焦点也实现了自动切换。为了让收银员把账单看得更清楚,对最后的汇总数据实现了改变字体、放大、高亮输出。考虑到收银员的短暂离开,为了保护数据的安全,设计了屏幕锁定功能,通过输入密码验证后才能完成本次交易管理。2.前台销售模块的设计开发前台销售功能具体功能钱,首先要完成其界面的设计,然后在具体实现模块功能。下面介绍界面的设计过程。插入对话框资源和其他各个空间,适合修改标题和ID号,布局好界面,最后前台销售界面社体如图。图5.2前台管理模块编号信息的动态获取上一节主要完成了界面的设计,由于功能代码均码没添加,所以单击界面上的控件都不会起作用,本节将介绍如何实现前台销售功能。首先,在对话框上的空白区域双击,给该前台销售对话框建立一个类CForeMange,通过类向导给各个编辑框、List控添加变量,给七个按钮添加单击消息函数,给商品编号对应的编辑框添加EN_KILLFOCUS消息,动态获取编号商品信息。在CForMange类中编写代码实现模块功能。下面将介绍编辑框数据输入时动态显示查找结果的方法,具体代码如下:void?CForeMange::OnKillfocusMercid()?{ CString?sqlstr; UpdateData(); if(m_id=="")return; sqlstr.Format("select?*?from?tb_merchangiseinfo?where?id=%s",m_id); if(GetRecord(sqlstr)==0) { MessageBox("没有该商品"); GetDlgItem(IDC_MERCID)->SetFocus(); return; }}商品信息键盘消息处理这里将介绍编辑框数据输入时动态显示商品信息的方法,也讨论对键盘各个消息的处理方法,实现键盘易用性,具体代码如下:BOOL?CForeMange::PreTranslateMessage(MSG*?pMsg)?{ if(pMsg->message==WM_KEYDOWN?&&?pMsg->wParam==VK_RETURN)?//截取回车键??? { if(::GetFocus()==m_mercnum) { UpdateData(); CString?sqlstr; sqlstr.Format("select?*?from?tb_merchangiseinfo?where?id=%s",m_id); if(GetRecord(sqlstr)==0) return?false; CString?str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem("number")->Value; if(double(atof(str))
【KEY WORDS】MFC ADO Controls Management system目 录
版权保护: 本文由 hbsrm.com编辑,转载请保留链接: www.hbsrm.com/dzxx/dzkxyjs/1730.html