资源描述
数 据 库
课 程 设 计 报 告
理论成绩
实践成绩
总成绩
院系:信息管理学院
专业:软件工程
班级:软件Q1141
组长:李艳平(11150038)
组员:孙俊珍(11150053)
王 毅(11150132)
左礼振(11150077)
题目:工资管理系统
教师:石黎
时间:2013.11.23
目录
一、设计目的 - 1 -
二、数据库功能分析 - 1 -
2.1 信息输入功能 - 1 -
2.2 数据修改删除功能 - 2 -
2.3 查询和统计功能 - 2 -
三、数据库设计 - 2 -
3.1 需求分析 - 2 -
3.2 概念分析(E-R图) - 3 -
3.3 逻辑设计…………………………………………………………………..- 4-
3.4 物理设计 - 7 -
3.5 实施与维护 - 7 -
四、界面设计及相关代码 - 8 -
4.1 数据库的连接操作 - 8 -
4.2 登陆界面 - 10 -
4.3 管理员操作 - 13 -
4.4 职工操作 - 35 -
五、感想及总结 - 39 -
六、参考文献 - 42 -
一、设计目的
工资管理是一项琐碎、复杂而又十分细致的工作,一般不允许发生差错。手工进行工资发放工作,需要反复地进行抄写、计算,不仅花费财务人员大量的时间,而且往往由于抄写不慎,出现张冠李戴,或者由于计算机的疏忽,出现工资发放错误的现象。计算机进行工资发放工作,不仅能够保证工资核算正确无误、快速输出,而且还可以利用工资数据库对有关工资的各种信息进行统计,服务于财务部门其他方面的核算和财务处理。实现企业员工工资管理的系统化、规范化和自动化,能够和人事管理系统、考勤管理系统相结合,真正实现企业高效、科学、现代化的员工管理。
二、数据库功能分析
2.1 信息输入功能
1) 输入员工的基本信息。包括:员工编号、姓名、性别、参加工作时间、所属部门、职位
等基本信息
2) 输入员工的工资信息。包括:岗位基本工资、津贴、考勤等相关信息。
3) 输入员工的部门信息。包括:部门编号、部门名称、部门负责人、部门人数、部门与外界的联系方式。
2.2 数据修改删除功能
1) 修改和删除员工的基本信息。当单位人员的信息发生变化,如职称的改变,工作部门变动,或调离本单位等,系统应能修改员工的信息或将其从员工信息表中删除。
2) 修改和删除员工的工资信息。员工升职加薪、工资普调是企业中常见的事情,这就需要系统能方便对员工工资进行个别及批量的修改;如员工调离本单位,就应当从员工信息表中删除这个员工信息,将其工资信息表中相应的数据删除。
3) 修改和删除部门信息。当一个部门的负责人或联系方式发生改变时,系统中相关部门信息也能做相应改变。
2.3 查询和统计功能
1) 能够查询指定员工的基本信息
2) 能够查询部门信息
3) 查询某个员工的工资信息
4) 统计部门总人数、共工资、平均工资
5) 工资表月工资记录的生成功能。生成当月所有员工或所有部门的工资记录,同时能进行员工工资的计算,即基本工资、奖励金额、应扣金额。
三、数据库设计
3.1 需求分析:
《工资管理系统》针对的用户是小型企业,工资项目比较少,较为固定,工资管理涉及企业管理的多个方面,如员工职务宫中变化、员工考勤情况、员工加班情况等等。根据这些信息,在每个月的某个固定时间,生成企业对全体员工的月工资。对于月工资,能够实现按照员工、部门、月、年进行统计分析,产生相应报表。
需求信息整理(DFD图)如下:
第0层DFD图
3.2 概念分析(E-R图)
3.3 逻辑设计
1. 数据字典
表1 Allowance (员工津贴)
列 名
数据类型
可否为空
说 明
emp_no
varchar(10)
not null
员工号(主键一)
overtime_month
varchar(20)
not null
加班时间(主键二)
Overtime_days
int
null
加班天数
Overtime_pay
float
null
加班工资
表2 Attendance (考勤信息统计)
列 名
数据类型
可否为空
说 明
emp_no
varchar(10)
not null
员工号(主键一)
attend_month
varchar(20)
not null
时间(主键二)
Absent_days
int
null
缺勤天数
Absent_pay
float
null
考勤工资
表3 BasicWages(工资标准表格)
列 名
数据类型
可否为空
说 明
emp_pos
Varchar(10)
not null
工种(主键)
basic_wage
Float
not null
基本工资
表 4 EmpBasicInfo (员工基本情况表)
列 名
数据类型
可否为空
说 明
emp_no
VARCHAR(10)
NOT NULL
员工号(主键)
emp_name
VARCHAR(40)
NULL
员工名称
emp_pos
VARCHAR(40)
NOT NULL
职位
sex
Char(2)
NULL
性别
department_id
VARChar(10)
NOT NULL
员工部门
emp_time
VARCHAR(20)
NOT NULL
入公司时间
telephone
Char(11)
Null
电话号码
2. 关系模式
员工基本信息表(所属部门,入公司时间,电话号码)
员工津贴表(员工号,加班时间,加班天数,加班工资)
员工考勤表(员工号,时间,缺勤天数,考勤工资)
基本工资表(职位,基本工资)
部门信息表(部门编号,部门名称,部门人数,联系方式)
用户登陆(ID号,用户名,密码)
3. 视图设计
为及时更新数据,减少数据库后台操作,设计了部门工资情况及员工月工资情况两个视图
部门工资情况视图:
员工月工资视图: A
3.4 物理设计
数据库最终是要存储在物理设备上的,为一个给定的逻辑数据模型选取一个最适合应用环境的物理结构(存储结构与存取方法)的过程,就是数据库的物理设计。数据库的物理结构依赖于给定的计算机系统和DBMS。
3.5 实施与维护
确定了数据库的逻辑结构和物理结构后,就可以用所选用的DBMS提供的数据定义语言(DDL)来严格定义数据库,包括建立表、定义表的约束等。数据库系统投入运行后,对数据库设计进行评价、调整、修改等维护工作。
四、界面设计及相关代码
4.1 数据库的连接操作
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace 工资管理系统
{
/// <summary>
/// 用来连接数据库和进行有关数据库的操作
/// </summary>
class BaseOperate
{
public static string username = "";
public static string userID = "";
public static string password = "";
#region 建立数据库连接
/// <summary>
/// 建立数据库连接
/// </summary>
/// <returns>返回SqlConnection对象</returns>
public SqlConnection getConnect()
{
string str_sqlcon = "server=xgxy5; database=MyWages; uid=sa; pwd=";
SqlConnection myConnect = new SqlConnection(str_sqlcon); //连接数据库
return myConnect;
}
#endregion
#region 创建DataSet对象
/// <summary>
/// 创建一个DataSet对象
/// </summary>
/// <param name="str_sqlcom">SQL语句</param>
/// <param name="str_table">表名</param>
/// <returns>返回DataSet对象</returns>
public DataSet getDataSet(string str_sqlcom, string str_table)
{
//数据库连接
SqlConnection sqlcon = this.getConnect();
//创建SQL适配器,用于填充DataSet和更新数据库的一组数据命令和一个数据库连接
SqlDataAdapter sqlda = new SqlDataAdapter(str_sqlcom, sqlcon);
//创建SQL命令生成器
SqlCommandBuilder thisBuild = new SqlCommandBuilder(sqlda);
//数据的内存驻留表示形式,它表示一个数据集
DataSet myds = new DataSet();
//Fill方法用来填充DataSet或DataTable数据集,str_table是一个虚表
sqlda.Fill(myds, str_table);
return myds;
}
#endregion
}
}
4.1 登陆界面
namespace 工资管理系统
{
public partial class Form1 : Form
{
BaseOperate boperate = new BaseOperate(); //声明一个BaseOperate类的一个对象,以调用其方法
public Form1()
{
InitializeComponent();
}
#region 核对用户身份
public void IDverify(string str_sqltab, Form myform)
{
string str_sqlcom = "Select * from " + str_sqltab;
string str_vtab = "vistual_table";
DataSet thisDset = boperate.getDataSet(str_sqlcom, str_vtab);
int i = 0;
foreach (DataRow row in thisDset.Tables[str_vtab].Rows)
{
if (textBox1.Text == row["user_id"].ToString())
{
BaseOperate.userID = row["user_id"].ToString();
BaseOperate.username = row["username"].ToString();
if (textBox2.Text == row["password"].ToString())
{
BaseOperate.password = textBox2.Text;
myform.Show();
break;
}
else
{
MessageBox.Show("密码错误!请重新输入!");
textBox2.Text = "";
}
}
else
{
i = i + 1;
if (i == thisDset.Tables[str_vtab].Rows.Count)
{
MessageBox.Show("无此用户信息,请重新输入!");
textBox1.Text = "";
textBox2.Text = "";
textBox1.Focus();
}
}
}
}
#endregion
#region 登陆信息检查
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "" && textBox2.Text == "")
{
MessageBox.Show("请输入账户和密码!");
textBox1.Focus();
}
else if (textBox1.Text == "" && textBox2.Text != "")
{
MessageBox.Show("请输入账户名");
textBox1.Focus();
}
else if (textBox1.Text != "" && textBox2.Text == "")
{
MessageBox.Show("请输入密码!");
textBox2.Focus();
}
else if (!radioButton1.Checked && !radioButton2.Checked)
{
MessageBox.Show("请选择登陆身份!");
}
else if (radioButton1.Checked)
{
if (textBox1.Text == "001" && textBox2.Text == "1001")
{
Form2 myform2 = new Form2();
myform2.Show();
}
else
{
MessageBox.Show("用户名和密码错误!");
textBox1.Text = "";
textBox2.Text = "";
radioButton1.Checked = false;
radioButton2.Checked = false;
}
}
else if (radioButton2.Checked)
{
Form3 myform3 = new Form3();
IDverify("Staff", myform3);
}
}
#endregion
#region 重置登陆信息
private void button2_Click(object sender, EventArgs e)
{
textBox1.Text = "";
textBox2.Text = "";
radioButton1.Checked = false;
radioButton2.Checked = false;
textBox1.Focus();
}
#endregion
}
}
4.3 管理员操作
1) 查询员工信息
2) 查询部门信息
3) 查询津贴信息:
4) 查询考勤信息:
5)员工月工资汇总:
6)部门平均工资:
namespace 工资管理系统
{
public partial class Form2 : Form
{
BaseOperate boperate = new BaseOperate(); //声明一个BaseOperate类的一个对象,以调用其方法
public Form2()
{
InitializeComponent();
}
#region 显示员工信息
private void 员工信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
string str_sqlcom = "Select * from EmpBasicInfo";
string str_vtab = "vistual_table";
DataSet thisDset = boperate.getDataSet(str_sqlcom, str_vtab);
listBox1.Items.Clear();
listBox1.Items.Add("工号\t姓名\t 职位\t性别\t所属部门\t入职时间\t电话号码");
foreach (DataRow row in thisDset.Tables[str_vtab].Rows)
listBox1.Items.Add(row["emp_no"].ToString() + "\t" + row["emp_name"].ToString() + "\t" + row["emp_pos"].ToString() + "\t " +
row["sex"].ToString() + "\t " + row["depart_name"].ToString() + "\t\t" + row["emp_time"].ToString() + "\t" + row["telephone"].ToString());
}
#endregion
#region 显示部门信息
private void 部门信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
string str_sqlcom = "Select * from Department";
string str_vtab = "vistual_table";
DataSet thisDset = boperate.getDataSet(str_sqlcom, str_vtab);
listBox1.Items.Clear();
listBox1.Items.Add("部门号\t部门名称\t负责人\t 职工人数\t联系电话");
foreach (DataRow row in thisDset.Tables[str_vtab].Rows)
listBox1.Items.Add(row["depart_id"].ToString() + "\t" + row["depart_name"].ToString() + "\t\t" + row["depart_head"].ToString()
+ "\t " + row["depart_emps"].ToString() + "\t\t" + row["depart_tel"].ToString());
}
#endregion
#region 显示部门信息
private void 津贴信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
string str_sqlcom = "Select * from Allowance";
string str_vtab = "vistual_table";
DataSet thisDset = boperate.getDataSet(str_sqlcom, str_vtab);
listBox1.Items.Clear();
listBox1.Items.Add("职工号\t\t加班月份\t加班天数\t加班工资");
foreach (DataRow row in thisDset.Tables[str_vtab].Rows)
listBox1.Items.Add(row["emp_no"].ToString() + "\t\t" + row["overtime_month"].ToString() + "\t\t "
+ row["overtime_days"].ToString() + "\t\t " + row["overtime_pay"].ToString());
}
#endregion
#region 出勤统计
private void 出勤统计ToolStripMenuItem_Click(object sender, EventArgs e)
{
string str_sqlcom = "Select * from Attendance";
string str_vtab = "vistual_table";
DataSet thisDset = boperate.getDataSet(str_sqlcom, str_vtab);
listBox1.Items.Clear();
listBox1.Items.Add("职工号\t\t考勤月份\t缺勤天数\t扣除工资");
foreach (DataRow row in thisDset.Tables[str_vtab].Rows)
listBox1.Items.Add(row["emp_no"].ToString() + "\t\t" + row["attend_month"].ToString() + "\t\t "
+ row["absent_days"].ToString() + "\t\t " + row["absent_pay"].ToString());
}
#endregion
#region 员工月工资汇总
private void 员工月工资汇总ToolStripMenuItem_Click(object sender, EventArgs e)
{
string str_sqlcom = "Select * from MonthWages";
string str_vtab = "vistual_table";
DataSet thisDset = boperate.getDataSet(str_sqlcom, str_vtab);
listBox1.Items.Clear();
listBox1.Items.Add("工号\t月份\t工资\t底薪\t津贴\t考勤");
foreach (DataRow row in thisDset.Tables[str_vtab].Rows)
listBox1.Items.Add(row["emp_no"].ToString() + "\t" + row["pay_time"].ToString() + "\t" + row["basic_wage"].ToString() + "\t" +
row["overtime_pay"].ToString() + "\t" + row["absent_pay"].ToString() + "\t" + row["month_pay"].ToString());
}
#endregion
#region 各部门工资情况
private void 各部门工资情况ToolStripMenuItem_Click(object sender, EventArgs e)
{
string str_sqlcom = "select * from DepartAvgWage";
string str_vtab = "vistual_table";
DataSet thisDset = boperate.getDataSet(str_sqlcom, str_vtab);
listBox1.Items.Clear();
listBox1.Items.Add("部门\t 月份\t 部门人数\t部门总工资\t部门平均工资");
foreach (DataRow row in thisDset.Tables[str_vtab].Rows)
listBox1.Items.Add(row["depart_name"].ToString() + "\t " + row["pay_month"].ToString() + "\t " +
row["depart_emps"].ToString() + "\t\t " + row["sum_wage"].ToString() + " \t " + row["avg_wage"].ToString());
}
#endregion
#region 更新数据
private void 更新数据ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form4 newform = new Form4();
newform.Show();
}
#endregion
#region 退出
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
#endregion
}
}
7)信息修改:
namespace 工资管理系统
{
public partial class Form4 : Form
{
BaseOperate boperate = new BaseOperate(); //声明一个BaseOperate类的一个对象,以调用其方法
public Form4()
{
InitializeComponent();
}
#region 修改员工信息
/// <summary>
/// 修改员工信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click_1(object sender, EventArgs e)
{
if (textBox1.Text == "")
{
MessageBox.Show("请输入工号!");
textBox1.Focus();
}
else
{
string str_sqlcom = "Select * from EmpBasicInfo";
string str_vtab = "vistual_table";
DataSet thisDset = boperate.getDataSet(str_sqlcom, str_vtab);
int search = 0;
foreach (DataRow row in thisDset.Tables[str_vtab].Rows)
{
if (row["emp_no"].ToString() == textBox1.Text)
{
string no = textBox1.Text;
展开阅读全文