《工资管理系统设计.docx》由会员分享,可在线阅读,更多相关《工资管理系统设计.docx(48页珍藏版)》请在三一办公上搜索。
1、 经济管理学院 数据库综合训练课程设计课程设计题目 工资管理系统专 业 班 级 信管L032学 生 姓 名 路丹学 号 031607224指 导 教 师 陈军霞 张娜萍2006年04 月08 日1. 问题描述1.1背景随着经济的发展,企业正向着大型化、规范化发展,而对于大中型企业,员工、职称等跟工资管理有关的信息随之急剧增加,在这种情况下,单靠人工来处理员工的工资显得力不从心,而且极易出错。该系统的具体任务就是设计一个企业工资的数据库管理系统,由计算机来代替人工执行一系列诸如增加新员工、删除旧员工、工资修改、查询、统计、打印等操作。1.2数据需求l 尽量利用企业现有的软硬件环境,采用先进的管理
2、系统开发方案,达到充分利用企业现有资源,提高系统开发水平和应用效果的目的;l 系统符合企业工资管理的规定,满足企业相关人员日常使用的需要,并达到操作过程中的直观、方便、使用、安全等要求;l 系统采用模块化程序设计方法,既便于系统功能的各种组合和修改,又便于未参与开发的技术维护人员进行补充、维护。l 系统具备数据库维护功能,及时根据用户需求进行数据的添加、删除、修改、备份等操作。1.3事务需求通过使用该系统,使企业的工资管理工作系统化、规范化、自动化,从而提高企业管理效率。开发的总体任务是使办公人员可以轻松快捷的完成工资管理任务。2. 解决方案(或数据库系统设计)2.1 E-R模型设计本实例根据
3、上面的设计规划出的实体有:员工实体、员工工资实体、工资等级实体、部门岗位体、工资实体、公司福利实体。实体和实体之间的关系E-R图如图1-1所示。员工员工工资基础工资岗位工资工龄工资福利费用对应包含对应对应对应对应工资等级部门岗位工龄公司福利 图1-1 实体之间关系E-R图 2.2 数据字典数据库需求分析是数据库设计的第一个阶段,是非常重要的一个阶段。这个阶段主要是确定基本数据、数据结构以及数据处理的流程,组成一份详尽的数据字典,为以后进一步设计打下基础。在仔细调查企业工资管理过程的基础上,我们得到本系统所处理的数据流程,如图1-2所示。级别工资设定岗位工资设定工龄工资设定工资基本设定员工信息
4、员工工资 图1-2 数据流程图 通过对企业工资管理的内容和数据流程分析,针对本实例,我们设计的数据项和数据结构如下:l 员工基本情况。包括的数据库项有员工号、员工姓名、性别,所在部门、身份证号、生日、籍贯、国籍、民族、婚姻状况、健康状况、参加工作时间、员工状态、状态时间、家庭住址、联系电话等。l 工资级别和工资金额。包括的数据库项有工资等级、工资额。l 企业部门及工资岗位信息。包括的数据库项由部门名称、工作岗位名称、工作岗位工资等。l 工龄的工资金额。包括的数据库项有工龄及对应工资额。l 公司福利表。包含的数据库项有福利名称、福利值。l 工资信息。包含的数据库项有员工号、员工姓名、员工基础工资
5、、员工岗位工资、员工工龄工资、公司福利、员工实得工资。2.3 数据库逻辑结构设计在实体以及实体之间关系的基础上,形成数据库中的表格以及各个表格之间的关系。工资管理系统数据库中各个表格的设计结果见表1-6所示。每个表格表示在数据库中的一个表(只列出与本例相关的字段)表11为员工基本状况表PERSONNEL 员工基本状况表列名数据类型可否为空说明PIDCHARACTER(3)NOT NULL员工号(索引)PNAMECHARACTER(10)NULL员工姓名PSEXCHARACTER(2)NULL员工性别PDEPTCHARACTER(10)NULL所在部门PJOBCHARACTER(10)NULL所
6、在岗位PINDATECHARACTER(2)NULL工龄PRANKCHARACTER(2)NULL工资等级表12为工资等级表PANK工资等级表列名数据类型可否为空说明RNAMECHARACTER(2)NOT NULL工资等级(索引)RSALARYNUMERIC(10,2)NULL相应工资额表13为工作岗位情况表DEPT 工作岗位情况表列名数据类型可否为空说明JOBNAMECHARACTER(10)NULL工作岗位名称(索引)JOBSALARYNUMERIC(10,2)NULL岗位工资表14为工龄工资表GONGLING工龄工资表列名数据类型可否为空说明GNAMECHARACTER(2)NOT N
7、ULL工龄(索引)GSALARYNUMERIC(10,2)NULL 工龄工资额表15为公司福利表WELFARE为公司福利表列名数据类型可否为空说明WNAMECHARACTER(10)NOT NULL福利名称(索引)WMONEYNUMERIC(10,2)NULL福利费用表16为系统的用户口令表系统的用户口令表USER_PSWD列名数据类型可否为空说明TMS_USERCHARACTER(10)NOT NULL用户名(索引)TMS_PSWDCHARACTER(10)NOT NULL口令3系统实现3.1开发环境开发工具:Visual FoxPro 6.0;运行环境:Windows 9X 或Window
8、s 2000。3.2系统流程图系统功能分析l 系统数据初始化;l 员工基本信息数据的输入;l 员工基本信息数据的修改、删除;l 企业工资的基本设定;l 员工工资的浏览;l 员工个人工资表的查询;l 工资报表的打印 在系统功能分析的基础上,得到如图1-3所示的系统功能模块图。 工资管理系统员工信息工资基本设定工资汇总员工查询工龄工资资料输入员工增删公司福利岗位工资基础工资工资汇总个人工资查询浏览打印 图1-3系统功能模块图3.3程序调试情况在设计的过程中,预览中发现报表的行之间有空白,无法连接成表,如图1-41所示。图1-42 错误的报表这是由于报表栏中的细节栏设计又有误,下面是对应的设计,如图
9、1-42所示。可以看出两个空白是相同的,因此要想打印出没有空白的表,应将小细节的底框紧贴在表的下缘,如图1-43所示。图1-43 错误的细节设置3.4 数据库结构的实现在需求分析、概念结构设计的继承上得到数据库的结构之后,我们就可以在Visual FoxPro 数据库系统中实现该逻辑结构。首先建一个名为salary(工资)的项目,保存磁盘中。例如D:salary.可以直接在Visual FoxPro的文件中选择“新建”“项目”。打开salary项目后,在项目管理器中展开数据文件夹,鼠标选中数据库,单击右键的“新建”按钮,如图1-4所示,存储为D:salarydatebasesalary.dbc
10、。 图1-4 新建数据库在弹出的数据库设计器中单击鼠标右键,选择“新建表,如图1-5所示。为数据库添加数据表,表的具体内容见表1-1表1-6。下面以表6为例。 图1-5 新建数据表在选择“新建表”命令后,在弹出的对话框中将表存储为:D:salarydatebasetms.dbf。在弹出的表设计器中填写表的内容,如图1-6所示。 图1-6 设计表的内容与表1-6 比较,可以发现表的字段名就是列名。要注意的是在以后的编写程序中对数据库的数据的操作通常是引用表的字段,因此在设计字段是要挑选容易理解的名称。字段设置完成后,单击“确定”按钮后为表输入数据。3.5各个功能模块的创建经过前面对系统功能的分析
11、,我们将企业工资管理系统分为4个模块:系统主界面、员工信息管理、工资基本设定和工资汇总。3.5.1系统主界面的设计为了让使用者有一个轻松操作的界面,系统的主界面设计要求界面友好、功能分块明确、美观大方。下面将以主界面的设计为例,仔细讲解表单的创建。首先,展开项目管理器中的文档,选中表单,单击右侧“新建”按钮。如图1-7所示。 图1-7 新建表单在弹出的对话框中单击“新建”按钮后,会弹出“表单设计器”的界面,如图1-8所示。 图1-8 为设计的表单可以根据界面的需要向其中添加控件如图1-9所示。 图1-9 向表单中添加控件更改各个控件的属性值为所属值,各更改值见表1-7。表1-7 控件属性更改值
12、控件Caption Alignment Picture StretchForm1企业工资管理系统Label1欢迎使用2-中央Command员工基本信息Command员工基本设定Command工资汇总Command个人工资设定Command退出Image1D:salarymain.jpg2-变比填充Caption属性表示控件的显示名,是为了使用者方便特意设计的名称,为一些常用的提示信息。Alignment为控件中Caption的位置状态,对于Label(标签),有“0-左(缺省)”、“1-右”、“2-中央”等3种设置。另外,设置Label的Font(字体)和Fontsize(字体大小)属性可以改
13、变Caption显示的字体及大小。在Picture中可以把控件的界面设为图象,以便使用者能更形象地使用所开发的软件。对应Image(图象)控件,则表示显示在其中的图象。其属性值应为要显示的图象的路径和文件名。并应设置其Streth属性为“2-变比填充”以使图象能正确显示。更改之后的表单如图1-10所示。 图1-10 更改后的表单要注意的是向容器中添加按钮时候 ,必须先添加容器,然后在容器单击鼠标右键,选择编辑,此时容器边缘变为绿色,表明此时容器正处于编辑状态。此时添加按钮到容器中才能是按钮真正处于容器中,如果直接添加,则按钮实际上处于与容器同一层次上。可以通过查阅表单的结构层次来理解,如图1-
14、11所示图1-11 表单中的控件的结构控件添加结束后,表单并未完成设计,此时的表单运行后会发现只有一个空壳,单击其中的按钮没有任何反应。因此,此时需要为表单设计事件响应。选中Command1(按钮1),双击后弹出控件“方法程序”对话框,如图1-12所示. 图1-12为控件Command1设置Click 事件程序填写代码如下:Do from salaryformpersonnel*打开下级表单pensonnel.scx, salaryformpersonnel为 它的路径对Command2(按钮2)、Command3(按钮3)、Command4(按钮4)、Command5(按钮5)、进行同样的操
15、作。Command2的Click代码为:do form salaryformdataformat*打开下级表单dateformatCommand3的Click代码为:do form salaryformresult*打开下级表单resultCommand4的Click代码为:do form salaryformgrcx*打开下级表单grectCommand5的Click代码为:thisform.releaseclear events*释放表单,结束程序为了使表单更富动感,这里设计了一个闪烁效果,闪烁的对象为“Label”。选择Timer(记时器)控件,双击后填写其Timer的事件代码:if i
16、=0 thisform.label1.visible=.F.*使Label1不可见i=1elsethisform.label1.visible=.T.*使Label1可见i=0endif设置Timer的Interval属性为“750”。其作用是控制Timer的执行间隔时间,单位为ms。既是每隔0.75s执行一次Timer控件的Timer事件。应用类型的方法还可以随时间推移转变Image1控件里的图像。注意Timer事件代码中使用了变量i来控制,因此应先声明该变量。为表单的Init事件添加代码:Public ii=0*声明全局变量i到此为止,本程序的主界面已设计完成,记住要储存为“D:salar
17、yformksjm.scx”,以后设计的表单都会放在“D:salaryform”目录下,以便其他程序员管理。接下来进入其他表单的设计。3.4.2员工信息模块的设计本模块包含的功能有:员工信息浏览、增加删除修改员工记录、根据查询条件查询员工记录、显示查询结果。要实现的功能较多,一个表单不可能容纳下所有空件,所以需要使用表单集或页框。这里使用页框来实现。新建表单Personal,存储”D:salaryformpersonnel.scx”。直接拉伸表单至合适大小。向表单中加入控件,如图1-13所示 图1-13 表单的基本控件本表单需要对数据库中的表进行操作,因此必须将该表加入到表单的数据环境中。在表
18、单中单击鼠标右键,选择”Date Enviroment”(数据环境),在弹出的对话框中添加需要的表,如本表需要添加表”Personnel”。1.“一览”子页面的设计将表单数据环境中的表”Personnel”的字段添加到表单中,如图1-14所示。 图1-14推拽字段到表单中注意,此时添加到表单的字段处于与页框同一层次,将其添加到页框的子页面1种,对页框的操作方法与容器类似。向子页面1中添加控件,如图1-15所示。 图1-15 子页面1控件下面列出更改值,如图表1-8所示 控件属性更改值表控件CaptionAlignmentPageCountFontSizeForm1员工信息Label1员工信息2
19、-中央Page1一览3华文彩云Command1增加新记录Command2修改这条记录Command3删除这条记录Command4取消操作Command5退出如图1-15所示,该页面使用了,“类”,在Visual FoxPro 中使用类可以大大节省开发时间,简化系统的设计工作,并方便系统的维护和修改。如图1-16位添加的类导航条。 图1-16 查询子页面该导航条包含4个基本功能。“上一个”按钮使记录后退一个;“第一个”按钮使记录后退至表首;“下一个”按钮使记录前进;“最后一个”按钮使记录前进至表尾;下面给出按钮的Click事件代码。按钮“上一个”的Click事件代码:Skip -1*记录向后退一
20、个If bof()*判断是否为第一个记录,如是,bof()返回“真”(.T.)Messagebox(已是第一个记录,48,信息窗口)mand1.enable=.f.mand2.enable=.f.skipelse mand1.enable=.t.mand2.enable=.t.endif mand3.enable=.t.mand4.enable=.t.*根据实际情况给出各个按钮的状态Thisfrom.refresh在按钮“第一个”的Click事件中输入如下代码:goto topmand1.enable=.f.mand3.enable=.t.mand4.enable=.t.*根据实际情况给出各个
21、按钮的状态Thisfrom.refresh在按钮“下一个”的Click事件中输入如下代码:SkipIf eof()*判断是否最后一个记录,如是,eof()返回“真”(.T.)Messagebox(已是最后一条记录,48,信息窗口)skip -1mand3.enable=.f.mand4.enable=.f.elsemand3.enable=.t. mand4.enable=.t.endifmand1.enable=.t.mand2.enable=.t.*根据实际情况给出各个按钮的状态Thisform.refresh在按钮“最后一个”的Click事件如下代码:goto bottommand3.e
22、nable=.f.mand1.enable=.t.mand2.enable=.t.*根据实际情况给出各个按钮的状态thisform.refresh为保证表中的数据不被误操作修改,请将页面中的各文本框的“Enabled”属性设为“.F.”。按钮“取消操作”的“Enabled” 属性设为“.F.”。为“增添新记录”添加Click事件代码:thisform.pageframe1.page1.fy1.enabled=.F.*使导航条不可用mand2.enabled=.F.*使“修改”按钮不可用mand3.enabled=.F.*使“删除”按钮不可用mand4.enabled=.T.*使“取消”按钮可用
23、if mand1.caption=增加新记录thisform.pageframe1.page1.txtpid.enabled=.T.thisform.pageframe1.page1.txtpname.enabled=.T.thisform.pageframe1.page1.txtpsex.enabled=.T.thisform.pageframe1.page1.txtpjob.enabled=.T.thisform.pageframe1.page1.txtpindate.enabled=.T.thisform.pageframe1.page1.txtprank.enabled=.T.*使各文
24、本框可用append blank*添加空行到表的末尾mand1.caption=增加确认*将本控件的Caption更改为“增加确认”thisform.pageframe1.page1.refresh*刷新本页面thisform.pageframe1.page1.txtpid.setfocus*将鼠标焦点设定到文本框1 elsegetid=alltrim(thisform.pageframe1.page1.txtpid.value)getname=alltrim(thisform.pageframe1.page1.txtpname.value)getsex=alltrim(thisform.pa
25、geframe1.page1.txtpsex.value)getjob=alltrim(thisform.pageframe1.page1.txtpjob.value)getindate=alltrim(thisform.pageframe1.page1.txtpindate.value)getrank=alltrim(thisform.pageframe1.page1.txtprank.value)if empty(getid) or empty(getname) or empty(getsex) or empty(getjob) or empty(getindate) or empty(g
26、etrank)*判断填入的资料是否齐全messagebox(资料不足,48,错误)如果错误,弹出提示对话框elsemand1.caption=增加新记录*将本控件的Caption更改为“增加新记录”tableupdate(.t.)*表单的更改确认tableupdate(.t.)thisform.pageframe1.page1.txtpid.enabled=.F.thisform.pageframe1.page1.txtpname.enabled=.F.thisform.pageframe1.page1.txtpsex.enabled=.F.thisform.pageframe1.page1.
27、txtpjob.enabled=.F.thisform.pageframe1.page1.txtpindate.enabled=.F.thisform.pageframe1.page1.txtprank.enabled=.F.thisform.pageframe1.page1.fy1.enabled=.T.mand2.enabled=.T.mand3.enabled=.T.mand4.enabled=.F.*恢复本子页面的各控件的状态endifendif上段代码的功能是添加一个新的员工的信息到数据库中。为“修改这条记录”按钮添加Click事件代码:mand1.enabled=.F.*使“增加”
28、按钮不可用mand3.enabled=.F.*使“删除”按钮不可用mand4.enabled=.T.*使“取消”按钮可用thisform.pageframe1.page1.fy1.enabled=.F.*使导航条可用if mand2.caption=修改这条记录thisform.pageframe1.page1.txtpid.enabled=.T.thisform.pageframe1.page1.txtpname.enabled=.T.thisform.pageframe1.page1.txtpsex.enabled=.T.thisform.pageframe1.page1.txtpjob.
29、enabled=.T.thisform.pageframe1.page1.txtpindate.enabled=.T.thisform.pageframe1.page1.txtprank.enabled=.T.mand2.caption=修改确认thisform.pageframe1.page1.refreshthisform.pageframe1.page1.txtpid.setfocus*文本框1获得鼠标焦点 else mand2.caption=修改这条记录tableupdate(.t.)*更改确认thisform.pageframe1.page1.txtpid.enabled=.F.t
30、hisform.pageframe1.page1.txtpname.enabled=.F.thisform.pageframe1.page1.txtpsex.enabled=.F.thisform.pageframe1.page1.txtpjob.enabled=.F.thisform.pageframe1.page1.txtpindate.enabled=.F.thisform.pageframe1.page1.txtprank.enabled=.F.mand1.enabled=.T.mand3.enabled=.T.mand4.enabled=.F.thisform.pageframe1.
31、page1.fy1.enabled=.T.*恢复本子页面各控件状态endif上段代码的功能是修改一个员工的信息并更新到数据库中。为“删除这条记录”按钮添加Click事件代码:getid=alltrim(thisform.pageframe1.page1.txtpid.value)*获得输入的id信息thisform.pageframe1.page1.txtpid.controlsource=thisform.pageframe1.page1.txtpname.controlsource=thisform.pageframe1.page1.txtpsex.controlsource=thisfo
32、rm.pageframe1.page1.txtpjob.controlsource=thisform.pageframe1.page1.txtpindate.controlsource=thisform.pageframe1.page1.txtprank.controlsource=*先将表单中数据源断开use personnel exclusive*以独占方式打开set order to pidseek getiddeletepackthisform.pageframe1.page1.txtpid.controlsource=personnel.pidthisform.pageframe1.
33、page1.txtpname.controlsource=personnel.pnamethisform.pageframe1.page1.txtpsex.controlsource=personnel.psexthisform.pageframe1.page1.txtpjob.controlsource=personnel.pjobthisform.pageframe1.page1.txtpindate.controlsource=personnel.pindatethisform.pageframe1.page1.txtprank.controlsource=personnel.prank
34、*将数据源重新接上thisform.pageframe1.page1.txtpid.enabled=.F.thisform.pageframe1.page1.txtpname.enabled=.F.thisform.pageframe1.page1.txtpsex.enabled=.F.thisform.pageframe1.page1.txtpjob.enabled=.F.thisform.pageframe1.page1.txtpindate.enabled=.F.thisform.pageframe1.page1.txtprank.enabled=.F.*设定各文本款为不可用,防止bug
35、出现*本删除操作不可取消上段代码的功能是删除一个员工的信息。为“取消操作”按钮添加Click事件代码:if mand1.caption=增加确认*判断要恢复的是何种操作mand1.caption=增加新记录mand2.enabled=.T.mand3.enabled=.T.thisform.pageframe1.page1.fy1.enabled=.T.tablerevert(.f.)*放弃对表的数据更改操作endifif mand2.caption=修改确认mand2.caption=修改这条记录mand1.enabled=.T.mand3.enabled=.T.*根据实际情况更改各个按钮的
36、状态tablerevert(.f.)*取消对表所作的操作endifthisform.pageframe1.page1.txtpid.enabled=.F.thisform.pageframe1.page1.txtpname.enabled=.F.thisform.pageframe1.page1.txtpsex.enabled=.F.thisform.pageframe1.page1.txtpjob.enabled=.F.thisform.pageframe1.page1.txtpindate.enabled=.F.thisform.pageframe1.page1.txtprank.enab
37、led=.F.thisform.pageframe1.page1.fy1.enabled=.T.mand4.enabled=.F.*恢复各个控件的状态thisform.pageframe1.page1.refresh上段代码的功能为取消前面所作的操作。2.“查询”字页面的设计本子页面中使用了tableupdate()和tablerever()函数,这两个函数要求先用函数cursorsetprop()启动记录或表缓冲,否则将会产生错误。因此,要求在表单的Init事件中添加代码:set multilocks on*允许数据缓冲cursorsetprop(“buffering”,3)*打开开放式记录
38、缓冲区为了页面2添加控件,如图1-19所示。本页面主要实现了填写查询条件的功能,让使用者根据提示查询到需要的纪录。提供了按“员工号”和“员工姓名”查询的功能。设计思路是当使用者单击复选框时,下面的文本框相应变为可用状态,否则为不可用状态。当使用者填入查询条件后,单击“查询”按钮,如果查到相应记录,系统会自动提示。同时“查询结果”子页面被激活为可用。使用者此时单击“查询结果”按钮可以得到查询结果。如未查到记录也会显示相应提示。为复选框填写Click事件代码。“员工号”Click事件代码:flag=thisform.pageframe1.page2.check1.valuedo casecase
39、flag=0*判断本复选框是否为选中状态,0为未选,1为选中thisform.pageframe1.page2.text1.enabled=.F.thisform.pageframe1.page2.text1.value=case flag=1thisform.pageframe1.page2.text1.enabled=.T.endcase“员工姓名”Click事件代码:flag=thisform.pageframe1.page2.check2.valuedo casecase flag=0*判断本复选框是否为选中状态,0为未选,1为选中thisform.pageframe1.page2.t
40、ext2.enabled=.F.thisform.pageframe1.page2.text2.value=case flag=1thisform.pageframe1.page2.text2.enabled=.T.endcase“查询”按钮Click事件代码:getpid=alltrim(thisform.pageframe1.page2.text1.value)getpname=alltrim(thisform.pageframe1.page2.text2.value)flag1=thisform.pageframe1.page2.check1.valueflag2=thisform.pageframe1.page2.check2.value*判断复选框选中情况if flag1=0 and flag2=0messagebox(请输入查询条件,48,错误)Endifif flag1=1 and flag2=0*“工号”栏此时被选中set order to pid*设置查询索引为pidseek getpidif found()