《工资管理系统课程设计报告.doc》由会员分享,可在线阅读,更多相关《工资管理系统课程设计报告.doc(55页珍藏版)》请在三一办公上搜索。
1、数据库原理及应用课程设计报告题目: 工资管理系统 所在学院: 信息工程学院 班 级: 学 号: 姓 名: 指导教师: 2014年1月2日目录一、 概述二、需求分析三、概念设计四、逻辑设计五、系统实现六、小结一、概述在工资管理中,需要从公司管理方式以及实际情况中提取相关信息,以反映工资管理情况。传统的手工操作方式,易发生数据丢失,统计错误,劳动强度高,且速度慢。使用计算机可以高速,快捷地完成以上工作。避免重复劳动,规范工资管理行为,从而提高了管理效率和水平。让人们的效率大大提高.不难想象,正是资讯的迅速发展使得人们从过去繁复的手工劳作中得以解脱,从而使这种服务在现在才可能迅速普及。同时,编写一套
2、完整的工资管理系统的任务就显得尤为重要。 本课程设计共分为四大模块:1.系统数据初始化2.工基本信息数据的输入、修改、删除;3.员工个人信息及工资表的查询;4,员工工资的计算;二、需求分析本系统主要用于员工基本信息的管理,对员工以及其他信息的添加、修改、删除、查询等基本操作。对于数据库的保护有数据备份和数据恢复的功能。针对这些要求,设计本月工资信息管理系统。该系统主要包括职工信息、工资级别和工资金额、公司福利表等。 员工基本状况包括员工号、员工姓名、性别、所在部门、工资级别、工资等级等。 2.工资级别和工资金额包括工资等级、工资额。 3.企业部门及工作岗位信息包括部门名称、工作岗位名称、工作岗
3、位工资等。 4.工龄和工资金额包括工龄及对应工资额。 5.公司福利表包括福利名称、福利值。本系统概念设计思想:1.对公司软硬件调查,从实际环境出发,以便充分利用公司现在资源,提高系统开发水平和应用效果。2.了解公司的需要及相关方面的规定,根据需要做出符合要求的软件,并达到操作过程中的直观、方便、实用、安全等要求。3.将系统按模块分工到人,提高效率,且模块化设计便于系统功能的各种组合和修改及日后的维护。4.系统应具备数据库维护功能,及时根据用户需求进行数据的添加、删除、修改等操作。工资管理系统 员工管理模块 考勤管理模块 津贴管理模块 工资生成模块 系统模块图1.1 系统功能模块图数据库操作操作
4、数据系统操作工资信息考勤信息进入基本界面职工信息津贴管理图2.1第一层数据流图修改职工信息删除职工记录输入职工基本信息职工表添加操作修改操作删除操作用户查询操作职工号修改工资信息删除工资信息输入工资基本信息工资表添加操作修改操作删除操作查询操作图2.3工资的信息载入修改考勤信息删除考勤信息输入考勤基本信息考勤表添加操作修改操作删除操作查询操作用户图2.4考勤的信息载入修改津贴信息删除津贴信息输入津贴基本信息津贴表添加操作修改操作删除操作查询操作用户图2.5津贴的信息载入职工管理员进入系统进入员工(工资,考勤,津贴)表津贴表职工表考勤表工资表进行录入,修改,删除,查询操作 图2.6信息查询及管理
5、的流程图三、概念设计分析前面的系统功能要求,需要一个表来存储和管理员工信息,使系统能够接受员工原始的各项数据,以实现数据录入、查询或统计员工信息等功能。员工是本系统的第一个实体。为了能实现查询和统计部门内员工情况等功能,必须有一个表来存储和管理所有部门的信息。部门是本系统的第二个实体。工资是以员工工作情况来制定的。需要建立一个表来记录各种工资、津贴、扣款的信息。它主要为各种查询和统计功能提供工资数据。工资是第3个实体。据此可以绘出工资管理系统数据库的E-R图如下:部门 1工作 N 获得工资员工 M M 1实体属性列表如下:实体属性员工工号姓名性别年龄籍贯身份证号婚姻状况学历部门名称工种工龄职务
6、等级部门部门名称部门负责人部门人数工资工号工资年月岗位工资岗位补贴出勤天数加班工时加班天数加班类别加班工资病假扣款事假扣款其他扣款应发工资实发工资四、逻辑设计将数据库的概念模型转换为关系模型:实体转换成的关系模式有:员工(工号,姓名,性别,年龄,籍贯,身份证号,婚姻状况,学历,部门名称,工种,工龄,职务等级)部门(部门编号,部门名称,部门负责人,部门人数)获得(工号,姓名)工资(工号,工资年月,岗位工资,岗位补贴,出勤天数,加班工时,加班工资,加班天数,加班类别,病假扣除,事假扣除,其它扣除,应发工资,实发工资)因为,员工与工资是1:N的关系,所以各关系模式为:员工(工号,姓名,性别,年龄,籍
7、贯,身份证号,婚姻状况,学历,部门名称,工种,工龄,职务等级)部门(部门名称,部门负责人,部门人数)工资(工号,工资年月,岗位工资,岗位补贴,出勤天数,加班工时,加班工资,加班天数,加班类别,病假扣除,事假扣除,其它扣除,应发工资,实发工资)带下划线的属性为各关系模式的外码,字体为粗体的属性为各关系模式的主码。关系规范式 :工资管理系统1NF 每个属性均不可再分5、 系统实现5界面截图5.1主界面5.2登录界面5.3管理员管理工资界面5.4信息录入,修改,删除,查询界面5.5职工信息查询界面5.6职工密码修改界面6、 小结 通过这次的课程设计实验,我发现自己对数据库课程的兴趣有了很大提高,而且
8、对课本的知识更加的了解并有了一定的掌握,通过实验我懂得了如何创建索引、视图、存储过程以及触发器。以前不懂为何要创建触发器、视图等,现在终于知道它们的优点了。 在自己没做数据库课程设计以前,总是觉得自己什么都不懂什么都不会,但是现在做出来了,所以我觉得自己还是有能力做一些实际操作方面的东西。我相信以后通过自己自学其它课程,我一定会做出一个更好的数据库通过课程设计让我有机会把知识学以至用,而不单是停留在理论的基础上,为以后的学习和工作提供了宝贵的经验,打下了坚实的基础,虽然课程设计时间短暂,但对我来说过的很充实,更重要的是学到了很多书本上没有的东西,提高了自己的动手能力.在此过程中又学到了许多未知
9、的代码,大大的充实了自己的知识.数据库代码CREATE DATABASE 工资管理库 ON PRIMARY(NAME=工资管理库,FILENAME=D:工资管理库_data.mdf,SIZE=4MB,MAXSIZE=6MB,FILEGROWTH=2MB)LOG ON (NAME =工资管理库_log, FILENAME =D:工资管理库.ldf, SIZE=1MB,MAXSIZE=25MB,FILEGROWTH=10%)create table 部门(部门名称 CHAR(50) NOT NULL primary key,部门负责人 CHAR(50) NOT NULL, 部门人数 CHAR(50
10、);create table 员工(工号 CHAR(50) NOT NULL primary key,姓名 CHAR(50) NOT NULL,性别 CHAR(2) DEFAULT男CHECK(性别 IN(男,女),年龄 CHAR(10) NOT NULL,籍贯 VARCHAR(50) NOT NULL,身份证号 CHAR(50) UNIQUE NOT NULL,婚姻情况 CHAR(50),学历 CHAR(50),部门名称 CHAR(50) NOT NULL,工种 CHAR(50),工龄 CHAR(4) NOT NULL,职务等级 CHAR(50);CREATE TABLE 工资(工号 cha
11、r(50) not null primary key,工资年月 char(50) not null ,岗位工资 decimal not null,岗位补贴 decimal,出勤天数 decimal not null,加班工时 decimal, 加班工资 decimal, 加班天数 decimal,加班类别 char(50),病假扣款 decimal,事假扣款 decimal, 其他扣款 decimal, 应发工资 decimal, 实发工资 decimal not null,foreign key (工号) references 员工(工号);alter table 工资add constra
12、int CK_gongho check(工号0);create table 系统用户(用户名 char(50) primary key, 用户权限 char(50), 用户密码 char(10),)create table 工龄工资(工龄 char(4) primary key,工龄工资 float(8)not null);create table 员工登陆密码(工号 CHAR(50) primary key,密码 char(6),foreign key(工号) references 员工(工号);alter table 员工登陆密码add constraint CK_gongh check(
13、工号0);(三)视图(1)查询员工工资情况建立一个视图,反映员工姓名及工资情况。CREATE VIEW 员工_工资 AS SELECT 员工.姓名, 工资.* FROM 员工,工资 WHERE 员工.工号=工资.工号(四)存储过程(1)指定员工工资情况的查询定义一个名为stsffCost的存储过程,该存储过程以以工资年月(staffgongzi)、出勤天数(staffchuqin)、加班工资(staffjiaban)、应发工资(staffying)、实发工资(staffshi)为输入参数返回指定员工工资信息的存储过程。stsffCost代码如下:CREATE PROCEDURE staffCo
14、stxstaffgongzi decimal,xstaffchuqin decimal,xstaffjiaban decimal,xstaffying decimal,xstaffshi decimalASSELECT *FROM 工资WHERE 工资年月=xstaffgongzi AND 出勤天数=xstaffchuqin AND 加班工资=xstaffjiaban AND应发工资=xstaffying AND实发工资=xstaffshiGO(2)指定范围的员工的信息查询。以员工工号、部门编号为输入参数返回指定员工基本信息的存储过程,要求输入部分员工信息查询员工全部信息。定义一个名为stsf
15、fInfo的存储过程,该存储过程以员工工号(staffNum)、部门编号(bmNum)作为输入参数,存储过程返回查询到的结果集。satffInfo的定义代码如下:CREATE PROCEDURE staffInfoxstaffNum VARCHAR(50)=%,xbmNum VARCHAR(50)=%ASSELECT *FROM 员工,部门WHERE 员工.部门名称=部门.部门名称 AND (员工.工号 LIKE xstaffNum VARCHAR(50)+%) AND (部门编号 LIKE xbmNum VARCHAR(50)+%)GO (3)统计指定年份各部门每个月份的工资总额。以年份为输
16、入参数,以总工资金额为输出参数,产生该年度12个月份的每部门工资统计的存储过程。定义该存储过程名为bmMonhSum,输入参数为ThisYear,实现代码如下:CREATE PROCEDURE bmMonthSumxThisYear CHAR(10)ASSELECT DATEPART(MM,工资年月) AS 员工工资月份,SUM(实发工资) AS 部门人数FROM 员工,工资,部门WHERE 员工.工号=工资.工号 AND 员工.部门名称=部门.部门名称 AND DATEPART(YYYY,工资年月)=xThisYearGROUP BY DATEPART(MM,工资年月)GO(五)触发器(1)
17、关键操作,在工资表里添加一条新的记录,实发工资会自动更新新的数据。定义这个触发器名称为insert_工资。代码如下:create trigger insert_工资 on 工资 for insertasdeclare xi char(20)declare xbb intset xi=casewhen xbb=0001 then 实发工资when xbb=0002 then 实发工资endprint xi (2)员工新调入进行员工新调入操作是在员工信息表中添加一条新的记录,可以为员工信息表设计一个Insert触发器,当员工信息表执行Insert操作后自动更改出部门信息表相应记录的数据。定义这个触
18、发器名称为staff_insert。其代码如下:CREATE TRIGGER staff_insert ON 员工FOR INSERTAS IF (SELECT COUNT(*) FROM 部门,inserted,工资 WHERE 部门.部门人数=inserted.部门人数 AND 工资.工号=inserted.工号)=0ROLLBACK TRANSACTIONGO(3)员工调出进行员工调出操作是在员工信息表中删除该员工的记录,可以为员工信息表设计一个Delete触发器,当员工信息表执行Delete操作后,工资表、部门表中的记录也将全部删除。定义这个触发器名称为staff_delete。其实现
19、代码如下:CREATE TRIGGER staff_delete ON 员工FOR DELETEAS SELECT COUNT(*) FROM 部门,工资,deleted WHERE 部门.部门人数=deleted.部门人数 AND 工资.工号=deleted.工号GO(4)员工内部调动为员工表设计一个名为staff_update的UPDATE触发器,当系统对员工表进行UPDATE操作后,将会自动触发它。该触发器将相应记录的部门人数、部门名称、工资更新。下面是client_update触发器的定义代码;CREATE TRIGGER staff_update ON 员工FOR UPDATEAS
20、SELECT COUNT(*) FROM updated,部门 WHERE 部门.部门名称=updated.部门名称GO(六)索引为提高检索性能,为表创建符合索引,其索引项为工号、姓名。CREATE INDEX 工号_姓名_indON 员工(工号,姓名)GOJava代码insert into 部门 values(财务部,王玲,20)insert into 部门 values(生产部,丽丽,400)insert into 部门 values(董事会,李四,10)insert into 部门 values(后勤部,二子,40)insert into 部门 values(公关部,小丽,一五)inse
21、rt into 部门 values(行政部,琪琪,20)insert into 部门 values(企划部,小新,一五)insert into 部门 values(销售部,小海,10)insert into 部门 values(人力资源部,丽子,5)insert into 员工 values(1001,李民,男,25,天津,111000101,已婚,专科 ,销售部,内销,4,职工)insert into 员工 values(1002,李四,男,50,上海,111000102,已婚,本科 ,董事长,null,30,董事长)insert into 员工 values(1003,丽丽,女,25,北京
22、,111000103,未婚,本科 ,生产部,电工,8,生产部部长)insert into 员工 values(1004,王玲,男,35,东京,111000104,已婚,研究生 ,财务部,预算,6,财务部部长)insert into 员工 values(1005,二子,女,30,江西,111000105,未婚,本科 ,后勤部,车工,7,后勤部部长)insert into 员工 values(1006,小丽,女,26,苏州,111000106,已婚,本科 ,公关部,null,3,公关部部长)insert into 员工 values(1007,小新,男,27,扬州,111000107,已婚,研究生
23、 ,企划部,主管,2,企划部部长)insert into 员工 values(1008,琪琪,女,24,安徽,111000108,未婚,本科 ,行政部,null,8,行政部部长)insert into 员工 values(1009,小海,男,23,南京,111000109,已婚,专科 ,销售部,主管,4,销售部部长)insert into 员工 values(1010,丽子,女,22,江西,111000110,未婚,本科 ,人力资源部,null,4,人力资源部部长)insert into 员工 values(1011,小美,女,26,海南,111000111,已婚,本科 ,公关部,前台,5,职
24、工)insert into 员工 values(1012,小韩,男,20,山东,111000112,离异,本科 ,财务部,融资,5,出纳)insert into 工资 values(1001,20一三-12,2500,500,25,2,一五,4,加急,50,50,100,3500,3400)insert into 工资 values(1002,20一三-12,10000,600,100,5,25,2,null,0,0,0,一五000,20000)insert into 工资 values(1003,20一三-12,4000,500,30,2,30,4,核对,50,50,100,5000,480
25、0)insert into 工资 values(1004,20一三-12,3500,500,30,2,30,4,加急,50,50,100,5000,4800)insert into 工资 values(1005,20一三-12,4000,500,30,2,30,4,加急,50,50,100,5000,4800)insert into 工资 values(1006,20一三-12,4000,500,30,2,30,4,加急,50,50,100,5000,4800)insert into 工资 values(1007,20一三-12,3500,500,30,2,30,4,审核,50,50,100,
26、5200,5000)insert into 工资 values(1008,20一三-12,3500,500,30,2,30,4,加急,50,50,100,5400,5200)insert into 工资 values(1009,20一三-12,3500,500,30,2,30,4,审核,50,50,100,5000,4800)insert into 工资 values(1010,20一三-12,3500,500,30,2,30,4,加急,50,50,100,4800,4300)insert into 工资 values(1011,20一三-12,2500,500,25,2,一五,4,加急,50
27、,50,100,3500,3400)insert into 工资 values(1012,20一三-12,2500,500,25,2,一五,4,加急,50,50,100,3500,3400)insert into 员工登陆密码 values(1001,1101)insert into 员工登陆密码 values(1002,1102)insert into 员工登陆密码 values(1003,1103)insert into 员工登陆密码 values(1004,1104)insert into 员工登陆密码 values(1005,1105)insert into 员工登陆密码 values
28、(1006,1106)insert into 员工登陆密码 values(1007,1107)insert into 员工登陆密码 values(1008,1108)insert into 员工登陆密码 values(1009,1109)insert into 员工登陆密码 values(1010,1110)insert into 员工登陆密码 values(1011,1111)insert into 员工登陆密码 values(1012,1112)insert into 工龄工资 values(1,3000)insert into 工龄工资 values(2,4000)insert into
29、 工龄工资 values(3,5000)insert into 工龄工资 values(4,6000)insert into 工龄工资 values(5,7000)insert into 工龄工资 values(6,8000)insert into 工龄工资 values(7,10000)insert into 工龄工资 values(8,12000)insert into 工龄工资 values(9,一五000)insert into 工龄工资 values(10,20000)insert into 工龄工资 values(11,40000)package WageMangement;imp
30、ort java.sql.*;import javax.swing.JOptionPane; public class DBHelper private static String url=jdbc:odbc:cc; private static String user=sa,password=32一三388s; private static Connection con=null;static try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(Exception ex) ex.printStackTrace(); public st
31、atic ResultSet executeQuery(String sql) ResultSet rs=null; try con = DriverManager.getConnection(url, user, password); Statement cmd=con.createStatement(); rs=cmd.executeQuery(sql); catch(Exception ex)ex.printStackTrace(); return rs; public static void executeUpdate(String sql) try con=DriverManager
32、.getConnection(url, user, password); Statement cmd=con.createStatement(); cmd.executeUpdate(sql); catch(Exception ex) ex.printStackTrace(); finally conclose(); public static void conclose() try if (con!=null & !con.isClosed() con.close(); catch(Exception ex) ex.printStackTrace(); /*主界面类*/package Wag
33、eMangement;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class WageMain extends JFrame implements ActionListener private JButton btn_quit=new JButton(注销登录); private JTextField ch20081798=new JTextField(t x 欢迎使用工资管理系统! ); /*创建菜单栏*/ private JMenuBar mainMune=new JMenuBar(); /*创
34、建部门菜单项*/ private JMenu menudept=new JMenu(部门信息管理); private JMenuItem dept_insert=new JMenuItem(添加新部门信息); private JMenuItem dept_update=new JMenuItem(更新部门信息); private JMenuItem dept_del=new JMenuItem(撤销部门); /*创建员工菜单项*/ private JMenu menuemp=new JMenu(员工基本信息管理); private JMenuItem emp_insert=new JMenuI
35、tem(添加新员工信息); private JMenuItem emp_update=new JMenuItem(更新员工信息); private JMenuItem emp_del=new JMenuItem(删除员工); /*创建工资菜单项*/ private JMenu menuwage=new JMenu(员工工资信息管理); private JMenuItem wage_insert=new JMenuItem(添加新工资信息); private JMenuItem wage_update=new JMenuItem(更新工资信息); private JMenuItem wage_d
36、el=new JMenuItem(删除员工工资信息); /*创建统计菜单项*/ private JMenu menustat=new JMenu(查询汇总部门、员工、员工工资信息); private JMenuItem merge=new JMenuItem(汇总部门年份工资总额信息及人数); private JMenuItem search=new JMenuItem(查询部门和员工基本信息及工资明细); WageMain() JPanel jp =(JPanel)this.getContentPane(); jp.setLayout(new BorderLayout(); JPanel j
37、p1=new JPanel(new FlowLayout(); jp.add(ch20081798);ch20081798.setEditable(false); jp1.add(btn_quit); jp.add(jp1,BorderLayout.SOUTH); menudept.add(dept_insert); menudept.add(dept_update); menudept.add(dept_del); menuemp.add(emp_insert); menuemp.add(emp_update); menuemp.add(emp_del); menuwage.add(wage
38、_insert); menuwage.add(wage_update); menuwage.add(wage_del); menustat.add(merge); menustat.add(search); mainMune.add(menudept); mainMune.add(menuemp); mainMune.add(menuwage); mainMune.add(menustat); this.setJMenuBar(mainMune); dept_insert.addActionListener(this); dept_update.addActionListener(this);
39、 dept_del.addActionListener(this); emp_insert.addActionListener(this); emp_update.addActionListener(this); emp_del.addActionListener(this); wage_insert.addActionListener(this); wage_update.addActionListener(this); wage_del.addActionListener(this); merge.addActionListener(this); search.addActionListe
40、ner(this); btn_quit.addActionListener(this); this.setSize(570, 300); this.setVisible(true); this.setLocation(350, 220); this.setTitle(工资管理系统); this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); public void actionPerformed(ActionEvent e) if (e.getSource()=dept_insert) Dept
41、Insert deptinsert=new DeptInsert();this.dispose(); else if (e.getSource()=dept_update) DeptUpdate deptipdate=new DeptUpdate();this.dispose(); else if (e.getSource()=dept_del) DeptDel deptdel=new DeptDel();this.dispose(); else if (e.getSource()=emp_insert) EmpInsert empinsert=new EmpInsert();this.dispose(); else if (