资源描述
数据库课程设计
题 目: 工资管理系统
系 别:
班 级:
姓 名:
学 号:
指导教师:
评阅意见:
封面格式不对
其余部分参考张付伟
成绩评定:
评阅人: 日期:
目录
一、 开发背景 2
二、 功能描述 3
三、数据流分析 4
3.1 数据流图 4
3.2 数据字典 5
3.2.1 数据结构描述 5
3.2.2 数据流的描述 5
3.2.3 主要数据存储的定义 6
四、 概念模型设计 7
4.1局部E-R图 7
4.2全局E-R图 9
五、逻辑结构设计和优化 10
5.1 基本表 10
5.2 导出表 11
六、 应用程序设计 12
6.1应用程序界面 12
6.2 功能实现代码 15
七、结论与体会 22
八、 参考文献 23
一、 开发背景
随着计算机技术的飞速发展,计算机已深入到各个领域,并且形成了功能强大、覆盖全球的信息传输网络。各个领域都向系统化、规范化、自动化的方向发展,使得工作效率、工作成绩和生活水平都日益提高。工资管理是很多厂矿、公司、个体事业单位所须的,工资信息管理系统包括对工资信息的统计、查询、更新、打印输出等,如果靠人,工作量将很大,若公司人数有几万甚至更多,人工统计将变得不可想象,仅一些简单的操作便可及时、准确地通过计算机获得需要的信息。计算机在企业管理中应用的普及,利用计算机实现企业工资管理势在必行。计算机管理所无法比拟的优点检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高工资管理的效率,也是企业的科学化、正规化管理,与世界接轨的重要条件。不同的企业具有不同的工资管理制度,这就决定了不同的企业需要不同的工资管理系统。
经过分析,我们使用SQL Server 2005 和Visual C开发工具。系统能够提供对工资信息输入、查询、编辑以及工资设定、查询、修改、算出工资发放各项合计数据;可自主设定条件从而达到对工资数据的多角度查询功能;方便导入、导出数据及输出报表。财务部门人员以管理员身份登录,对本系统的可登录人员进行管理;实现了财务部门对本单位工资发放系统的集中管理,保证了系统的安全性。
二、 功能描述
工资管理系统系是为了更好的实现工资各种信息的管理以及各种信息的安全性管理。本系统主要对查看员工的各种工资信息需求所设计的,可以很好的管理数据。 本系统的主要功能由以下几个部分组成:
(1)员工基本信息模块:员工信息功能:对员工基本信息的查询、修改和删除。
(2)员工工资管理模块:员工工资情况功能:完成对员工工资的修改、查询,统计员工基本信息表。
(3)员工工资信息包含员工每个月度的基本工资、加班工资、奖励情况、以后扣款情况。查询模块是指在建表的基础上,用户对所需要的资料的查询。包括单一条件查询和多条件查询。从查询对象来看,又可分为对员工基本信息的查询和对员工工资信息。
(4)员工身份的确认:只有用户名和用户密码都相符的用户方可进入本系统,为了防止不合法用户对数据的察看和修改,本系统把用户分为两个级别:员工和管理员,员工包括管理员不仅拥有对数据的查询、统计、打印权限,还对用户的使用权限进行控制,管理员可以设定用户名、密码和其权限,还可以对纪录进行增加、删除、修改等操作。当用户要进入系统时必须先输入用户名和密码,按“确认”按钮后,系统辨别用户身份,对合法用户根据用户的权限赋予相应的使用功能。
(5)工资信息的计算:工资计算分为部门工资修改、单个员工总工资计算、单个部门总工资计算,单个员工工资是员工基本工资加上员工奖金加上员工加班工资减去员工应扣除的款项。部门工资之和是该部门所有员工当月工资的总合。
三、数据流分析
3.1 数据流图
1)第一层数据流图
图1 第一层数据流图
2) 第二层数据流图
图2 第二层数据流图
3.2 数据字典
3.2.1 数据结构描述
名称:员工(Employee)
含义说明:员工基本信息
组成结构:员工编号+姓名+性别+年龄+民族+身份证号+电话+Email+办公电话+教育程度+专业+毕业院校+住所+籍贯+职业+部门+工作时间
名称:工资(Salary)
含义说明:员工的基本工资信息
组成结构:员工编号+姓名+性别+全勤奖金+实际上班天数+基本工资+加班天数+加班工资+扣款+应发工资+实发工资+部门
名称:部门(branch)
含义说明:所购书和购书单位的说明
组成结构:部门编号+名称+电话+部门经理+编制人数+现有人数
3.2.2 数据流的描述
数据流名称:员工加入 简述:新员工信息录入
数据流来源:管理者
数据流去向:员工信息情况
数据流组成:员工编号+姓名+性别+年龄+民族+身份证号+电话+Email+
办公电话+教育程度+专业+毕业院校+住所+籍贯+职业+部门+工作时间
数据流名称:员工信息修改 简述:员工信息错误或者员工调动
数据流来源:员工信息情况
数据流去向:员工信息情况
数据流组成:员工编号+姓名+性别+年龄+民族+身份证号+电话+Email+
办公电话+教育程度+专业+毕业院校+住所+籍贯+职业+部门+工作时间
数据流名称:员工离职 简述:员工离开公司到别的公司就职
数据流来源:员工信息情况
数据流去向:员工信息情况
数据流组成:员工编号+姓名+性别+年龄+民族+身份证号+电话+Email+
办公电话+教育程度+专业+毕业院校+住所+籍贯+职业+部门+工作时间
数据流名称:员工信息删除 简述:该员工不能作离职处理
数据流来源:员工信息情况
数据流去向:员工信息情况
数据流组成:员工编号+姓名+性别+年龄+民族+身份证号+电话+Email+
办公电话+教育程度+专业+毕业院校+住所+籍贯+职业+部门+工作时间
数据流名称:工资变动 简述:公司对工资进行变动
数据流来源:公司管理者
数据流去向:工资信息情况
数据流组成:员工编号+姓名+性别+全勤奖金+实际上班天数+基本工资+加
班天数+加班工资+扣款+应发工资+实发工资+部门
数据流名称:部门经理调动 简述:公司对部门经理进行变动
数据流来源:公司管理者
数据流去向:部门信息情况
数据流组成:部门编号+名称+电话+部门经理+编制人数+现有人数
3.2.3 主要数据存储的定义
存储名称:员工记录
输入:员工基本信息
输出:员工所有信息
数据结构:员工编号+姓名+性别+年龄+民族+身份证号+电话+Email+办
公电话+教育程度+专业+毕业院校+住所+籍贯+职业+部门+工作时间
存储名称:离职记录
输入:离职员工基本信息
输出:离职员工所有信息
数据结构:员工编号+姓名+性别+年龄+民族+身份证号+电话+Email+办
公电话+教育程度+专业+毕业院校+住所+籍贯+职业+部门+工作时间
存储名称:非离职记录
输入:非离职员工基本信息
输出:非离职员工所有信息
数据结构:员工编号+姓名+性别+年龄+民族+身份证号+电话+Email+办
公电话+教育程度+专业+毕业院校+住所+籍贯+职业+部门+工作时间
存储名称:工资记录
输入:员工工资信息
输出:员工所有工资信息
数据结构:员工编号+姓名+性别+全勤奖金+实际上班天数+基本工资+加
班天数+加班工资+扣款+应发工资+实发工资+部门
存储名称:部门记录
输入:部门信息
输出:所有部门信息
数据结构:部门编号+名称+电话+部门经理+编制人数+现有人数
四、 概念模型设计
4.1局部E-R图
图3 用户信息E-R图
图4 员工信息E-R图
图5 部门信息E-R图
图6 工资信息E-R图
4.2全局E-R图
图7 全局E-R图
五、逻辑结构设计和优化
5.1 基本表
5.1.1 关系模式:工资(工号﹑姓名﹑性别﹑全勤奖金﹑实上班天数﹑基本工资﹑加班天数﹑加班工资﹑扣款﹑应发工资﹑实发工资)
5. 1.2 关系模式:员工基本信息(身份证号﹑民族﹑年龄﹑员工编号﹑姓名﹑性别﹑E-mail﹑联系电话﹑办公电话、员工参加工作时间、所属部门、教育程度、专业、学校、住所、籍贯、职位)
5. 1.3 关系模式:员工离职信息表是由员工信息表导出,和员工信息表的信息是一样的。
5.1.4 关系模式:用户(用户ID、密码、用户类型)
5.1.5 关系模式 :部门(部门编号,部门名称,部门电话,部门经理,编制人数,现有人数)
5.2 导出表
1) 调动入表(部门编号,职位,职工编号,原部门,现部门、说明部分)
由部门信息表导出。
2) 转出表(部门编号,职位,职工编号,现有人数,职工名)
由部门信息表导出。
3) 奖惩表(职工编号、奖励、惩罚、奖惩时间、说明部分)
由工资表导出。
六、 应用程序设计
6.1应用程序界面
图8登录界面
图9 员工信息操作界
图10 添加员工信息界面
图11离职员工信息界面
图12工资信息界面
图13修改工资信息界面
图14部门信息界面
图15工资计算界面
6.2 功能实现代码
数据库连接代码
建立数据库连接的函数:
int CSalaryApp::NewDBConnect()
{
CString strCon;//定义连接字符串
strCon.Format("DSN=%s;UID=%s;PWD=%s","Mydata","sa","");//数据库连接字符串
g_pDB=&myDB;
TRY
{
if(!g_pDB->OpenEx(strCon,CDatabase::noOdbcDialog))//开打数据源,执行数据库连接字符串,如不成功、弹出对话框
{
AfxMessageBox("连接数据源发生错误");
return -1;
}
}
....下面是异常处理代码段、
}
登录系统实现代码
void CLoginDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(TRUE);
CString str,strSQL;
strSQL.Format("select count(ID) as count from LoginInfo where username='%s' and password='%s'",m_Username,m_Password);//SQL查询语句,查询出管理员编号ID
CRecordset rs(g_pDB);//构造记录集
rs.Open(CRecordset::forwardOnly,strSQL);//执行查询语句
rs.GetFieldValue("count",str);//检索当前数据的索引
rs.Close();//关闭数据集
if(!str.Compare("1"))//判断认证是否通过
{
EndDialog(IDOK);//结束对话框、返回IDOK
}
else
{
AfxMessageBox("用户名或者密码错误");
}
}
列表控件初始化代码
m_listEmployeeInfo.ModifyStyle(LVS_TYPEMASK,LVS_REPORT|LVS_SINGLESEL); //列表显示框的类型定义
m_listEmployeeInfo.SetExtendedStyle(LVS_EX_FULLROWSELECT| LVS_EX_GRIDLINES |LVS_EX_HEADERDRAGDROP |LVS_EX_ONECLICKACTIVATE);//列表显示框的显示方式定义
int i=0;
m_listEmployeeInfo.InsertColumn(i++,_T("编号"), LVCFMT_LEFT,40,i++);//逐列插入列标题
将记录集显示到列表控件中的实现代码
void CSalaryView::ShowItem(CString strSQL)
{
...记录集定义和记录集打开部分
else
{
int i=0,j=0;
while(!EmployeeInfoSet.IsEOF())//判断记录集是否到达最后一条记录
{
m_listEmployeeInfo.InsertItem(i,EmployeeInfoSet.m_num);//从第i行 第j列开始逐行插入记录集中的数据
....
i++;
j=0;
EmployeeInfoSet.MoveNext();//将记录集的指针移到下一个记录
}
}
EmployeeInfoSet.Close();//关闭记录集
}
....异常处理
}
添加信息实现代码
void CAddEmployeeDlg::OnButtonOk()
{
.....记录集的打开和判断记录集是否可以读取的部分代码
EmployeeInfoSet .AddNew();//添加新记录
EmployeeInfoSet .m_num =m_strNum;//设置各记录字段的值
.....
EmployeeInfoSet .Update();//更新记录集
EmployeeInfoSet .Close();//关闭记录集
}
....异常处理
}
删除信息实现代码
void CSalaryView::OnButtonDelete()
{
...数据项定义
if(((CButton*)GetDlgItem(IDC_RADIO_OUT))->GetCheck()==TRUE)//判断离职是否被选中
{
pos=m_listEmployeeInfo.GetFirstSelectedItemPosition();//获取listControl中被选择的位子
...判断是否选中要删除的项的代码部分省略
ipos=m_listEmployeeInfo.GetNextSelectedItem(pos);
strPersonID=m_listEmployeeInfo.GetItemText(ipos,0);//获取要删除的员工的编号
strSQL.Format(" insert into Resigner select * from EmployeeInfo where num=%s",strPersonID);//构造将该信息移动到离职信息表中的SQL语句
strSQL1.Format("delete from EmployeeInfo where num=%s",strPersonID);//构造删除语句
TRY
{.
..判断记录集的连接和异常处理部分代码省略
}
END_CATCH_ALL
db.BeginTrans();//开始处理事务
TRY
{
db.ExecuteSQL(strSQL);//执行SQL语句
db.ExecuteSQL(strSQL1);//执行SQL1语句
db.CommitTrans();//提交处理
}
CATCH(CDBException ,e)
{
e->ReportError();//报告错误
db.Rollback();//回滚记录
return;
}
END_CATCH
ShowItem("select * from EmployeeInfo");
}
else//如果选中的是其他
{
....代码段相似,省略
}
UpdateData(FALSE);
}
下面是修改员工信息部分的代码:
void CSalaryView::OnButtonModify()
{
.....字段定义和获取修改位置代码省略
iPos =m_listEmployeeInfo.GetNextSelectedItem(pos);//在修改的对话框中显示修改员工信息前的员工信息
dlg.m_strNum=m_listEmployeeInfo.GetItemText(iPos,i++);//逐个插入信息
.....
dlg.DoModal();//转到修改员工信息对话框
ShowItem("select * from EmployeeInfo");
UpdateData(FALSE);
}
修改员工信息对话框确定按钮代码:
void CModifyEmployeeDlg::OnButtonOk()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CString strTmp;
strTmp.Format("SELECT * FROM EmployeeInfo where num = %s", m_strNum);
CEmployeeInfoSet EmployeeInfoSet;
TRY
{
....打开记录集和判断记录集是否可以写入部分代码省略
EmployeeInfoSet.Edit();
EmployeeInfoSet .m_num =m_strNum;//设置各记录字段的值
....//逐个加入修改的值、代码跟添加中的代码一样,这里不作说明
EmployeeInfoSet .Update();//更新记录集
EmployeeInfoSet .Close();//关闭记录集
EmployeeInfoSet.Update();
EmployeeInfoSet.Close();
}
...异常处理
UpdateData(FALSE);
CDialog::OnOK();
}
下面是查找员工信息的代码:
void CSalaryView::OnButtonSearch()
{ UpdateData(TRUE);
if(m_cmbCondition.GetCurSel()==CB_ERR)//获取要查询的条件
return;
CString strCondition,strSQL;
m_cmbCondition.GetWindowText(strCondition);//获取combox控件中的内容
if(strCondition=="编号")//构造并执行查询语句
strSQL.Format("select * from EmployeeInfo where num Like '%s%s%s'","%",m_strQuery,"%");
.....
ShowItem(strSQL);
UpdateData(FALSE);
}
工资计算代码部分
下面是员工工资计算功能代码:
void CCount::OnButtonEsalarycount()
{
...定义记录集对象和判断记录集是否打开部分代码省略
while(SalaryInfoSet.IsOpen()&&!SalaryInfoSet.IsEOF())//判断是否是记录集的最后一条
{
if(SalaryInfoSet.m_num==m_strNumEmployee)//判断与输入的员工号一致否
{
A=atof(SalaryInfoSet.m_asalary.GetBuffer(SalaryInfoSet.m_asalary.GetLength()));//将获取的工资信息转换为float型
B=atof(SalaryInfoSet.m_bsalary.GetBuffer(SalaryInfoSet.m_bsalary.GetLength()));
C=atof(SalaryInfoSet.m_csalary.GetBuffer(SalaryInfoSet.m_csalary.GetLength()));
D=atof(SalaryInfoSet.m_bon.GetBuffer(SalaryInfoSet.m_bon.GetLength()));
E=A+B+D-C;//基本工资+加班工资+奖金—扣除的工资=全部工资
}
SalaryInfoSet.MoveNext();//指针移动至记录集下一条
}
}
......异常处理
m_strResultemployee.Format("%f",E); //将获取的工资和转换为字符型
UpdateData(FALSE);
}
下面是部门所发总工资之和计算部分代码
void CCount::OnButtonBsalarycount()
{
....与前面部分代码相似,省略
while(SalaryInfoSet.IsOpen()&&!SalaryInfoSet.IsEOF())//判断是否是最后一条记录
{
if(SalaryInfoSet.m_branch==m_strNumbranch)//判断部门是否与输入的一致
{ A=atof(SalaryInfoSet.m_asalary.GetBuffer(SalaryInfoSet.m_asalary.GetLength()));//将字符型工资信息转换为float型
.......
E=A+B+D-C;
F+=E;//记录+1,总工资=个人工资+
}
SalaryInfoSet.MoveNext();//指针移至下一条记录
}
}
异常处理 m_strResultbranch.Format("%f",F); //将float型转换为字符型
UpdateData(FALSE);
}
七、结论与体会
通过这数周的数据库设计,使我们从中受到很大的教育和练习,不仅将大学所学的知识进行了实际应用,还学到了很多书本上学不到的知识。开阔了视野,增长了知识,积累了一些经验和教训。充分锻炼了自己的动手和应用能力,真正做到了理论联系实际。
我们设计的个工资管理系统,提供了较为完备的员工、部门、工资等信息,实现了数据库的的基本的操作,如修改、插入、删除、更新等。员工表的基本操作包括增、删、查、改,其中删除有俩种选择:离职和其他,如果选择的是离职,那么该员工的信息就相应的移至离职员工信息表中,否则就当删除处理,另外俩张表包括工资信息和部门信息表等都是增、删、查、改等基本操作,工资计算包括对整个部门的基本工资进行修改,包括计算某个员工这个月度的总工资,还包括对这个部门所有员工的工资进行统计。由于整个课程设计时间比较仓促,所以该系统还有许多不尽如意的地方,对某些功能的细节设计还缺乏完备性,缺乏对系统整体进行周密的考虑等等多方面问题。这些都有待于进一步的改善。
本次程序我主要负责代码的编写,在编写代码的过程中、遇到各种各样的问题、例如头文件的使用,连接数据库代码的操作,以及怎样建立数据源,怎么样用代码把程序与数据源之间的联系建立起来,怎么样利用记录集将数据库中的表和程序结合起来。这些问题在以前的学习过程中从来没有遇到过,在这次的编写代码的过程中,我学到了很多知识,学会怎么样建立与数据源的连接,怎么样去管理一个数据库,怎么样利用数据源建立与程序之间的联系。这些都是要自己重新去学习的。
最后,我们要感谢老师的关心、指导和教诲。再次向所有关心、帮助、理解、支持我们做好数据库课程设计的老师和同学们致以深深的谢意,感谢你们的帮助和关爱!
八、 参考文献
本程序主要使用到的参考书籍:
1. Visual C++从初学到精通 吕兵 曲宝军 王玮等编著 电子工业出版社出版
2. Visual C++6.0编程实用技术与案例 陈元琰 邓宗明 张睿哲 张晓竞编著 清华大学出版社出版
3. 深入浅出MFC 侯俊杰编著
展开阅读全文