• 223.00 KB
  • 2022-05-17 13:40:30 发布

基于某C++地企业考勤管理系统地设计与开发.doc

  • 85页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
摘要黑体二号随着现代科学技术的发展,越来越多的公司和企业对职工的考勤都实行了信息化管理,使用计算机系统代替复杂的手工方式来管理考勤事务。考勤管理系统可以有效地管理公司员工的出勤情况,规人事制度管理,保证公司正常的工作,是人力资源管理的重要组成部分。系统的开发主要包括后台数据库的建立,维护以及前端应用程序的开发两个方面,主要模块包括基本信息管理模块,考勤信息管理模块,统计查询模块和系统用户管理模块。系统是使用VisualC++开发语言,使用MicrosoftVisualStudio6.0作为工具软件,数据库为SQLServer2000。系统采用目前比较流行的ADO数据访问技术,并将每个数据库表的字段和操作封装到类中,它使应用程序的各个窗口都能够共享对表的操作,不需要重复编码,使程序更加易于维护,从而将面向对象的程序设计思想应用到数据库应用程序中。关键词:考勤管理;人力资源;数据库;数据访问技术 AbstractAlongwiththedevelopmentofthemodernscienceandtechnology,moreandmorecompaniesandenterprisesimplementedtheinformationmanagementtothestaff"scheckingattendance,andusecomputersysteminsteadofthecomplexmanualwaytomanagethecheckingattendancebusiness.Thecheckingattendancemanagementsystemmayeffectivelymanagethestaff"sgoingoutondutysituation,Standardpersonnelsystemmanagement,Guaranteesthecompanynormalwork.ItistheimportantpartofhumanresourcesmanagementThedevelopmentofthissystemmainlyincludestwoaspects:theestablishmentofthebackstagedatabaseandthedevelopmentofthefront-sideapplication.Thissystemcontainsfollowingseveralmodules:thebasicinformationmanagementmodule,theattendanceinformationmanagementmodule,thestatisticalinquirymoduleandthesystemuseradministrationmodule.VisualC++andSQLServer2000areusedinthedevelopmentofthesystem.ThesystemusesthepopularADOtechnology,andencapsulatesthefieldsandtheoperationsofeachtableintosomeclasses.Itcausestheoperationwhichtheapplicationprocedureeachwindowallcansharesynchronizestables.Ithasnotrepeatcodes,andmakestheapplicationtobeeasiertomaintain.Bythisway,theideaofobject-orientedprogrammingwillbeappliedinthedatabaseapplication.Keywords:Attendancemanagement;Humanresources;Database;Dataaccesstechnology 目录二号黑体居中摘要黑体二号2第1章概述一级标题黑体二号理工类学科的论文主体不少于10000字11.1企业考勤管理系统意义二级标题黑体三号1企业考勤系统的应用背景11.3企业考勤系统基于的技术种类1第2章系统的可行性研究12.1技术可行性分析1经济可行性分析12.3操作运行可行性分析1第3章一级标题黑体二号系统分析13.1系统二级标题黑体三号需求分析1用户工作流程13.1.2功能需求13.2性能需求13.3全局分析1第4章系统软件设计14.1系统设计预览14.1.1系统设计目标与功能结构14.1.2业务流程图展示14.2数据库设计14.2.1数据库分析14.3公共类的设计14.3.1CADOconnection类14.3.2CADODataSet类14.4统主体窗的设计14.5系统模块设计14.5.1用户登入模块设计14.5.2用户管理模块设计14.5.3部门管理模块设计14.5.4人员信息管理模块14.5.5考勤管理模块设计14.5.6考勤汇总查询模块设计1第5章总结与展望1参考文献1 附录黑体,二号,居中1致黑体,二号,居中1目录页码与正文页码分开,不同 第1章概述一级标题黑体二号理工类学科的论文主体不少于10000字1.1企业考勤管理系统意义二级标题黑体三号考勤管理是企事业单位经营的重要环节,加强考勤管理,严肃考勤制度是企事业单位搞好各项经营管理工作的前提与保障.科学地管理考勤不仅可以保证各项经营管理计划得以落实,而且有利于提高工作学习效率.长期以来,很多单位沿袭人工方式进行考勤管理,每个单位都有专门负责考勤登记的人员.即便如此科学准确地管理考勤也绝非易事,原因主要在于考勤涉及人员、班种、请假等诸多因素,每日考勤统计工作量极大等.利用计算机管理考勤不仅能使管理人员从繁重的考勤管理工作中解脱出来,而且能够使考勤管理工作更加科学化,规化,智能化.随着计算机技术的高速发展,正在改变着整个世界的经济,也改变着企业的管理.顺应信息技术发展的潮流,作为企业信息化的核心部分,选择先进的,符合国际标准的考勤系统,不仅可以有效提高企业管理,协作与监控员工的出勤效率,更可以为企业进一步信息化建设奠定良好的基础.利用计算机实现企业人事考勤管理势在必行。本系统结合企业实际考勤管理制度,经过实际的需求分析,采用功能强大的VisualC++6.0作为开发工具,开发出来的企业考勤管理系统。其一,可以将考勤事务交给基本部门处理,交个每个员工自己处理,交给系统自动处理,用IT技术推动人事考勤管理的变革。其二,新的考勤系统的实施,不仅把HR人员从考勤的具体事务中解放出来,而且也推动了全员对人事管理的参与和互动.HR人员的可以把工作重心可以放在服务员工、支持公司管理层的战略决策上,放在公司最重要的资产— 员工和员工的集体智慧的管理上等核心业务上来。在此讨论的考勤管理系统的开发,旨在探索一种新的考勤模式.通过这种新的模式,为企业的传统考勤模式创造一种新的概念,提高考勤工作效率和标准化水平。整个系统从符合操作简便、界面友好、灵活、实用、安全的要求出发,完成日常的员工签到,出勤修改,出勤查询,用户维护,员工维护,以及系统配置等功能.经过实际使用证明,本文所设计的系统可以满足企业进行日常的员工考勤管理方面的需要。1.1企业考勤系统的应用背景随着计算机在国外的普及和计算机科学技术的飞速发展,人们开始越来越多地利用计算机解决实际问题。企业员工考勤信息管理是企业信息管理的重要部分。面对大量的人事考勤信息,采用人力处理将浪费大量的时间、人力和物力,且数据的准确性低。因此,开发一个界面友好,易于操作的员工信息管理软件进行自动化处理具有较大的社会现实意义。同时,人事考勤管理系统是一切应用系统的典,它具有一切应用系统的特征,系统结构与现实生活紧密结合,具体直观,开发应用简单,不失一般性。人事考勤管理系统的特点是从人事考勤管理的角度出发,用集中的数据库将几乎所有与人事考勤相关的数据统一管理起来,形成了集成的信息源。友好的用户界面,强有力的报表生成工具、分析工具和信息的共享使得人事考勤管理人员得以摆脱繁重的日常工作,集中精力从战略的角度来考虑企业人事考勤规划和政策.作为计算机应用的一部分,使用计算机对考勤信息进行管理,有着手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、性好、寿命长、成本低等。这些优点能够极提高人事劳资管理的效率,也是企业的科学化、正规化管理,与世界接轨的重要条件。 考勤管理系统就是把分散的企事业单位的考勤信息实行统一、集中、规的收集管理,建立分类编号管理、电脑存储查询以及防火、防潮、防蛀、防盗等现代化、专业化的管理系统,为企事业单位和职工解除后顾之忧。企业考勤管理系统为企事业单位提供信息咨询、信息检索、信息存取等服。本考勤管理系统基本上能够满足现代企业考勤管理需求。信息录入项目齐全、完整、系统。现代考勤管理系统灵活使用表格对各种信息分门别类,组成企业考勤管理系统,可以方便地查询、阅读、修改、交流和重复使用。1.1企业考勤系统基于的技术种类基于Client/Server结构的远程电脑考勤系统,PB和SQLServer结合开发出两层C/S结构的远程电脑考勤系统。该系统采用条码扫描的形式,在Client端采集考勤数据,在Server端综合汇总,汇总的数据除供管理者查询以做决策的依据外,还可直接将其传至公司的财务系统,作为薪金发放的重要参考。在论述远程电脑考勤系统实例的同时,还从系统环境,前台应用程序的设计,后台数据库的设计,系统数据库的安全,系统网络的安全等方面给出了开发两层次C/S结构应用系统、一般方法和技巧,具有一定的参考价值。基于VB/SQLServer的管理系统的实现——智能化考勤系统设计,VB作为一种面向对象的可视化编程工程,具有简单易学、灵活方便和易于扩充的特点.与后端的SQLServer相结合,VB能够提供一个高性能的客户机/服务器方案.主要讲述在软件工程原理指导下,考勤管理方案的设计,该系统服务端采用了MircosoftSQLServe2000,客户端采用VisualBasic编程,通过微软的ADO控件调用服务器端的相关数据,实现数据的分布式管理. 基于ASP.NET的考勤管理系统的设计与实现,考勤管理系统是企事业单位实现员工考勤自动化管理的重要设施.本文详细讨论了某公司考勤管理系统的系统功能、系统结构的设计和关键技术实现的过程.用ASP.NET开发的该系统具有操作简便、界面友好、灵活、实用和安全等特点.正文页码要用阿拉伯数字,与目录页码不同 第1章系统的可行性研究1.1技术可行性分析为达到技术的可行支持在程序设计开发之前,首要确定运用什么工具来开发,必须考量运用怎样的形式才能达到最好的效果。1991年微软公司推出VisualBasic,是基于BASIC的可视化的程序设计语言。既继承了其先辈的BASIC所有的程序设计简单易用的特点,其程序也采用了面向对象,事件驱动的编程机制,用一种巧妙的方法把Windows的编程复杂性封装起来,提供了一种所见即所得的可视界面设计方法。VB的多种功能特点体现于:具有面向对象的可视化设计工具,应用面向对象的程序设计方法,把程序和数据封装起来视为一个对象,每个对象都是可逆的。程序员在设计时只需要根据现有界面设计的要求,直接在屏幕上画出窗口,菜单,按扭等不同类型的对象,并为每个对象设置属性。程序员的编程工作仅编写针对对象要完成哪些功能的程序,因而程序设计的效率可提高很多。事件驱动的编程机制的运用,事件驱动是非常适合图形用户界面的编程方式。传统的编程方式是一种面向过程,按程序事先设计的流程运行。但在图形用户界面的应用程序中,用户的动作即事件掌握着程序的运行流向,每个事件都能驱动一段程序的运行。程序员只要编写响应用户动作的代码,各个动作之间不一定有联系。这样的应用程序代码较短,使得程序既易于编写又易于维护。明确提供了易学易用的应用程序集成开发环境在VB集成开发环境中,用户可设计界面、编写代码、调试程序,直至把应用程序编译成可执行文件,在Windows中运行,使用户在友好的开发环境中工作。结构化的程序设计语言,VB具有丰富的数据类型、众多的部函数和结构化程序结构,而且简单易学。支持多种数据库系统的访问,利用数据控件或ODBC能够访问的数据库系统有,MicrosoftAccess、Btrieve 、dBASE、MicrosoftFoxPro和Paradox等,也可以访问MicrosoftExcel、Lotus1-2-3等多种电子表格。OLE技术在于VB的核心就是其对对象的与嵌入(OLE)的支持,利用OLE,VB能够开发集声音、图像、动画、字处理、Web等对象于一体的应用程序。Active技术发展了原有的OLE技术,它使开发人员摆脱了特定语言的束缚。可方便地使用标准的Active部件,调用标准的接口,实现特定的功能。完备的help联机帮助功能,与Windows环境下的软件一样,在VB中,利用帮助菜单和F1功能键,用户可随时方便地得到所需的帮助信息,VB帮助窗口中显示了有关的示例代码,通过复制、粘贴操作可获得大量的示例代码,为用户的学习和使用提供了捷径。基于以上关于VisulBasicC++强大功能和易操作性的介绍,我们将采用其作为本次考勤系统的前台开发工具。SQLServer2000是Microsoft公司推出的数据库管理系统,它继承了SQLServer7.0在数据库软件设计和引擎方面的优势,同时增加了读多新的功能,使用更加方便,完全支持Web应用,而且更具可靠性和稳定性。我们选择SQLServer2000作为后台支持,大家都知道,SQLServer2000对一些企业级用户来说是个福音,它在存储大容量数据、保证数据的安全性、维护数据的完整性都有着极其出色的一方面。它还具有自动高效的机制以及运行分布式处理等优点。这种关系型数据库管理系统能够满足各种类型数据库的单独开发和其他商业应用程序开发的需要。使用SQLServer2000我们可以很方便的建立数据库,可以将所建立的数据库很好的和VB结合起来。 1.1经济可行性分析考勤系统的面向主体用户群是企业,而企业在运营过程中准求的在围的尽量少的成本下实现最大的产出,已达到最高的性价比。以企业员工的数量可满足考勤系统的容量与需求,因此只需在配备定量的服务器的条件下,增加考勤机和IC卡即可。考勤系统运行的环境采用操作系统WINDOWS系统,系统开发工具,以及后台数据库均无需购买。因此实施此考勤系统无需硬件资金投入,若想将管理系统全面投入运行,所需资金投入也只需日常维护与技术支持等必须费用。所以,实施考勤系统在经济上是可行的,将考勤系统全面投入运行,在经济上也是可行的。1.2操作运行可行性分析信息化考勤系统是考勤管理模式的发展方向,以现代化信息技术完成考勤工作,可以提高工作效率和工作质量,迎合现代化企业发展管理的需求,也是与国际社会流行趋势相吻合的。企业管理制度的齐全与稳定,提供了企业创新发展的基础。企业计算机设备齐全,网络完善,有良好的机房和技术人员。企业DBA对微机操作熟练,完全可以掌握系统的使用和维护。因此,考勤系统的操作运行是可行的。第2章一级标题黑体二号系统分析2.1系统二级标题黑体三号需求分析 需求分析是系统开发必要环节,也是重中之重;需求过程研究业务工作,以期设计出有助于业务工作的更加完善的系统。作为该过程的结果,需求规格说明书是对系统的功能和行为完整的描述。系统设计将来自于需求和分析的抽象规格说明转变为面向真实世界的设计。一旦构建完成,该系统就会投入使用,同时会不可避免地产生更多的新需求。同时,需求过程与分析活动之间有相当程度的重叠,分析建模对于设定工作的围和其他一些事来说是必要的,所以我们利用分析模型来描述需求过程,随着开发工作的继续,分析活动在工作中占的比例将变得越来越大,直到所有需求都已知。1.1.1用户工作流程登陆——运行——更新(删除)——查询系统开发主要有以下五个模块组成:在系统模块中实现了,登录与运行功能。在维护模块中实现了,对数据库更新与删除的功能。在查询模块中实现了,条件模糊查询功能。能够清楚的让使用者了解本系统,并帮助使用者如何更好的使用本系统3.1.2用户业务需求(1)该管理软件将对企业人事考勤档案进行管理和统计,对部门信息、员工信息、考勤数据、考勤信息进行管理和统计。(2)该管理软件将根据用户的需要对个人信息进行查询,并能打印详细信息。(3)该管理软件将为用户提供账号管理工具,以便用户对账号进行管理,具体为添加用户、删除用户、修改用户密码。(4)该管理软件提供企业人员管理,能够对企业员工的分类管理,新员工的加入以及员工删除,修改进本信息等功能。1.1.2功能需求基于系统需求分析,该系统需要实现以下基本功能: 用户管理:管理系统操作人员,设置操作人员口令和权限。在满足不同系统用户的操作需求的基础上,提高系统的安全性。人事考勤管理:完成企业对员工个人考勤信息(包括员工的基本档案和在职信息)的管理及相关操作。操作员进行员工考勤信息录入及更改,其中包括员工的基本信息、工作部门、工作流程,要求对这些员工档案信息可以进行新增、修改、删除操作,同时可以进行查询和浏览操作。该模块是本系统的重点,用户可以通过该模块为单位建立一个比较完整的人事考勤系统,同时可以对数据进行查看。基础数据管理:维护人事管理相关的一些基础数据。主要包括以下功能:(1)部门类别设置:维护企业中设立的部门类别信息;(2)职工类型设置:维护当前企业职工与企业的关系的类别信息;(3)职务类别设置:维护企业中设立的职务类别信息;(4)职工资类别设置:维护企业中设立的工资类别信息;(5)称类别设置:维护企业职工的职称类别信息;人事变动管理:对于人事上的变动调整进行管理,对人员考勤的信息进行更新(如:员工职务、员工职称、员工性质等的变动)考勤管理:考勤管理可帮助公司完成时间管理记录员工上下班、加班、出缺勤时间,并可将数据连至薪资计算系统处理,以便作薪资结算。企业还可根据此考勤系统查询企业各时段的员工出缺勤状况,作管理方面的分析。提供了全面的考勤管理。数据库管理:对现有的数据库进行管理,包括数据备份和恢复,以方便用户对数据库的管理和维护工作,提高系统的数据安全性。 1.1性能需求(1)硬件环境在最低配置的情况下,系统的性能往往不尽如人意,现在的硬件性能已经相当出色,且价格也很便宜,因此通常给服务器端配置高性能硬件。处理器:InterPentiumII266MX或更高存:64MB硬盘空间:2GB显卡:SVGA显示适配器(2)软件环境操作系统:Windows98/ME/2000/NT数据库:MSQ1.2全局分析用户需要输入用户名和密码进入人事考勤管理系统,对人事考勤管理系统的部门、员工的基本信息进行维护和管理。在考勤管理模块中录入员工当天的考勤信息,同时可对年、月、员工进行查询。还可以通过考勤汇总查询对员工某月的考勤记录进行汇总,计算出员工月工作天数,早退、迟到的天数等。UseCase是对一个活动者使用系统的一项功能时所进行的交互过程的一个文字描述序列.在该UseCase图中只有顶层图,主要是考虑到考勤管理系统体积不大,做成一个顶层图会使得各用例间的关系更清晰.具体关系如图所示. 图3-1考勤管理系统顶层UseCase全局分析 第1章系统软件设计1.1系统设计预览1.1.1系统设计目标与功能结构人事考勤管理系统以实现员工日常出勤信息管理为设计目标,加以强大的数据库管理功能,可以方便对考勤信息进行管理,大提高了人事部门的日常工作效率。本系统在设计时应满足以下几点:采用人机对话的操作方式,信息查询灵活、方便、快捷、准确、数据存储安全可靠。对考勤信息的操作简单,可以方便的进行添加、修改、和删除,可以录入员工信息、部门信息。对员工的考勤信息可按月进汇总计算,对用户输入的数据,系统进行严格的数据检查,尽可能排除人为的错误。系统最大限度的实现了易维护性和易操作性。统运行稳定、安全可靠。人事考勤系统功能结构如图4-1所示。图4-1人事考勤系统功能结构 1.1.1业务流程图展示图4-2人事考勤系统业务流程图1.2数据库设计1.2.1数据库分析人事考勤管理系统使用了MicrosoftSQLSever2000数据库来满足系统的要求,数据库名称为tb_person,在数据库中创建4表用于存储各种不同的信息,如图4-2所示图4-2数据库中的标2数据库逻辑结构设计下面给出人事考勤管理系统数据库中的主要表的表结构。Tab_User(管理员信息表):用于保存管理员的信息,如图4-3所示 Tab_Dept(部门信息表):用于记录部门的信息情况,如图4-4所示Tab_Employees(员工信息表):用于保存公司员工信息,如图4-5所示Tab_check(考勤信息表):记录员工每天的考勤信息,如图4-6所示1.1公共类的设计本系统是使用ADO连接数据库的,为了能更方便地在程序中使用ADO建立数据库连接与数据表的操作,就在公共类中对系统中所使用的ADO操作进行了封装。在该系统中建立了ADO的两个公共类CADOConnection和CADODataSet,这两个类定义在ADO.h头文件中,实现ADO.cpp文件中。1.1.1CADOconnection类CADOConnection类是用来连接数据库的,实现了对_Connection接口的封装,CADOConnection类在头文件中的定义如下:#import"msado15.dll"no_namespacerename("EOF,"adoEOF")classCADOConnection{private:StaticvoidInitADO();StaticvoidUnInitADO();protected:_ConnectionPtrm_Connection;public:BOOLIsOpen(); _ConnectionPtrGetConnection();CstringGetSQLConstr(CStringIP,CStringDBName);BOOLOpen(CStringConStr);CADOConnection();Virtual~CADOConnection();};CADOConnection*GetConnection();CADOConnection类的实现代码如下:定义两个全局变量ConCount和g_Connection,ConCount变量是一个整型变量,用起来记录在工程中所创建的CADOConnection类的实例个数。在构造方法中当此变量为0时调用CoInitialize函数实现OLE的初始化。在析构方法中当此变量为0时调用CoUninitialize方法取消OLE的初始化。IntConCount=0;CADOConnectiong_Connection;GetConnection函数是一个全局函数,用于返回全局数据库连接对象的指针,代码如下:CADOConnection*GetConnection(){Return&g_Connection;}CADOConnection方法是析构函数,用于初始化OLE和创建_Connection接口的指针实例,代码如下:CADOConnection::CADOConnection() {InitADO();m_Connection.CreateInstance("ADODB.Connection");}~CADOConnection方法是析构函数,用于取消OLE初始化和释放_Connection接口的指针,代码如下:CADOConnection::CADOConnection(){If(IsOpen());m_Connection->Close();m_Connection=NULL;UnInitADO();}InitADO方法是一个静态方法,用于初始化OLE,代码如下:VoidCADOConnection::InitADO(){If(ConCount++==0)CoInitialize(NULL);};UnInitADO方法是一个静态方法,用于取消OLE的初始化,代码如下:voidCADOConnection::UnInitADO(){if(~ConCount==0) CoUninitialize();};Open方法通过指定的数据库连接字符串与SQL数据库建立连接,代码如下:BOOLCADOConnection::Open(CStringConStr){if(IsOpen())m_Connection->Close();m_Connection->Open((_bstr_t)ConStr,","adModeUnknown);returnIsOpen();}GetSQLConStr方法用来生成与数据库连接所需要的连接字符串,代码如下:CStringCADOConnection::GetSQLConStr(CStringIP,CStringDBName){CStringStr;Str.Format("Provider=SQLOLEDB.1;PersistSecurityInfo=False;UserID=sa;InitialCatalog=%s;DataSource=%s",DBName,IP);returnStr;}GetConnection方法用于返回_Connection接口指针,代码如下:_ConnectionPtrCADOConnection::GetConnection(){returnm_Connection:} IsOpen方法用来判断当前数据库连接对象与数据库的连接状态,代码如下:BOOLCADOConnection::IsOpen(){longState;m_Connection->get_State(&State);if(State==adStateOpen)returntrue;returnfalse;}1.1.1CADODataSet类CADODataSet类是用来存储数据的数据集类,该类实现了_Recordset接口的实例,该类在头文件中的定义如下:classCADODataSet{protected:_RecoedsetPtrm_DataSet;CADOConnection*m_Connectionpublic:voidDelete();intGetRecordNo();voidmove(intnIndex);voidSave(); voidSetFieldValue(CStringFieldName,_variant_tValue);voidAddNew();BOOLNext();FieldsPtrGetFields();intGetRecordCount();voidSetConnetion(CADOConnection*pCon);BOOLOpen(CStringSQLStr);CADODataSet();virtual~CADODataSet();private:BOOLIsOpen();};CADODataSet方法为记录集实现类的构造方法,在该方法中实现记录集接口对象的创建,代码如下:CADODataSet::CADODataSet(){m_DataSet.CreateInstance("ADODB.Recordset");}~CADODataSet类为记录集实现类的构造方法,在该方法中实现记录集的关闭与接口的释放,代码如下:CADODataSet::~CADODataSet(){ if(IsOpen())m_DataSet->Close();m_DataSet=NULL;m_Connection=NULL;}SetConnection方法用来设置记录集所连接的数据库连接类的对象,代码如下:voidCADODataSet::SetConnection(CADOConnection*pCon){m_Connection=pCon;}GetRecordCount方法用来获取记录集中数据的数量,实现代码如下:intCADODataSet::GetRecordCount(){if(IsOpen())returnm_DataSet->GetRecordCount();elsereturn0;}Open方法通过SQL查询语句打开数据集,实现代码如下:BOOLCADODataSet::Open(CStringSQLStr){if(IsOpen)m_DataSet->Close(); }IsOpen方法用来判断数据集是否处于打开状态,实现代码如下:BOOLCADODataSet::IsOpen(){longState;m_DataSet->get_State(&State);if(State==adStateOpen)returntrue;returnfalse;}GetFields方法用来获取记录集中字段的集合,实现代码如下:FieldsPtrCADODataSet::GetFields(){returnm_DataSet->GetFields();}Next方法将记录指针下移一位,实现代码如下:BOOLCADODataSet::Next(){if(m_DataSet->adoEOF)retuenfalse;m_DataSet->MoveNext();returntrue;} AddNew方法用于记录集中添加一个新行,实现代码如下:voidCADODataSet::AddNew(){m_DataSet->AddNew();}SetFieldValue方法用来向记录集中指定的字段赋值,实现代码如下:voidCADODataSet::SetFieldValue(CStringFieldName,_variant_tValue0){m_DataSet->PutCollect((_bstr_t)FieldName,Value);}Save方法用来保存对记录集中所做的任何数据更改,实现代码如下:voidCADODataSet::Save(){m_DataSet->Upsate();}Move方法将记录集的当前指针移动到指定的索引位置,实现代码如下:voidCADODataSet::Move(intnIndex){m_DataSet->MoveFirst();m_DataSet->Move(nIndex);}GetRecordNo方法用来获取记录集中的当前行号,实现代码如下:intCADODataSet::GetRecordNO() {returnm_DataSet->AbsolutePositon;}Delete方法用来删除记录集中的当前行,实现代码如下:voidCADODataSet::Delete(){m_DateSet->Delete(adAffectCurent);}1.1统主体窗的设计人事考勤系统主窗口由菜单和客户区域组成,其中,客户区域显示了一幅位图,主窗体效果如图4-3所示。主窗体设计步骤如下:(1)启动VisualC++6.0,选择File/New命令,打开New窗口,如图4-4所示。(2)在New窗口左方的列表视图中选择MFCAppWizard[exe]选项,在Projectname编辑框中输入工程名称,在Location编辑框中设置工程保存的路径。单击OK按钮进入MFCAppWizard-Step1窗口,如图4-5所示。(3)单击Finish按钮完成工程的创建。(4)向工程中导入一幅位图资源。(5)创建一个菜单资源,并设置各个菜单项的ID和名称。(6)通过类向导向主窗口添加菜单项的单击事件。 1.1系统模块设计1.1.1用户登入模块设计用户登入模块是所有管理系统所应具备的基础模块之一,该模块实现了用户使用系统的检验工作,使没有权限的用户不能使用该系统,增加了系统的安全性。用户登入界面如图4-6所示。用户登录窗体是整个系统中创建并显示的第一个窗体,所以该窗体应在主窗体创建前创建并显示。在登录窗体创建的同时应该创建数据库连接。这些操作都应在程序类的初始化方法中实现,该方法名为InitInstance,代码如下:BOOLCPersonApp::InitInstance(){AfxEnableControlContainer();#ifdef_AFXDLLEnable3dControls();#elseEnable3dControlsStatic();#endifLoadSkin();BOOLbCon=GetConnection()->Open(GetConnection()->GetSQLConStr("127.0.0.1","tb_person"));CLoginDialoglogindlg; if(logindlg.DoModal()!=IDOK)returnfalse;CPersonDlgdlg;m_pMainWnd=&dlg;intnResponse=dlg.DoModal();if(nResponse==IDOK){}elseif(nResponse==IDCANCEL){}returnFALSE;}创建一个对话框,打开对话框属性窗口,将对话框的ID改为IDD_DLGOGIN,将对话框标题改为“登入”。想对话框中添加两个静态文本控件、一个编辑框控件、一个列表框控件和两个按钮控件。分别设置两个按钮的Caption属性为“确定”和“取消”。在窗体的初始化方法中创建用户表的数据集,并将用户名添加到列表控件中,实现代码如下: BOOLCLoginDialog::OnInitDialog(){CDialog::OnInitDialog();m_DataSet.SetConnection(GetConnection());m_DataSet.Open("Select*FromTab_User");intcount=m_DataSet.GetRecordCount();for(inti=0;iItem[L"UserName"]->Value);m_DataSet.Next();}m_UserList.SetCurSel(0);returnTRUE;}在“确定”按钮的事件中实现用户名和密码的检证,实现代码如下:voidCLoginDialog::OnLogin(){CStringsql,user,pass;m_UserList.GetWindowText(user);m_passWord.GetWindowText(pass); sql.Format("Select*Fromtab_userWhereUserName="%s"andPassWord="%s"",user,pass);m_DataSet.Open(sql);if(m_DataSet.GetRecordCount()==1){::SetUserName(user);this->OnOk();}elseAfxMessageBox;}1.1.1用户管理模块设计用户管理模块实现了对系统登录用户的添加、修改和删除操作。用户管理模块的界面如图4-7所示。在用户管理模块中使用CListCtrl控件显示用户信息,当对某一记录进行编辑或删除操作时必须获取一个与记录对应的标识,所以在对用户列表进行添加时利用列表视图控件SetItemData方法将记录集对应的行号添加到每一行对应的数据中。当对记录进行修改时即可通过获取对应的行号对数据集中的数据进行修改。获取数据时使用列表视图控件中的GetItemData方法. 创建一个对话框,打开对话框属性窗口,将对话框的ID改为IDD_DLGUSER,将对话框标题改为“用户管理”。向对话框中添加一个列表视图控件和4个按钮控件。列表视图控件的变量为m_grid,分别设置按钮控件的Caption属性为“添加”、“修改”、“删除”和“退出”。定义UpdateGrid方法,用来更新列表视图中显示的用户信息,实现代码如下:voidCUserManage::UpdateGrid(){m_DataSet.Open("Select*Fromtab_User");m_grid.DeleteAllItems();for(int=0;iItem[L"UserName"]->Value);intno=m_DataSet.GetRecordNo();m_grid.SetItemData(i,no);m_DataSet.Next();}}向对话框中添加OnInitDialog方法,在对话框的初始化方法中添加列表视图控件应显示的列头,并在下拉列表视图控件中添加数据,代码如下:BOOLCUserManage::OnInitDialog(){ CDialog::OnInitDialog();m_grid.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);m_grid.InsertColumn(0,"用户名");m_grid.SetColumnWidth(0,150);m_DataSet.SetConnection(::GetConnection());UpdateGrid();returnTRUE;}在“添加”按钮事件中弹出“用户编辑”窗体,输入用户名后单击“确定”按钮,实现对用户的添加,代码如下:voidCUserManage::OnAppend(){CUserEdituseredit;if(useredit.DoModal()==IDOK){m_DataSet.AddNew();m_DataSet.SetFieldValue("UserName",(_bstr_t)useredit.name);m_DataSet.Save();UpdateGrid();} }在“修改”按钮事件中弹出“用户编辑”窗体,输入用户名后单击“确定”按钮实现对用户的修改,代码如下:voidCUserManage::OnEdit(){CUserEdituseredit;intno=m_grid.GetItemData(m_grid.GetSelectionMark());m_DataSet.move(no-1);useredit.name=(char*)(_bstr_t)m_DataSet.GetFields()->Item[L"UserName"]->Value;if(useredit.DoModal()==IDOK){m_DataSet.SetFieldValue("UserName",(_bstr_t)useredit.name);m_DataSet.Save();UpdateGrid();}}在“删除”按钮的单击事件中获取当前记录进行删除操作,代码如下:voidCUserManage::OnDelete(){if(MessageBox("是否删除此记录!","提示", MB_YESNO|MB_ICONWARNING)==IDYES){intno=m_grid.GetItemData(m_grid.GetSelectionMark());m_DataSet.move(no-1);m_DataSet.Delete();m_DataSet.Save();UpdateGrid();}}1.1.1部门管理模块设计部门管理记录了部门间的层次结构和部门信息,所以通常部门管理窗体中对于部门的显示是使用树列表显示的。部门管理界面如图4-8所示。由于部门通常都是存在层次级别的,所以在设计数据表结构时应至少创建3个字段,即“编号”、“父编号”和名称。而在程序中显示部门信息时也根据“父编号”作为查询条件不断地查找下一级的部门。在本系统中,由于部门信息通常不会太多,所以可以用嵌套的方式将部门信息一次性地读入树列表视图控件中,实现代码如下:voidCDeptManage::GetNode(HTREEITEMpNode,intnPid){ HTREEITEMnode;CADODataSetDataSet;DataSet.SetConnection(::GetConnection());CStringstr;str.Format("Select*Fromtab_Deptwherepid=%d,nPid");DataSet.Open(str);intcount=DataSet.GetRecordCount();intID;_variant_tvalue;for(inti=0;iItem["DeptName"]->Value,pNode);value=(_vaiant_t)DataSet.GetFields()->Item["ID"]->Value;ID=value.intVal;m_tree.SetItemData(node,ID);GetNode(node,ID);DataSet.Next();}} 创建一个对话框,打开对话框属性窗口,将对话框的ID改为IDD_DLGDEPT,将对话框标题改为“部门管理”。向对话框中添加一个树列表控件、4个按钮控件,分别设置按钮控件的Caption属性为“添加”、“修改”、“删除”和“退出”。定义GetNode方法用来按层次关系获取部门表中的所有数据,并添加到树列表控件中。该方法由UpdateDept方法进行调用,实现代码如下:voidCDeptManage::UpdateDept(){m_tree.DeleteAllItems();GetNode(TVI_ROOT,0);}voidCDeptManage::GetNode(HTREEITEMpNode,intnPid){HTREEITEMnode;CADODataSetDataSet;DataSet.SetConnection(::GetConnection());CStringstr;str.Format("Select*Fromtab_Deptwherepid=%d",nPid);DataSet.Open(str);intcount=DataSet.GetRecordCount();intID; _variant_tvalue;for(inti=0;iItem["DeptName"]->Value,pNode);value=(_variant_t)DataSet.GetFields()->Item["ID"]->Value;ID=value.intVal;m_tree.SetItemData(node,ID);GetNode(node,ID);DataSet.Next();}}当单击“添加”按钮时将弹出部门编辑窗体,输入部门信息后单击“确定”按钮将添加一个新的部门,代码如下:voidCDeptManage::OnAdd(){CDeptEditdeptedit;if(deptedit.DoModal()==IDOK){HTREEITEMpNode=m_tree.GetSelectedItem();intpID;if(deptedit.isroot) pID=0;elsepID=m_tree.GetItemData(pNode);CADODataSetdataset;dataset.SetConnection(::GetConnection());dataset.Open("Selecttop1*Fromtab_Dept");dataset.AddNew();dataset.SetFieldValue("DeptName",(_variant_t)deptedit.name);dataset.SetFieldValue("memo",(_variant_t)deptedit.memo);dataset.SetFieldValue("PID",(long)pID);dataset.Save();UpdateDept();}}当单击“修改”按钮时将弹出部门编辑窗体,输入部门信息后单击“确定”按钮将添加一个新的部门,代码如下:voidCDeptManage::OnEdit(){CDeptEditdeptedit;deptedit.visible=false;HTREEITEMpNode=m_tree.GetSelectedItem(); if(pNode==0)return;intpID=m_tree.GetItemData(pNode);CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr;str.Format("Select*Fromtab_Deptwhereid=%d",pID);dataset.Open(str);deptedit.name=(char*)(_bstr_t)dataset.GetFields()->Item[L"DeptName"]->Value;deptedit.memo=(char*)(_bstr_t)dataset.GetFields()->Item["memo"]->Value;if(deptedit.DoModal()==IDOK){dataset.SetFieldValue("DeptName",(_variant_t)deptedit.name);dataset.SetFieldValue("memo",(_variant_t)deptedit.memo);dataset.Save();UpdateDept();}}当单击“删除”按钮时将删除当前选中的节点,代码如下:voidCDeptManage::OnDelete(){HTREEITEMpNode=m_tree.GetSelectedItem();if(pNode==0) return;if(MessageBox("是否删除此记录!","提示",MB_YESNO|MB_ICONWARNING)==IDYES){intpID=m_tree.GetItemData(pNode);CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr;str.Format("Select*Fromtab_Deptwhereid=%d",pID);dataset.Open(str);dataset.Delete();dataset.Save();UpdateDept();}}1.1.1人员信息管理模块人员信息管理模块根据部门分类显示,同时可对人员信息进行维护。人员信息管理界面如图4-9所示。 在人员信息管理界面中可以看到,左侧是部门信息,右侧是人员信息。当选中某一部门信息分类时右侧的人员信息会根据选中的部门进行人员信息的分类显示。这一操作主要是通过数列表视图控件中的OnSelchanged事件完成的,当树列表中的选中节点发生改变时就会触发该事件,实现代码如下:voidCPersonManage::OnSelchangedTreedept(NMHDR*pNMHDR,LRESULT*pResult){NM_TREEVIEW*pNMTreeView=(NM_TREEVIEW*)pNMHDR;m_DeptID=m_tree.GetItemData(pNMTreeView->itemNew.hItem);UpdatePerson();*pResult=0;}创建一个对话框,打开对话框属性窗口,将对话框的ID改为IDD_DLGPERSON,将对话框标题改为“人员信息管理”。向对话框中添加两个群组控件、一个树列表视图控件、一个列表视图控件和4个按钮控件。分别设置按钮的Caption属性为“添加”、“修改”、“删除”和“退出”。添加GetNode方法获取部门表中的数据信息添加到树列表视图控件中。该方法由UpdateDept方法调用,实现代码如下:voidCPersonManage::UpdatePerson(){m_list.DeleteAllItems();CADODataSetDataSet;DataSet.SetConnection(::GetConnection());CStringstr; if(m_DeptID==-1)str.Format("Select*Fromtab_Employees");elsestr.Format("Select*Fromtab_EmployeeswhereDept=%d",m_DeptID);DataSet.Open(str);intcount=DataSet.GetRecordCount();intn=0;_variant_tvalue;for(inti=0;iItem["Emp_Id"]->Value);value=DataSet.GetFields()->Item["AutoID"]->Value;m_list.SetItemData(n,value,lVal);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Emp_NAME"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Sex"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Nationality"]->Value); m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Birth"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Political_Party"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Culture_Level"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Marital_Condition"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Id_Card"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Office_phone"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Mobile"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["HireDate"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Duty"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Memo"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Files_Keep_Org"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Hukou"]->Value); m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Family_Place"]->Value);n++;DataSet.Next();}}添加OnInitDialog方法,用于初始化人员信息管理界面中的数据。在该方法中显示部门信息、人员信息,代码如下:BOOLCPersonManage::OnInitDialog(){CDialog::OnInitDialog();m_DeptID=-1;UpdateDept();inti=0;m_list.InsertColumn(i,"人员编号");m_list.SetColumnWidth(i++,80);m_list.InsertColumn(i,"人员名称");m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,"性别");m_list.SetColumnWidth(i++,50);m_list.InsertColumn(i,"民族");m_list.SetColumnWidth(i++,50);m_list.InsertColumn(i,"出生日期");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"政治面貌");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"文化程度");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"婚姻状况");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"号");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"办公"); m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"手机");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"到岗日期");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"职务");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"备注");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"家庭住址");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"档案所在地");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"户口所在地");m_list.SetColumnWidth(i++,100); m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);UpdatePerson();returnTRUE;}单击“添加”按钮,弹出人员编辑窗体,输入人员信息后单击“保存”按钮实现人员信息添加,代码如下:BOOLCPersonManage::OnInitDialog(){CDialog::OnInitDialog();m_DeptID=-1;UpdateDept();inti=0;m_list.InsertColumn(i,"人员编号");m_list.SetColumnWidth(i++,80);m_list.InsertColumn(i,"人员名称");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"性别"); m_list.SetColumnWidth(i++,50);m_list.InsertColumn(i,"民族");m_list.SetColumnWidth(i++,50);m_list.InsertColumn(i,"出生日期");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"政治面貌");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"文化程度");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"婚姻状况");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"号");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"办公");m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,"手机");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"到岗日期");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"职务");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"备注");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"家庭住址");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"档案所在地");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"户口所在地");m_list.SetColumnWidth(i++,100);m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); UpdatePerson();returnTRUE;}单击“修改”按钮,弹出人员编辑窗体,输入人员信息后单击“保存”按钮实现人员信息修改,代码如下:voidCPersonManage::OnEdit(){if(m_list.GetSelectionMark()==-1)return;intid=m_list.GetItemData(m_list.GetSelectionMark());CPersonEditpersonedit;CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr;str.Format("select*fromtab_Employeeswhereautoid=%d",id);dataset.Open(str);personedit.m_id=(char*)(_bstr_t)dataset.GetFields()->Item["Emp_Id"]->Value;personedit.m_name=(char*)(_bstr_t)dataset.GetFields()->Item["Emp_NAME"]->Value;personedit.m_sex=(char *)(_bstr_t)dataset.GetFields()->Item["Sex"]->Value;personedit.m_nationality=(char*)(_bstr_t)dataset.GetFields()->Item["Nationality"]->Value;CStringbirth=(char*)(_bstr_t)dataset.GetFields()->Item["Birth"]->Value;if(!birth.IsEmpty()){//设置日期数据intyy=atoi(birth.Left(4));intmm=atoi(birth.Mid(6,2));intdd=atoi(birth.Mid(9,2));CTimetbirth(yy,mm,dd,0,0,0);personedit.m_birth=tbirth;}personedit.m_farty=(char*)(_bstr_t)dataset.GetFields()->Item["Political_Party"]->Value;personedit.m_culture=(char*)(_bstr_t)dataset.GetFields()->Item["Culture_Level"]->Value;personedit.m_marital=(char*)(_bstr_t)dataset.GetFields()->Item["Marital_Condition"]->Value;personedit.m_card=(char*)(_bstr_t)dataset.GetFields()->Item["Id_Card"]->Value;personedit.m_office=(char *)(_bstr_t)dataset.GetFields()->Item["Office_phone"]->Value;personedit.m_mobile=(char*)(_bstr_t)dataset.GetFields()->Item["Mobile"]->Value;CStringhire=(char*)(_bstr_t)dataset.GetFields()->Item["HireDate"]->Value;if(!hire.IsEmpty()){//设置日期数据intyy=atoi(hire.Left(4));intmm=atoi(hire.Mid(6,2));intdd=atoi(hire.Mid(9,2));CTimethire(yy,mm,dd,0,0,0);personedit.m_hire=thire;}personedit.m_duty=(char*)(_bstr_t)dataset.GetFields()->Item["Duty"]->Value;personedit.m_memo=(char*)(_bstr_t)dataset.GetFields()->Item["Memo"]->Value;personedit.m_files=(char*)(_bstr_t)dataset.GetFields()->Item["Files_Keep_Org"]->Value;personedit.m_hukou=(char*)(_bstr_t)dataset.GetFields()->Item["Hukou"]->Value;personedit.m_family= (char*)(_bstr_t)dataset.GetFields()->Item["Family_Place"]->Value;personedit.m_DeptData=dataset.GetFields()->Item["Dept"]->Value;if(personedit.DoModal()==IDOK){dataset.SetFieldValue("Emp_Id",(_bstr_t)personedit.m_id);dataset.SetFieldValue("Emp_NAME",(_bstr_t)personedit.m_name);dataset.SetFieldValue("Sex",(_bstr_t)personedit.m_sex);dataset.SetFieldValue("Nationality",(_bstr_t)personedit.m_nationality);dataset.SetFieldValue("Birth",(_bstr_t)personedit.m_birth.Format("%Y-%m-%d"));dataset.SetFieldValue("Political_Party",(_bstr_t)personedit.m_farty);dataset.SetFieldValue("Culture_Level",(_bstr_t)personedit.m_culture);dataset.SetFieldValue("Marital_Condition",(_bstr_t)personedit.m_marital);dataset.SetFieldValue("Id_Card",(_bstr_t)personedit.m_card);dataset.SetFieldValue("Office_phone",(_bstr_t)personedit.m_office); dataset.SetFieldValue("Mobile",(_bstr_t)personedit.m_mobile);dataset.SetFieldValue("HireDate",(_bstr_t)personedit.m_hire.Format("%Y-%m-%d"));dataset.SetFieldValue("Duty",(_bstr_t)personedit.m_duty);dataset.SetFieldValue("Memo",(_bstr_t)personedit.m_memo);dataset.SetFieldValue("Files_Keep_Org",(_bstr_t)personedit.m_files);dataset.SetFieldValue("Hukou",(_bstr_t)personedit.m_hukou);dataset.SetFieldValue("Family_Place",(_bstr_t)personedit.m_family);dataset.SetFieldValue("dept",personedit.m_DeptData);dataset.Save();UpdatePerson();}}单击“删除”按钮实现当前选中的人员信息记录删除的操作,代码如下:voidCPersonManage::OnDelete(){if(MessageBox("是否删除此记录!","提示", MB_YESNO|MB_ICONWARNING)==IDYES){if(m_list.GetSelectionMark()==-1)return;intid=m_list.GetItemData(m_list.GetSelectionMark());CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr;str.Format("select*fromtab_Employeeswhereautoid=%d",id);dataset.Open(str);dataset.Delete();dataset.Save();UpdatePerson();}}1.1.1考勤管理模块设计考勤管理模块将所有人员当天的考勤信息录入到该模块中,并且可以根据年、月和已录入的考勤记录进行查询。考勤管理界面如图4-10所示。 在进行程序设计时日期型数据可以使用字符串的形式存入日期类型的数据库字段中,但字符串类型的日期数据要想转换成日期类型的数据就必须自己实现其转换功能。在该模块中实现了字符串形式的日期和时间分别转换成日期类型的数据。GetTimeForStr方法用来将字符串形式的时间转换成日期类型,实现代码如下:CTimeCCheckManage::GetTimeForStr(CStringtimestr){inth,m,s;if(timestr.GetLength()<8)timestr="0"+timestr;h=atoi(timestr.Left(2));m=atoi(timestr.Mid(3,2));s=atoi(timestr.Right(2));CTimeresult(2000,1,1,h,m,s);returnresult;}GetDateForStr方法用来将字符串类型的日期值转换成日期类型的数据,实现代码如下:CTimeCCheckManage::GetDateForStr(CStringdatestr){inty,m,d;y=atoi(datestr.Left(4));m=atoi(datestr.Mid(5,2));d=abs(atoi(datestr.Right(2))); CTimeresult(y,m,d,8,0,0);returnresult;}在该模块中还实现了一个时间相减的方法,在这个方法中实现相减都是转换成秒后进行减法计算的,然后再将秒转换成对应的时间类型数据,实现代码如下:CTimeCCheckManage::DecTime(CTimeone,CTimetwo){intyy,mm,dd,h,s,m,onetemp,twotemp;yy=2000;//one.GetYear();//-two.GetYear();mm=1;dd=1;onetemp=one.GetSecond()+one.GetMinute()*60+one.GetHour()*60*60;twotemp=two.GetSecond()+two.GetMinute()*60+two.GetHour()*60*60;if((onetemp-twotemp)<0){h=m=s=0;}else{h=(onetemp-twotemp)/60/60;m=((onetemp-twotemp)-h*60*60)/60; s=((onetemp-twotemp)-h*60*60)-m*60;}CTimetime(yy,mm,dd,h,m,s);returntime;}创建一个对话框,打开对话框属性窗口,将对话框的ID改为IDD_DLGCHECK,将对话框标题改为“考勤管理”。向对话框中添加一个复选框控件、3个静态文本框控件、3个下拉列表框控件、4个按钮控件和一个列表视图控件。设置复选框的Caption属性为“显示全部”。分别设置文本框的Caption属性为“年”、“月”和“员工”,分别设置按钮的Caption属性为“添加”、“修改”、“删除”和“退出”。添加UpdateList方法,用于更新显示人员的考勤信息,实现代码如下:voidCCheckManage::UpdateList(){this->UpdateData();CStringstr;if(m_check)str.Format("Select*Fromtab_check");else{CStringStarttime,EndTime;Starttime=m_yy+"-"+m_mm+"-1"; EndTime.Format("DATEADD(month,1,"%s")",Starttime);if(m_emp=="(全部)")str.Format("Select*Fromtab_checkwherecheckdatebetween"%s"and%s",Starttime,EndTime);elsestr.Format("Select*Fromtab_checkwherename="%s"andcheckdatebetween"%s"and%s",m_emp,Starttime,EndTime);}CADODataSetdataset;dataset.SetConnection(::GetConnection());dataset.Open(str);m_list.DeleteAllItems();for(inti=0;iItem["autoid"]->Value;m_list.InsertItem(i,"");m_list.SetItemData(i,data);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["name"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["ondutytime"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["offdutytime"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["ontime"]->Value); m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["offtime"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["leave"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["onleave"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["offleave"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["latetime"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["leaveearly"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["memo"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["checkdate"]->Value);dataset.Next();}}向对话框中添加OnInitDialog方法,在对话框初始化时设置列表视图控件的表头和列宽度,以及查询条件选择控件的设置,实现代码如下:BOOLCCheckManage::OnInitDialog(){CDialog::OnInitDialog();inti=0;m_list.InsertColumn(i,"人员");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"上班时间"); m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"下班时间");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"上班考勤时间");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"下班考勤时间");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"请假类别");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"请假起始时间");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"请假结束时间");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"迟到时间");m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,"早退时间");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"备注");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"考勤日期");m_list.SetColumnWidth(i++,130);m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);m_check=true;this->UpdateData(false);intcuryear,curmonth;CTimetime(CTime::GetCurrentTime());curyear=time.GetYear();curmonth=time.GetMonth();charvalue[10];for(inty=2000;y<2100;y++){_itoa(y,value,10);m_cyy.InsertString(y-2000,value); }m_cyy.SetCurSel(curyear-2000);for(intn=1;n<=12;n++){_itoa(n,value,10);m_cmm.InsertString(n-1,value);}m_cmm.SetCurSel(curmonth-1);CADODataSetdataset;dataset.SetConnection(::GetConnection());dataset.Open("Select*Fromtab_Employees");m_cemp.InsertString(0,"(全部)");for(intindex=1;index<=dataset.GetRecordCount();index++){m_cemp.InsertString(index,(_bstr_t)dataset.GetFields()->Item["emp_name"]->Value);dataset.Next();}m_cemp.SetCurSel(0);UpdateList(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSE}添加OnAdd方法,用于向考勤信息表中添加员工的日考勤数据,实现代码如下:voidCCheckManage::OnAdd(){CCheckEditcheckedit;if(checkedit.DoModal()==IDOK){CStringtime;CStringstr="Selecttop1*Fromtab_check";CADODataSetdataset;dataset.SetConnection(::GetConnection());dataset.Open(str);dataset.AddNew();dataset.SetFieldValue("name",(_bstr_t)checkedit.m_name);dataset.SetFieldValue("checkdate",(_bstr_t)checkedit.m_datecheck.Format("%Y-%m-%d")); dataset.SetFieldValue("ondutytime",(_bstr_t)checkedit.m_timeonduty.Format("%H:%M:%S"));dataset.SetFieldValue("offdutytime",(_bstr_t)checkedit.m_timeoffduty.Format("%H:%M:%S"));dataset.SetFieldValue("ontime",(_bstr_t)checkedit.m_timeon.Format("%H:%M:%S"));dataset.SetFieldValue("offtime",(_bstr_t)checkedit.m_timeoff.Format("%H:%M:%S"));dataset.SetFieldValue("leave",(_bstr_t)checkedit.m_leave);dataset.SetFieldValue("onleave",(_bstr_t)checkedit.m_timeonleave.Format("%H:%M:%S"));dataset.SetFieldValue("offleave",(_bstr_t)checkedit.m_timeoffleave.Format("%H:%M:%S"));dataset.SetFieldValue("memo",(_bstr_t)checkedit.m_memo);CTimelatetime=DecTime(checkedit.m_timeon,checkedit.m_timeonduty);time.Format("%d:%d:%d",latetime.GetHour(),latetime.GetMinute(),latetime.GetSecond()); dataset.SetFieldValue("latetime",(_bstr_t)time);CTimeleaveearly=DecTime(checkedit.m_timeoff,checkedit.m_timeoffduty);time.Format("%d:%d:%d",leaveearly.GetHour(),leaveearly.GetMinute(),leaveearly.GetSecond());dataset.SetFieldValue("leaveearly",(_bstr_t)time);dataset.Save();UpdateList();}}添加OnEdit方法,用于编辑考勤信息表中员工的日考勤数据,实现代码如下:voidCCheckManage::OnEdit(){if(m_list.GetSelectionMark()==-1)return;intid=m_list.GetItemData(m_list.GetSelectionMark());CCheckEditcheckedit;CStringstr;str.Format("Select*Fromtab_checkwhereautoid=%d",id);CADODataSetdataset; dataset.SetConnection(::GetConnection());dataset.Open(str);checkedit.m_name=(char*)(_bstr_t)dataset.GetFields()->Item["name"]->Value;checkedit.m_timeonduty=GetTimeForStr((char*)(_bstr_t)dataset.GetFields()->Item["ondutytime"]->Value);checkedit.m_timeoffduty=GetTimeForStr((char*)(_bstr_t)dataset.GetFields()->Item["offdutytime"]->Value);checkedit.m_timeon=GetTimeForStr((char*)(_bstr_t)dataset.GetFields()->Item["ontime"]->Value);checkedit.m_timeoff=GetTimeForStr((char*)(_bstr_t)dataset.GetFields()->Item["offtime"]->Value);checkedit.m_leave=(char*)(_bstr_t)dataset.GetFields()->Item["leave"]->Value;checkedit.m_timeonleave=GetTimeForStr((char*)(_bstr_t)dataset.GetFields()->Item["onleave"]->Value);checkedit.m_timeoffleave=GetTimeForStr((char*)(_bstr_t)dataset.GetFields()->Item["offleave"]->Value);checkedit.m_memo=(char*)(_bstr_t)dataset.GetFields()->Item["memo"]->Value;checkedit.m_datecheck=GetDateForStr((char*)(_bstr_t)dataset.GetFields()->Item["checkdate"]->Value); if(checkedit.DoModal()==IDOK){CStringtime;dataset.SetFieldValue("name",(_bstr_t)checkedit.m_name);dataset.SetFieldValue("checkdate",(_bstr_t)checkedit.m_datecheck.Format("%Y-%m-%d"));dataset.SetFieldValue("ondutytime",(_bstr_t)checkedit.m_timeonduty.Format("%H:%M:%S"));dataset.SetFieldValue("offdutytime",(_bstr_t)checkedit.m_timeoffduty.Format("%H:%M:%S"));dataset.SetFieldValue("ontime",(_bstr_t)checkedit.m_timeon.Format("%H:%M:%S"));dataset.SetFieldValue("offtime",(_bstr_t)checkedit.m_timeoff.Format("%H:%M:%S"));dataset.SetFieldValue("leave",(_bstr_t)checkedit.m_leave);dataset.SetFieldValue("onleave",(_bstr_t)checkedit.m_timeonleave.Format("%H:%M:%S")); dataset.SetFieldValue("offleave",(_bstr_t)checkedit.m_timeoffleave.Format("%H:%M:%S"));dataset.SetFieldValue("memo",(_bstr_t)checkedit.m_memo);CTimelatetime=DecTime(checkedit.m_timeon,checkedit.m_timeonduty);time.Format("%d:%d:%d",latetime.GetHour(),latetime.GetMinute(),latetime.GetSecond());dataset.SetFieldValue("latetime",(_bstr_t)time);CTimeleaveearly=DecTime(checkedit.m_timeoffduty,checkedit.m_timeoff);time.Format("%d:%d:%d",leaveearly.GetHour(),leaveearly.GetMinute(),leaveearly.GetSecond());dataset.SetFieldValue("leaveearly",(_bstr_t)time);dataset.Save();UpdateList();}}添加OnDelete方法,用于删除当前选择的考勤记录,实现代码如下: voidCCheckManage::OnDelete(){if(MessageBox("是否删除此记录!","提示",MB_YESNO|MB_ICONWARNING)==IDYES){if(m_list.GetSelectionMark()==-1)return;intid=m_list.GetItemData(m_list.GetSelectionMark());CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr;str.Format("select*fromtab_checkwhereautoid=%d",id);dataset.Open(str);dataset.Delete();dataset.Save();UpdateList();}}1.1.1考勤汇总查询模块设计 考勤汇总查询模块用于日常录入的员工考勤信息根据时间围和人员进行汇总查询,并显示员工的出勤天数、迟到天数、请假天数等。考勤汇总界面如图4-10所示。在该模块中汇总查询时通过SQL语句来实现的,这个汇总查询主要通过一些SQL子句组成一个SQL汇总查询语句。这些子句分别用来获取员工工作总天数、迟到总天数、早退总天数、病假总天数和事假总天数。在进行天数计算时将每天的考勤时间转换成秒,先计算所使用的总秒数,最后再根据总秒数计算出天数。考勤汇总查询的SQL语句如下:CStringstr,temp,where,datestr,StartDate,EndDate;StartDate=m_yy+"-"+m_mm+"-1";EndDate.Format("DATEADD(month,1,"%s")",StartDate);datestr.Format("between"%s"and%s",StartDate,EndDate);//*/temp+="selectemp.emp_name,ROUND(isnull(works.workday,0),2)";temp+="workday,ROUND(isnull(lates.lateday,0),2)lateday,";temp+="ROUND(isnull(leaveearlys.leaveearlyday,0),2)leaveearlyday,";temp+="ROUND(isnull(bjdays.bjday,0),2)bjday,ROUND(isnull(sjdays.sjday,0),2)sjday";temp+="fromtab_Employeesemp";temp+="leftjoin"; temp+="(selectsum(DATEDIFF(second,ontime,offtime))/60.0/60.0/8.0";temp+="asworkday,nameFromtab_checkwherecheckdate%sgroupbyname)";temp+="worksonemp.emp_name=works.name";temp+="leftjoin";temp+="(select(sum(DATEPART(Hour,latetime))*60*60+";temp+="sum(DATEPART(minute,latetime))*60+sum(DATEPART(second,latetime)))";temp+="/60.0/60.0/8.0aslateday,nameFromtab_checkwherecheckdate";temp+="%sgroupbyname)latesonemp.emp_name=lates.name";temp+="leftjoin";temp+="(select(sum(DATEPART(Hour,leaveearly))*60*60+";temp+="sum(DATEPART(minute,leaveearly))*60+sum(DATEPART(second,leaveearly)))";temp+="/60.0/60.0/8.0asleaveearlyday,nameFromtab_checkwhere";temp+="checkdate%sgroupbyname)leaveearlysonemp.emp_name";temp+="=leaveearlys.name";temp+="leftjoin";temp+="(selectisnull(sum(DATEDIFF(second,onleave,offleave))";temp+="/60.0/60.0/8.0,0)asbjday,nameFromtab_checkwhere"; temp+="leave="病假"andcheckdate%sgroupbyname)";temp+="bjdaysonemp.emp_name=bjdays.name";temp+="leftjoin";temp+="(selectisnull(sum(DATEDIFF(second,onleave,offleave))";temp+="/60.0/60.0/8.0,0)assjday,nameFromtab_checkwhere";temp+="leave="事假"andcheckdate%sgroupbyname)";temp+="sjdaysonemp.emp_name=sjdays.name";temp+="%s";//*/创建一个对话框,打开对话框属性窗口,将对话框的ID改为IDD_DLGCHECKSUM,将对话框标题改为“考勤汇总查询”。想对话框中添加3个静态文本框控件、3个下拉列表框控件、一个按钮控件和一个列表视图控件。分别设置文本框的Caption属性为“年”、“月”和“员工”,设置按钮的Caption属性为“退出”。添加UpdateList方法,用于更新考勤汇总查询的数据,实现代码如下:voidCCheckSum::UpdateList(){m_list.DeleteAllItems();this->UpdateData();CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr,temp,where,datestr,StartDate,EndDate; StartDate=m_yy+"-"+m_mm+"-1";EndDate.Format("DATEADD(month,1,"%s")",StartDate);datestr.Format("between"%s"and%s",StartDate,EndDate);//*/temp+="selectemp.emp_name,ROUND(isnull(works.workday,0),2)";temp+="workday,ROUND(isnull(lates.lateday,0),2)lateday,";temp+="ROUND(isnull(leaveearlys.leaveearlyday,0),2)leaveearlyday,";temp+="ROUND(isnull(bjdays.bjday,0),2)bjday,ROUND(isnull(sjdays.sjday,0),2)sjday";temp+="fromtab_Employeesemp";temp+="leftjoin";temp+="(selectsum(DATEDIFF(second,ontime,offtime))/60.0/60.0/8.0";temp+="asworkday,nameFromtab_checkwherecheckdate%sgroupbyname)";temp+="worksonemp.emp_name=works.name";temp+="leftjoin";temp+="(select(sum(DATEPART(Hour,latetime))*60*60+";temp+="sum(DATEPART(minute,latetime))*60+sum(DATEPART(second,latetime)))";temp+="/60.0/60.0/8.0aslateday,nameFromtab_checkwhere checkdate";temp+="%sgroupbyname)latesonemp.emp_name=lates.name";temp+="leftjoin";temp+="(select(sum(DATEPART(Hour,leaveearly))*60*60+";temp+="sum(DATEPART(minute,leaveearly))*60+sum(DATEPART(second,leaveearly)))";temp+="/60.0/60.0/8.0asleaveearlyday,nameFromtab_checkwhere";temp+="checkdate%sgroupbyname)leaveearlysonemp.emp_name";temp+="=leaveearlys.name";temp+="leftjoin";temp+="(selectisnull(sum(DATEDIFF(second,onleave,offleave))";temp+="/60.0/60.0/8.0,0)asbjday,nameFromtab_checkwhere";temp+="leave="病假"andcheckdate%sgroupbyname)";temp+="bjdaysonemp.emp_name=bjdays.name";temp+="leftjoin";temp+="(selectisnull(sum(DATEDIFF(second,onleave,offleave))";temp+="/60.0/60.0/8.0,0)assjday,nameFromtab_checkwhere";temp+="leave="事假"andcheckdate%sgroupbyname)";temp+="sjdaysonemp.emp_name=sjdays.name";temp+="%s";//*/// where.Format("whereemp.emp_name="%s"",m_emp);if(m_emp=="(全部)")str.Format(temp,datestr,datestr,datestr,datestr,datestr,"");elsestr.Format(temp,datestr,datestr,datestr,datestr,datestr,where);//*/dataset.Open(str,adLockUnspecified);for(inti=0;iItem["emp_name"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["workday"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["lateday"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["leaveearlyday"]->Value); m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["bjday"]->Value);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["sjday"]->Value);dataset.Next();}//*/}向对话框中添加OnInitDialog方法,在对话框初始化时设置列表视图控件的表头和列宽度,以及汇总查询条件选择控件的设置,实现代码如下:BOOLCCheckSum::OnInitDialog(){CDialog::OnInitDialog();inti=0;m_list.InsertColumn(i,"人员");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"工作总天数");m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,"迟到总天数");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"早退总天数");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"病假总天数");m_list.SetColumnWidth(i++,100);m_list.InsertColumn(i,"事假总天数");m_list.SetColumnWidth(i++,100);m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);intcuryear,curmonth;CTimetime(CTime::GetCurrentTime());curyear=time.GetYear();curmonth=time.GetMonth();charvalue[10];for(inty=2000;y<2100;y++){_itoa(y,value,10); m_cyy.InsertString(y-2000,value);}m_cyy.SetCurSel(curyear-2000);for(intn=1;n<=12;n++){_itoa(n,value,10);m_cmm.InsertString(n-1,value);}m_cmm.SetCurSel(curmonth-1);CADODataSetdataset;dataset.SetConnection(::GetConnection());dataset.Open("Select*Fromtab_Employees");m_cemp.InsertString(0,"(全部)");for(intindex=1;index<=dataset.GetRecordCount();index++){m_cemp.InsertString(index,(_bstr_t)dataset.GetFields()->Item["emp_name"]->Value);dataset.Next();}m_cemp.SetCurSel(0); UpdateList();returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSE} 第1章总结与展望考勤管理系统的开发过程,历经调研、系统分析、系统设计、系统实施以及开发文档的编写.整个过程遵循以UseCase为驱动的、体系构架为核心的面向对象分析和设计过程.在调研阶段,通过与部分企业的交流沟通和网络的综合搜索,了解目标系统的业务,挖掘其具体需求,最终整理出系统需求和拟建系统的模型.系统分析阶段,根据调研阶段整理出的文档,确定系统UseCase和活动者,描述各个UseCase,形成详细报告,定义系统构架.在此基础上,划分各个UseCase的开发迭代顺序,并按照这个顺序对每一个UseCase做近一步的分析并形成相关文挡.这个阶段的工作结束后,整个系统的大概框架浮现出来.系统设计阶段,根据系统分析阶段的工作成果,确定系统核心元素,引入外围元素,优化经过系统分析得来的框架的组织结构.在近一步的设计工作中,将引入的外围元素与系统的核心元素关联起来,完成外围元素对核心元素的支撑作用.在更进一步的设计工作中,对系统核心元素进行更加详细的刻画,用以指导系统实施阶段的工作.至此,整个系统的框架已经清晰化.系统实施阶段,以分析设计阶段的工作成果为指导,选择开发工具,设定系统运行环境,进行编码工作,制定系统测试计划,进行系统测试.相关文档编写,该阶段工作主要是制定系统维护计划,编写系统使用说明,对系统综合性能的评价.历经以上几个阶段,系统开发完毕,主要成果有考勤管理系统.本系统操作简便快捷,系统界面美观.新的考勤管理系统的实施,不仅把HR人员从考勤的具体事务中解放出来,而且也推动了全员对人事管理的参与和互动.HR人员的可以把工作重心可以放在服务员工、支持公司管理层的战略决策上,放在公司最重要的资产—员工和员工的集体智慧的管理上等核心业务上来.系统基本满足了考试业务和系统的目标需求,但还有一些不足之处有待完善,由于本人网络知识的不足,导致了系统弱化了对网络的依赖, 此次毕业设计,使我把以往在书本上学到的知识应用于实践,充分的体会到了一个软件开发的全过程,对此,使我收益非浅.对于系统的不足之处,在今后的学习生活中,会进一步改善和加强.(没有标注的地方请用格式刷查看) 参考文献[1]郝建华,江修富,许斌.全角 实心GMSK调制解调的数字实现方法[J].装备指挥技术学院学报,2002,第13卷,第6期:91-93.[2]娄莉.GMSK数字调制的仿真与分析[J].现代电子技术,2004,第18期:66-68.[3]振华,军,王宇.GMSK全数字调制[J].空间电子技术,2002,第2期:23-28.上下行首字对齐[4]樊昌信,甫翊,徐炳祥,吴成柯.通信原理[M].市:国防工业,2001.[5]科技,CPLD、CPLD应用开发技术与工程实践[M].市:人民邮电,2005.[6]StephenPrata,C++PrimerPlus中文版(第五版)[M].市:人民邮电,2005.[7]宋大雷,东来,徐殿国,王炎.IEEE1284标准介绍[J].电子计算机与外部设备,第22卷,第1期,21-23.[8]徐宏慧,高有行.IEEE1284并口协议分析[J].计算机工程与设计,2002,第23卷,第9期,11-14.[9]放吾.IEEE1284并行接口标准与应用[J].计算机应用,2001,第21卷,第1期,52-54.[10]晨燕,吕淑琴.增强型并行口(EPP)设计原理[J].经济学院学报,2000,第23卷,第6期,647-650.[11]SenjyuT,TakaraH,UezatoK.One-Hour-Aheadloadforecastingusingneuralnetwork[J].IEEETrans.onPowerSystems,2002,17(1),113-118.[12]VapnikVN.Thenatureofstatisticallearningtheory[M].NewYork:Springer,1999. 附录黑体,二号,居中(1)设计实验用板正文,宋体,小四(2)设计原理图