资源描述
.目 录摘 要2正 文31、问题描述32、需求分析42.1系统需求和功能42.2数据流程图42.3数据字典63、系统总体设计73.1概念结构设计(E-R图)73.2由E-R图转换得到的关系模式73.3逻辑结构设计(数据库的设计)84 、详细设计104.1人事管理系统的主要功能:104.2 人事管理系统的主要功能程序流程图104.3用户界面与程序设计125、系统测试155.1测试方法155.2测试用例156、软件使用说明书17总 结19参考文献20致 谢21附件 部分原程序代码22摘 要当今社会人员流动越来越频繁,使得档案管理工作也变得越来越复杂。如何管理号企业人事的信息,成为企业管理的一个大问题。如何实现档案管理的自动化,无疑是公司的管理部门带来很大的方便。人事管理系统正是一个为适应当前各个行业对人力资源信息管理的这个迫切需求而设计开发的软件系统,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求保持数据的一致性和完整性以及好的数据安全性;后者设计应用程序可以方便地实现公司人事档案的管理,易使用、检索迅速、查找方便。这些优点能够极大的提高人事档案的管理的效率,也是提高公司人事管理,更好的为公司服务。关键词: 人事管理;数据库;管理系统正 文1、 问题描述该设计要求学生以企业人事管理业务为背景,设计、开发一套“企业人事管理系统”软件。通过该题目的设计、开发,使学生初步得到数据库开发的训练,全面培养软件开发过程中的分析、设计、编码、测试及文档规范书写的能力,得到软件开发的综合训练,提高解决实际问题的能力。2、需求分析2.1系统需求和功能设计一个人事管理系统,使系统满足以下需求和功能1)根据企业人事管理的需要,对企业以及企业中员工的信息进行添假删除等操作,并能对人事档案进行浏览,对人事资料进行查询,对人事资料进行统计。为企业的人事管理提供一个便利的管理系统。2)、系统功能包括:a系统管理(设置用户和退出系统)。b基础数据管理(民族档案设置,职工类型设置,文化程度设置,政治面貌设置,部门类别设置,工资类别设置,职称类别设置,职务类别设置)。c人事档案管理(人事档案浏览,人事资料查询,人事资料统计)。数据库管理(数据库的备份与恢复)。2.2数据流程图数据流图由四种基本的元素构成:数据流(Data Flow),处理(Process),数据存储和数据源(数据终点)。数据流(Data Flow):为具有名称且有流向的数据,用标有名称的箭头表示,一个数据可以是记录、组合项或基本项。处理(Process):表示对数据所进行的加工和变换,在图中用矩形框表示。指向处理数据流为该处理的输入数据,离开处理的数据为处理的输出数据。数据存储:表示用文件方式或数据库形式所存储的数据,堆砌进行的存取分别以指向或离开数据存储的箭头表示。数据源及数据终点:表示数据的来源或数据的去向,可以是一个组织或人员,它处于系统范围之外,所以又称它为外部实体,它是为了帮助理解系统界面而引入的,一般只出现在数据流图的起点和终点。数据流程图如图2.1所示:管理员接受信息更新 系 统信 息个人信息处理事务用户信息信息信息查询图2.1数据流程图2.3数据字典数据字典是关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合。由于本次设计是小型软件系统的开发,所以采用卡片形式书写数据字典。每张卡片上保存描述一个数据的信息这样做更新和修改起来比较方便,而且能单独处理描述每个数据的信息。下面将列出若干数据元素的数据卡片信息。数据字典卡片如下: 名称:职工信息表别名:描述:对员工基本情况的描述定义:员工信息表=员工号+姓名位置:显示到屏幕保存到磁盘 名字:管理员名称别名:描述:惟一地标识一门特定管理员的关键域定义:管理员名称=10字符位置:管理员信息表 名称:员工表别名:描述:对整体员工基本情况的描述定义:员工信息表=所有员工的基本信息的总和位置:显示到屏幕 保存到磁盘名字:员工家庭表别 名: 描述:惟一地标识一个员工的家庭状况定义:家庭名称=10字符位置:家庭信息表 员工信息表 3、 系统总体设计3.1概念结构设计(E-R图)经分析人事管理系统的E-R图如图3.1所示:员工用户属于部门名称负责人属于 职务临时职称正式用户口令用户名籍贯姓名性别学历婚姻状况编号图3.1 人事管理系统E-R图3.2由E-R图转换得到的关系模式用户(用户名,密码,是否管理员)民族档案设置(民族编号,民族名称)职工类型设置(职工类型号,职工类型名称)文化程度设置(文化程度编号,文化程度名称)政治面貌设置(政治面貌编号,政治面貌名称)部门类别设置(部门类别编号,部门类别名称)工资类别设置(工资类别编号,工资类别名称)职称类别设置( 职称类别编号,职称类别名称)职务类别设置(职务类别编号,职务类别名称)职工表(职工编号,职工名,出生日期,年龄,民族,婚姻状况,身份证,家庭电话,电子邮箱,手机,籍贯,地址,毕业学校,所在部门,政治面貌,职称类别,职务类别,工资类别,文化程度)职工家庭情况(编号,员工工号,成员姓名,关系,出生日期,所在部门,担任职务,政治面貌,手机)3.3逻辑结构设计(数据库的设计)建立数据库本设计用Microsoft Office Access 2003作为后台数据库,在MS SQL Server 2000中创建一个名为Manager1的数据库,并在其中建立逻辑设计中涉及的表. 建立表:在Access中,可以查看所建立的表,并添加适当测试数据用户表如图3.2所示: 图3.2 用户表民族挡案表如图3.3所示: 职工类型表如图3.4所示: 图3.3民族档案表 图3.4职工类型表文化程度表如图3.5所示 : 政治面貌表如图3.6所示: 图3.5 文化程度表 图3.6 政治面貌表部门类别设置表如图3.7所示: 工资类别表如图3.8所示: 图3.7 部门类型设置表 图3.8 工资类别表职称类别表如图3.9所示: 职务类别表如图3.10所示: 图3.9 职称类别表 图3.10 职务类别表4 、详细设计4.1人事管理系统的主要功能:1教师各种信息的输入,包括教师基本信息,课程信息,论文信息,项目信息的输入等。2教师业务档案管理的各种信息查询,修改和维护。3操作日志的管理。4教师业务档案管理系统的使用帮助。4.2 人事管理系统的主要功能程序流程图系统操作流程图:错误信息系统主界面系统登录界面系统管理输入操作员及密码数据库密码错误检查密码正确功能界面功能处理图5.1 系统操作流程图人事管理系统员工各种信息的查询功能流程图如图5.2所示:用户输入查询条件查询相应信息信息确定是否存在重新查询结束 是 否 否 是 否 是 图5.2查询功能流程图 3.删除功能流程图如图5.3所示:重新删除管理员删除信息确定结束删除成功重新删除管理员删除信息确定结束删除成功重新删除管理员删除信息确定结束删除成功 是 是 否 否 否 是 图5.3删除功能流程图4.3用户界面与程序设计1.一般交互设计一般交互涉及信息显示、数据输入和系统整体控制等方面。(1)一致性为客户交互界面中的菜单选择、命令输入、数据显示以及众多的其他功能,使用一致的格式。在设计的过程中,基本上保持了系统的格式一致。(2)信息的反馈向用户及时提供视觉和听觉的信息反馈,以保证在用户和系统之间及时地建立双向通信。在本系统设计过程中,基本做到了信息的及时反馈,在信息显示的大部分窗体中包括了刷新按钮,会对数据库中的数据进行及时地显示。另外,在进行错误操作是,会弹出提示窗口并发出警告提示音。(3)执行有较大影响的操作前提示用户确认在设计过程中,如果用户要执行删除操作,以及对数据库的读写操作时,都会有窗体弹出询问继续操作或者予以提示。(4)减少两次操作间需要记忆的内容为了避免用户为下一步操作而记忆大量数据,所以在设计过程中在需要数据传递的窗体中设置全局变量,来传递数据。(5)对话、移动和思考的效率尽量减少用户击键的次数,在设计时考虑到了用户屏幕的布局以减少用户鼠标移动的距离,尽量避免用户在操作中发生疑问的情况。(6)允许错误允许用户的误操作尽量不对系统造成伤害。(7)按功能对动作分类,并据此设计屏幕布局屏幕布局尽量将软件所具有的所有功能在主页面展示,界面一目了然。2.信息显示设计 应当尽量为用户提供的界面显示时完整的、明确的和容易理解的。这样才能满足用户的需求。(1)只显示与当前用户有关的信息在用户操作有关系统的特定功能的信息时,不必看到与之无关的数据、菜单和图形。(2)使用一致的标记、标准的缩写和可预知的颜色为了使系统所表达的含义准确、无误,就必须适用一致的标记、标准的缩写和可以预知的缩写,这样用户就无需参照其他信息源就能理解,而正确地适用软件。(3)产生有意义的错误信息对于系统在运行过程中产生的错误尽量给用户返回一个容易理解的错误信息,以使用户保持对系统的信任,和系统的可用性。(4)使用窗口分隔不同类型的信息使用不同的窗口显示、保存不同类型的信息。(5)高效率的使用显示屏当使用多窗口时,应该有足够的空间使得每个窗口至少都能显示出一部分。此外,屏幕的大小应该选得和应用系统的类型相配套。在各个显示数据的窗口中,由于数据窗体项目较多,所以在数据窗体空间中较多的是用了垂直和水平滚动条,以保证信息的全面正确显示。3.数据输入设计用户的大部分时间用在选择菜单命令、键入数据和向系统提供输入。在系统中,键盘是主要的输入介质,但是鼠标等设备的也是重要的输入手段,所以,对于他们的数据输入操作有如下约定:(1)保持信息显示和数据输入间的一致性为了方便用户的使用,鼠标应当尽量减少操作的幅度。(2)保持显示信息和输入信息之间的一致性对于用户来说,要保证其输入的数据在显示上与其他显示的视觉特征(例如:文字大小、颜色、位置等)要一致。对于不同类型的用户在登录到系统后,由于有不同的权限,所以在主界面中会有一些项目受到限制而无法使用,所以要使这些项目不发生作用,以保证系统安全。5.系统测试5.1测试方法软件的测试方法有两种,一种是黑盒测试(功能测试),另外一种是白盒测试(结构测试)。白盒测试 在系统的实现过程和程序的调试过程中,遇到很多问题,此时应该对程序仔细阅读,设置断点,进行白盒测试。黑盒测试系统完成后,要进行黑盒测试,即设置一些测试用例,对系统的各个模块的功能进行测试,看能否得到正确的输出。在这里以管理员的身份登录系统,以便对系统的各个功能模块进行测试。5.2测试用例登陆测试:图5.1 登陆界面密码错误时:图5.2 登陆错误提示界面查询职工表:图5.3 查询职工表职工家庭情况表:图5.4 职工家庭情况表6、软件使用说明书1、运行环境:Windows xp操作系统,Visual Studio20052、使用方法在安装了Visual Studio2005的系统,点击可执行文件,这样就自动在所使用的计算机中配置好ODBC数据源,并进入登陆界面。可以使用帐号admin和密码admin登陆。登陆测试界面如图6.1所示:图6.1 登陆界面密码正确时正确的进入主界面的界面如图6.2所示:图6.2 主界面人事档案查询功能测试的界面如图6.3所示:图6.3 人事查询界面总 结在这两周课程设计中,我的课程设计题目是企业人事管理系统。通过该题目的设计过程,我加深了对VC+、ACCESS 数据库知识点的理解,对数据库建表的基本操作的实现有所掌握,对课本中所学的各种数据库结构进一步理解和掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力,也培养了自己独立思考问题和解决问题的能力。我的同学在设计过程中为我发现许多错误,也帮我解决了很多问题,在此我衷心的感谢他们。在以后的学习中我会更加注意各个方面的能力的协调发展。在课程设计时遇到了很多的问题,在老师的帮助,和对各种资料的查阅中,将问题一个一个的解决了,培养了我自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。一个人要完成所有的工作是非常困难和耗时的。在以后的学习中我会更加注意各个方面的能力的协调发展。在课程设计时遇到了很多的问题,在老师的帮助,和对各种资料的查阅中,将问题解决,培养了我自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。两周的课程设计很短暂,但其间的内容是很充实的,在其中我学习到了很多平时书本中无法学到的东西,积累了经验,锻炼了自己分析问题、解决问题的能力,并学会了如何将所学的各课知识融会、组织、来配合学习,这两周中我收益很大,学到了很多。参考文献1张海藩,软件工程导论M.清华大学出版社,2003年12月2张海藩.软件工程导论学习辅导M.清华大学出版社,2004年9月3萨师煊,王珊.数据库系统概论M.清华大学出版社,2002年2月4汪孝宜,刘中兵,徐佳晶等.JSP数据库开发实例精粹M.电子工业出版社,2005年1月5陈磊,郭斌,李翔. PowerBuilder 9 数据库项目案例导航,清华大学出版社 6廖疆星,张艳钗,肖金秀.PowerBuilder & SQL Sever 2000数据库系统管理与实现M.冶金工业出版社7卫海,黄浩.PowerBuilder 9.0课程设计案例精编M.8 Sybase中国网站:http:/www.S9 PB导航站:10 PB编程俱乐部: .页脚. 致 谢附件 部分原程序代码人事资料统计主要代码如下:void CStatDlg:OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Add your control notification handler code hereCString strSQL;CString strValue=0;CDatabase db;db.Open(_T(Manager1);CRecordset recordset(&db);UpdateData(TRUE);/获得统计类型int nType = m_ctrList.GetSelectionMark();int i=0;switch(nType)case 0:/按性别统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);m_ctrResult.DeleteColumn(0);m_ctrResult.InsertColumn(0,性别);m_ctrResult.InsertColumn(1,人数);m_ctrResult.SetColumnWidth(0,100);m_ctrResult.SetColumnWidth(1,100);strSQL=select count(ID) as num ,sex from person group by sex;/MessageBox(strSQL);if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;while(!recordset.IsEOF()recordset.GetFieldValue(sex,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);/MessageBox(strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;case 1:/按年龄统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);m_ctrResult.DeleteColumn(0);m_ctrResult.InsertColumn(0,年龄);m_ctrResult.InsertColumn(1,人数);m_ctrResult.SetColumnWidth(0,100);m_ctrResult.SetColumnWidth(1,100);strSQL=select count(ID) as num ,age from person group by age;if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;while(!recordset.IsEOF()recordset.GetFieldValue(age,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;case 2:/按民族统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);m_ctrResult.DeleteColumn(0);m_ctrResult.InsertColumn(0,民族);m_ctrResult.InsertColumn(1,人数);m_ctrResult.SetColumnWidth(0,100);m_ctrResult.SetColumnWidth(1,100);strSQL=select count(ID) as num ,folk from person group by folk;if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;while(!recordset.IsEOF()recordset.GetFieldValue(folk,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;case 3:/按籍贯统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);m_ctrResult.DeleteColumn(0);m_ctrResult.InsertColumn(0,籍贯);m_ctrResult.InsertColumn(1,人数);m_ctrResult.SetColumnWidth(0,100);m_ctrResult.SetColumnWidth(1,100);strSQL=select count(ID) as num ,native from person group by native;if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;while(!recordset.IsEOF()recordset.GetFieldValue(native,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;case 4:/按职务类别统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);m_ctrResult.DeleteColumn(0);m_ctrResult.InsertColumn(0,职务);m_ctrResult.InsertColumn(1,人数);m_ctrResult.SetColumnWidth(0,100);m_ctrResult.SetColumnWidth(1,100);strSQL=select count(ID) as num ,duty from person group by duty;if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;while(!recordset.IsEOF()recordset.GetFieldValue(duty,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;case 5:/按职称类别统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);m_ctrResult.DeleteColumn(0);m_ctrResult.InsertColumn(0,职称);m_ctrResult.InsertColumn(1,人数);m_ctrResult.SetColumnWidth(0,100);m_ctrResult.SetColumnWidth(1,100);strSQL=select count(ID) as num ,technical from person group by technical;if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return;while(!recordset.IsEOF()recordset.GetFieldValue(technical,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;case 6:/按文化程度统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);m_ctrResult.DeleteColumn(0);m_ctrResult.InsertColumn(0,文化程度);m_ctrResult.InsertColumn(1,人数);m_ctrResult.SetColumnWidth(0,100);m_ctrResult.SetColumnWidth(1,100);strSQL=select count(ID) as num ,education from person group by education;if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;while(!recordset.IsEOF()recordset.GetFieldValue(education,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;case 7:/按政治面貌统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);m_ctrResult.DeleteColumn(0);m_ctrResult.InsertColumn(0,政治面貌);m_ctrResult.InsertColumn(1,人数);m_ctrResult.SetColumnWidth(0,100);m_ctrResult.SetColumnWidth(1,100);strSQL=select count(ID) as num ,political from person group by political;if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;while(!recordset.IsEOF()recordset.GetFieldValue(political,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;case 8:/按所在部门统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);m_ctrResult.DeleteColumn(0);m_ctrResult.InsertColumn(0,部门);m_ctrResult.InsertColumn(1,人数);m_ctrResult.SetColumnWidth(0,100);m_ctrResult.SetColumnWidth(1,100);strSQL=select count(ID) as num ,dept from person group by dept;if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;while(!recordset.IsEOF()recordset.GetFieldValue(dept,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;case 9:/按职工类型统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);m_ctrResult.DeleteColumn(0);m_ctrResult.InsertColumn(0,职工类型);m_ctrResult.InsertColumn(1,人数);m_ctrResult.SetColumnWidth(0,100);m_ctrResult.SetColumnWidth(1,100);strSQL=select count(ID) as num ,isworker from person group by isworker;if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;while(!recordset.IsEOF()recordset.GetFieldValue(isworker,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;case 10:/按工资类型统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);m_ctrResult.DeleteColumn(0);m_ctrResult.InsertColumn(0,工资类型);m_ctrResult.InsertColumn(1,人数);m_ctrResult.SetColumnWidth(0,100);m_ctrResult.SetColumnWidth(1,100);strSQL=select count(ID) as num ,aboutpay from person group by aboutpay;if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;while(!recordset.IsEOF()recordset.GetFieldValue(aboutpay,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;case 11:/按婚姻状况统计m_ctrResult.DeleteAllItems();m_ctrResult.DeleteColumn(1);strSQL=select count(ID) as num ,ismarry from person group by ismarry;if(!recordset.Open(CRecordset:forwardOnly,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;while(!recordset.IsEOF()recordset.GetFieldValue(ismarry,strValue);m_ctrResult.InsertItem(i,strValue);recordset.GetFieldValue(num,strValue);m_ctrResult.SetItemText(i,1,strValue);i+;recordset.MoveNext();recordset.Close();break;default:return;UpdateData(FALSE);*pResult = 0;
展开阅读全文