VC课设公司员工工资管理系统.doc
《VC课设公司员工工资管理系统.doc》由会员分享,可在线阅读,更多相关《VC课设公司员工工资管理系统.doc(23页珍藏版)》请在冰点文库上搜索。
公司员工工资管理系统
1课程设计目的
公司员工工资管理系统是典型的人员信息管理系统,其主要的功能是把人员管理过程信息化,自动化以减轻人工的重复繁琐劳动。
其开发主要包括后台数据库的建立维护以及前台应用程序的开发两个方面。
对于后台数据库要求建立一个稳定的数据库,保持数据的一致性,完整性,安全性也是必要的。
对于前台要求稳定,实用,易用。
本系统是为公司人事管理的各种工作而设计的。
根据需求分析,需要实现对系统用户,基本信息(公司部门,人员相关信息等),考勤考评的管理。
经过分析,本系统使用SQLSERVER做为其后台数据库,采用ADO数据库链接技术;VisualC++做为开发工具,提供了相当齐备的类库、友好的编程界面和多种多样的数据库访问技术。
其中ADO使得编写数据库应用程序变得简单容易。
公司人事管理系统是典型的信息管理系统,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。
对于前者要求建立起数据一致性,完整性,安全性好的库。
而对于后者则要求应用程序功能完备,易使用等特点。
2功能描述
系统功能分析
企业工资管理系统需要完成的功能主要有
*系统数据初始化
*员工基本信息数据的输入
*员工基本信息数据的修改、删除
*企业工资的基本设定
*员工工资的浏览
*员工个人工资表的查询
3方案论证
3.1总体设计
系统功能模块设计如下图所示。
员工工资管理系统
工资汇总
工资基本设置
员工信息
资料输入
员工增删
员工查询
员工修改
基本工资
员工奖金
工资福利
个人罚款
工资总表
个
人工资查询
图1系统功能模块
3.2详细设计
3.2.1数据库设计
通过对企业工资管理的内容和数据流程分析,设计的数据项和数据结构如下。
*员工基本状况包括的数据库项有员工号、员工姓名、性别、所在部门、生日、家庭住址、联系电话等。
因为本程序中只涉及到工资管理,故为了说明简单在数据库中只包含进了与员工的工资相关的资料,如入厂时间、所在部门、岗位、工资级别等。
*工资级别的工资金额,包括的数据库项有工资技能等级、工资额。
*企业部门及工作岗位信息包括的数据库项有部门名称、工作岗位名称、岗位工资
等。
*公司福利金额包含的数据库项有福利值。
*工资信息包含的数据库项有员工号、员工姓名、员工基础工资、公司福利、员工
实得工资。
3.2.2数据库概念结构设计
根据公司员工信息管理系统设计的信息数据和系统功能模块结构,公司员工信息管理系统数据库包括工资详情表、登陆框结构表、工资详情表、员工信息表。
为数据库员工工资表添加如下数据表。
表1工资详情表结构
字段名称
数据类型
说明
编号
自动编号
ID
文本
员工号
departmen
文本
部门号
name
文本
姓名
salary
数字
工资
remark
文本
备注
表2登陆框结构
字段名称
数据类型
说明
Name
文本
用户名
password
文本
密码
表3工资详情表结构
字段名称
数据类型
说明
编号
自动编号
ID
文本
员工号
department
文本
部
号
basic
数字
基本工资
bonus
数字
奖金
welfare
数字
福利
fine
数字
罚款
total
数字
总工资
表4员工信息表结构
字段名称
数据类
说明
编号
自动编号
ID
文本
员工号
department
文本
部门号
name
文本
姓名
sex
文本
性别
tob
文本
职务
tel
文本
电话
address
文本
住址
3.3创建数据源
为数据库创建用户DSN,数据源名称为“员工工资表”。
图2创建数据源
3.3.1数据库结构的实现
在需求分析、概念结构设计的继承上得数据库的逻辑结构之后,我们就可以在数据库系统中实现该逻辑结构。
数据库的逻辑结构直接使用项目管理器来实现在这之前先建一个名为salary工资的项目保存在磁盘,如D\salary。
存储为
D:
\salary\database\salary.dbc。
为数据库添加数据表存储为D\salary\database\
tms.dbf.
3.3.2程序界面设计
(1)员工工资模块设计
图3员工工资管理模块
查询控件的设计
在CEX_Viewl类中添加按扭控件查询IDC_BUTTON_QUERYY的BN_CLICKED消息映射并添加下列代码。
voidCEx_View:
:
OnButtonQuery()
{
UpdateData();
m_strQuery.TrimLeft();
if(m_strQuery.IsEmpty())
{
MessageBox("要查询的员工号不能为空");
return;
}
if(m_pSet->IsOpen())
m_pSet->Close();
m_pSet->m_strFilter.Format("ID='%s'",m_strQuery);
m_pSet->m_strSort="department";
m_pSet->Open();
if(!
m_pSet->IsEOF())
UpdateData(FALSE);
else
MessageBox("没有查到你要找员工的记录!
");
}
(2)添加、修改、删除控件的设计
添加一对话框资源ID号为IDD_SALARY_TABLE,将表单资源的控件复制到对话框即可,然后为对话框资源创建一个对话框类CSalaryDlg,在MFC中为控件添加成员变量如下图所示。
图4员工工资表界面
图5为控件添加成员变量
然后为IDOK添加BN_CLICKED消息映射并添加下列代码:
voidCSalaryDlg:
:
OnOK()
{
UpdateData();
m_strID.TrimLeft();
m_strDepartment.TrimLeft();
if(m_strID.IsEmpty())
MessageBox("员工号不能为空!
");
else
if(m_strDepartment.IsEmpty())
MessageBox("部门号不能为空!
");
else
CDialog:
:
OnOK();
}
然后CEx_View类中的三个按扭IDC_REC_ADDIDC_REC_EDITIDC_REC_DEL添加
BN_CLICKED消息映射,并添加下列代码:
voidCEx_View:
:
OnRecAdd()
{
CSalaryDlgdlg;
if(dlg.DoModal()==IDOK){
m_pSet->AddNew();
m_pSet->m_department=dlg.m_strDepartment;
m_pSet->m_ID=dlg.m_strID;
m_pSet->m_name=dlg.m_strName;
m_pSet->m_salary=dlg.m_fSalary;
m_pSet->Update();
m_pSet->Requery();
}
}
voidCEx_View:
:
OnRecEdit()
{
CSalaryDlgdlg;
dlg.m_strDepartment=m_pSet->m_department;
dlg.m_strID=m_pSet->m_ID;
dlg.m_strName=m_pSet->m_name;
dlg.m_fSalary=m_pSet->m_salary;
if(dlg.DoModal()==IDOK){
m_pSet->Edit();
m_pSet->m_department=dlg.m_strDepartment;
m_pSet->m_ID=dlg.m_strID;
m_pSet->m_name=dlg.m_strName;
m_pSet->m_salary=dlg.m_fSalary;
m_pSet->Update();
m_pSet->Requery();
UpdateData(FALSE);
}
}
voidCEx_View:
:
OnRecDel()
{
CRecordsetStatusstatus;
m_pSet->GetStatus(status);
m_pSet->Delete();
if(status.m_lCurrentRecord==0)
m_pSet->MoveNext();
else
m_pSet->MoveFirst();
UpdateData(FALSE);
}
(3)工资详情模块的设计
图6工资详情设计
为对话框资源创建一个对话框类CDetailDlg,在MFC中为控件添加成员变量如下图所示。
图7为控件添加成员变量
为表单资源的按扭添加BN_CLICKED消息映射并添加下列代码。
voidCEx_View:
:
OnButtonDetail()
{
CDetailDlgdlg;
dlg.DoModal();
}
在CDetailDlg类中添加按扭控件查询IDC_BUTTON_QUERYY2的BN_CLICKED消息映射并添加下列代码
voidCDetailDlg:
:
OnButtonQuery2()
{
UpdateData();
m_strQuery2.TrimLeft();
if(m_strQuery2.IsEmpty())
{
MessageBox("要查询的员工号不能为空!
");
return;
}
CStringstr;
str=m_strQuery2;
CDetailSetcSet;
cSet.m_strFilter.Format("ID='%s'",str);
cSet.Open();
if(!
cSet.IsEOF())
{
m_strDepartment=cSet.m_department;
m_fBasic=cSet.m_basic;
m_fBonus=cSet.m_bonus;
m_fWelfare=cSet.m_welfare;
m_fFine=cSet.m_fine;
m_fTotal=cSet.m_total;
m_strID=cSet.m_ID;
UpdateData(FALSE);
}
else
MessageBox("查询的员工记录不存在!
");
if(cSet.IsOpen())cSet.Close();
}
添加一对话框资源ID号为IDD_DETAIL_TABEL将工资详情的控件复制到对话框即可。
然后为话框资源创建一个对话框类CDtabelDlg在MFC中为控件添加成员变量如下图所示。
图8工资详情表界面
然后为IDOK添加BN_CLICKED消息映射,并添加下列代码:
voidCDtabelDlg:
:
OnOK()
{
UpdateData();
m_strID.TrimLeft();
m_strDepartment.TrimLeft();
if(m_strID.IsEmpty())
MessageBox("员工号不能为空!
");
else
if(m_strDepartment.IsEmpty())
MessageBox("部门号不能为空!
");
else
CDialog:
:
OnOK();
}
然后CDetailDlg类中的三个按扭,IDC_REC_ADD,IDC_REC_EDIT,IDC_REC_DEL添加
BN_CLICKED消息映射,并添加下列代码:
voidCDetailDlg:
:
OnButtonAdd2()
{
CDtabelDlgdlg;
if(dlg.DoModal()==IDOK){
CDetailSetpSet;
pSet.AddNew();
pSet.m_department=dlg.m_strDepartment;
pSet.m_ID=dlg.m_strID;
pSet.m_basic=dlg.m_fBasic;
pSet.m_bonus=dlg.m_fBonus;
pSet.m_welfare=dlg.m_fWelfare;
pSet.m_fine=dlg.m_fFine;
pSet.m_total=dlg.m_fTotal;
pSet.Update();
pSet.Requery();
}
}
voidCDetailDlg:
:
OnButtonEdit2()
{
CDetailSetpSet;
pSet.Open();
UpdateData();
pSet.Edit();
pSet.m_department=m_strDepartment;
pSet.m_ID=m_strID;
pSet.m_basic=m_fBasic;
pSet.m_bonus=m_fBonus;
pSet.m_welfare=m_fWelfare;
pSet.m_fine=m_fFine;
pSet.m_total=m_fTotal;
UpdateData(FALSE);
pSet.Update();
pSet.Requery();
pSet.Close();
MessageBox("修改成功");
}
voidCDetailDlg:
:
OnButtonDel2()
{
UpdateData();
CDetailSetcSet;
cSet.Open();
cSet.m_strFilter="ID='"+m_strID+"'";
cSet.Requery();
cSet.Delete();
cSet.Close();
UpdateData(false);
}
(4)登陆框的设计
如上的方法依次为其创建对话框类DengluDlg和CRecordSet派生类CDengluSet在MFC中为控件添加成员变量。
登陆框界面如下图所示。
图9登陆框界面
然后为IDOK添加BN_CLICKED消息映射,并添加下列代码:
BOOLCDengluDlg:
:
check()
{
UpdateData();
CDengluSetpSet;
pSet.Open();
if(m_stryonghu.IsEmpty()||m_strmima.IsEmpty())
{
MessageBox("请输用户名和密码!
");
returnfalse;
}
pSet.m_strFilter.Format("name='%s'",m_stryonghu);
pSet.Requery();
if(pSet.m_name!
=m_stryonghu||pSet.m_password!
=m_strmima)
{MessageBox("密码或用户名有错!
");
returnfalse;
}
returntrue;
}
voidCDengluDlg:
:
OnOK()
CWnd*m_pMainWnd;
if(!
check())
return;
CDialog:
:
OnOK();
m_pMainWnd=AfxGetMainWnd();
CDialog:
:
OnOK();
}
4系统测试
4.1系统测试结果
系统测试结果如图所示。
图10进入登陆框测试
用户进入主界面如下图所示。
图11进入主界面测试
4.2异常处理
由于时间匆忙以及本人水平有限,本程序存在的问题比较多,自认为主要有以下几个方面。
(1)程序没有对输入的员工信息诸如工号、姓名、部门号等进行检测其合理性所以在工号姓名、部门号等中可以输入字母或在名字中可以输入数字就在所难免了
作为一个员工信息管理,这样的安全性是致命的。
要解决这个问题就要在重载函数
中加入各种判断语句工作量比较大。
(2)由于水平有限没有制作图形界面多媒体等美化程序的设置只是一些简单的对
话框和界面,看起来难免有些单调不够完善。
(3)程序的功能也是一个问题员工的信息太简单,可进行的操作也少可能有些功能
实现起来显得有些别扭。
5心得体会
通过这次课题设计,我觉得做好一个程序,灵活运用是关键。
把基础学好不一定能把程序编好,但基础知识不好,一定编不出好程序。
做大规模的程序不只是一个人努力就行了,一定要有团队合作能力。
编程最主要是思路清晰,只要你把思路理顺了,就有利于你在编程的过程中少走弯路。
要想学好这门课我觉得除了在课堂上认真学习之外也要做好以下几点:
1.认真对待每一个程序的编写
2.做好对每一个所编程序的总结
3.写程序尽量要规范、严谨,效率尽量要高
4.养成自我测试的习惯
5.多看一些别人编的程序,把好的思路和方法记下来,以备不时之需
6.要有恃之以恒的精神以及严谨的科学研究作风
在努力奋斗中,我终于把本次课题设计顺利完成。
回想起课题设计过程中面对程序错误一大堆的失望与成功完成程序中每一个模块的喜悦时,我真正的体会到了:
细节决定成败;学术不管是哪一门,只要你用心去对待它,它也会用心地来回报你,这也正印证了一句话:
“一分耕耘一分收获”。
6参考文献
[1]郑阿奇,丁有和.VisualC++教程[M].北京:
清华大学出版社,2016.3:
346-349
[2]马石安,魏文平.VisualC++程序设计与应用教程题解及课程设计[M].北京:
清华大学出版社,2015.7:
101-230
[3]郑莉.C++语言程序设计案例教程[M].北京:
清华大学出版社,2016.7:
24-139
[4]黄明.面向对象程序设计习题详解[M].北京:
机械工业出版社,2015.9:
32-105
[5]徐士良.C常用算法程序集[M].北京:
清华大学出版社,2015.9:
29-91
[6]黄维通.VisualC++面向对象与可视化设计(第2版)[M].北京:
清华大学出版社,2014.12:
36-105
7附录(部分源代码)
在CEX_Viewl类中添加按扭控件查询IDC_BUTTON_QUERYY的BN_CLICKED消息映射并添加下列代码。
voidCEx_View:
:
OnButtonQuery()
{
UpdateData();
m_strQuery.TrimLeft();
if(m_strQuery.IsEmpty())
{
MessageBox("要查询的员工号不能为空");
return;
}
if(m_pSet->IsOpen())
m_pSet->Close();
m_pSet->m_strFilter.Format("ID='%s'",m_strQuery);
m_pSet->m_strSort="department";
m_pSet->Open();
if(!
m_pSet->IsEOF())
UpdateData(FALSE);
else
MessageBox("没有查到你要找员工的记录!
");
}
然后为IDOK添加BN_CLICKED消息映射并添加下列代码:
voidCSalaryDlg:
:
OnOK()
{
UpdateData();
m_strID.TrimLeft();
m_strDepartment.TrimLeft();
if(m_strID.IsEmpty())
MessageBox("员工号不能为空!
");
else
if(m_strDepartment.IsEmpty())
MessageBox("部门号不能为空!
");
else
CDialog:
:
OnOK();
}
然后CEx_View类中的三个按扭IDC_REC_ADDIDC_REC_EDITIDC_REC_DEL添加
BN_CLICKED消息映射,并添加下列代码:
voidCEx_View:
:
OnRecAdd()
{
CSalaryDlgdlg;
if(dlg.DoModal()==IDOK){
m_pSet->AddNew();
m_pSet->m_department=dlg.m_strDepartment;
m_pSet->m_ID=dlg.m_strID;
m_pSet->m_name=dlg.m_strName;
m_pSet->m_salary=dlg.m_fSalary;
m_pSet->Update();
m_pSet->Requery();
}
}
voidCEx_View:
:
OnRecEdit()
{
CSalaryDlgdlg;
dlg.m_strDepartment=m_pSet->m_department;
dlg.m_strID=m_pSet->m_ID;
dlg.m_strName=m_pSet->m_name;
dlg.m_fSalary=m_pSet->m_salary;
if(dlg.DoModal()==IDOK){
m_pSet->Edit();
m_pSet->m_department=dlg.m_strDepartment;
m_pSet->m_ID=dlg.m_strID;
m_pSet->m_name=dlg.m_strName;
m_pSet->m_salary=dlg.m_fSalary;
m_pSet->Update();
m_pSet->Requery();
UpdateData(FALSE);
}
}
voidCEx_View:
:
OnRecDel()
{
CRecordsetStatusstatus;
m_pSet->GetStatus(status);
m_pSet->Delete();
if(status.m_lCurrentRecord==0)
m_pSet->MoveNext();
else
m_pSet->MoveFirst();
UpdateData(FALSE);
}
为表单资源的按扭添加BN_CLICKED消息映射并添加下列代码。
voidCEx_View:
:
OnButtonDetail()
{
CDetailDlgdlg;
dlg.DoModal();
}
在CDetailDlg类中添加按扭控件查询IDC_BUTTON_QUERYY2的BN_CLICKED消息映射并添加下列代码
voidCDetailDlg:
:
OnButtonQuery2()
{
UpdateData();
m_strQuery2.TrimLeft();
if(m_strQuery2.IsEmpty())
{
MessageBox("要查询的员工号不能为空!
");
return;
}
CStringstr;
str=m_strQuery2;
CDetailSetcSet;
cSet.m_