考勤管理系统3.docx
《考勤管理系统3.docx》由会员分享,可在线阅读,更多相关《考勤管理系统3.docx(29页珍藏版)》请在冰豆网上搜索。
考勤管理系统3
考勤管理系统
摘要:
考勤管理是与我们日常生活息息相关的问题。
本文设计并实现了一个考勤管理系统详细介绍了系统从需求分析,总体设计,详细设计以及实施各阶段的主要内容和成果。
设计实现的管理系统能够正确有效地完成考勤管理的日常工作,并能够根据需求进行灵活的查询;系统与数据库管理系统结合,提供了功能较为强大的数据安全功能;系统界面友好,操作简单,易掌握。
本系统的主要实现目标是统计并显示所有员工的出勤状态。
根据不同用户权限来保护用户信息安全。
并保证系统所收集的信息的正确。
关键词:
出勤管理系统,数据库,面向对象
目录
摘要2
1.需求分析2
1.1系统概述2
1.2系统功能模块设计2
1.3与其他系统的联系2
1.4数据流程图3
2.数据库设计3
2.1数据库需求分析3
2.2数据库概念结构设计4
2.3功能模块创建和界面设计5
3.详细设计11
3.1工作记录模块(加班)11
3.2工作记录模块(请假)16
3.3密码修改模块19
个人总结21
1.需求分析
对于一个现代化的企业来说,考勤管理是必须的,如何把每天发生的考勤信息如实地记录下来,保证考勤工作有条理地进行,同时确保相关数据的安全,信息处理的高效,并保证系统的实用性强,这是本系统设计的目的。
1.1系统概述
考勤管理系统可以为提供基本的考勤管理,从而帮助考勤人员能够使用软件对其现有流程进行高效的管理,这些管理包括:
●上班时间的设定。
上下班时间相对固定,可保存在客户端的设置文件中。
●员工出入单位的情况记录。
出入情况主要由考勤机来记录,但是需要设置人工添加的功能,已备特殊情况的处理。
●请假、加班和出差情况的记录。
每个月底进行整个月的出勤情况统计。
1.2系统功能模块设计
系统功能模块图如下:
1.3与其它其他系统的关系
考勤管理系统记录了员工上下班的情况,为工资管理系统直接提供每个月工作时间的统计结果,用以计算工资。
同时考勤系统也需要其他系统提供的员工、部门等信息。
1.4数据流程图
2.数据库设计
2.1数据库需求分析
根据数据流程,可以列出以下出勤管理系统所需的数据项和数据结构。
●出勤记录:
记录号、员工、出入情况和时间,如图1-3所示。
●月考勤统计:
记录号、员工、年月、累计正常工作时间、累计请假时间、累计加班时间、累计出差时间、迟到次数、早退次数和旷工次数,如图1-4所示。
●请假记录:
记录号、员工、假期起止时间/结束时间和请假缘由,如图1-5所示。
●加班记录:
记录号、员工、加班时间长度和日期如图1-6所示。
●出差记录:
记录号、员工、出差起始时间/结束时间和具体描述,如图1-7所示。
●工作时间记录:
职务、上班时间/下班时间,如图
所需的外部数据支持:
●人员信息:
员工号、密码、权限、姓名、部门等。
●部门设置:
部门编号、名称、上下班时间等。
图1-3:
图1-8:
图1-4
图1-5
图1-6图1-7
2.2数据库概念结构设计
系统E-R图
2.3各功能模块的创建和界面设计
本系统采用Dialogbased的应用程序框架。
程序数据库操作是通过MFC的CDBC类实现
(截图为Admin管理员用户和员工号10010普通用户获取)
1.登陆界面
2.登陆成功后的主界面
3.系统设置(修改各种职务上下班时间)
4.普通用户
5.普通用户主界面(不能使用系统设置)
6.每日出勤记录(Admin用户)
7.每日出勤记录(普通用户)(不能帮其他用户打卡)
8.出差记录(Admin)(可查看所有用户记录)
9.出差记录(普通用户)(此次截图使用员工号10011登陆看不到其他用户的信息)
加班记录(Admin用户)(可查看所有用户记录)
请假记录(Admin)(可查看所有用户记录)
查询(按早退次数查询)
按旷工次数查询
按员工号查询:
3详细设计
基于系统需求分析与系统总体设计的结论,本系统采用VisualStudio2005实现各模块的功能,下面按照功能模块的划分来分别阐述系统的详细设计和实现过程。
3.1加班
BOOLMore:
:
OnInitDialog()
voidMore:
:
OnBnClickedOk()
voidMore:
:
MyShow(void)
voidMore:
:
OnBnClickedButtonDelete()
voidMore:
:
MoreToMonth(CStringNum,intt)
成员变量:
m_nAllow、m_nEnd、m_nEvent、m_nListCtrl、m_nNum、m_nStart
voidMore:
:
MoreToMonth(CStringNum,intt)
{
CDatabasedb;
db.Open(_T("ODBC;DSN=MYACCESS"));
Month_setrs(&db);
rs.Open(Month_set:
:
dynaset,_T("select*from月考勤统计"));
while(!
rs.IsEOF())
{
if(rs.column3==Num)
{
rs.Edit();
rs.column10+=t;
rs.Update();
break;
}
rs.MoveNext();
}
rs.Close();
db.Close();
}
voidMore:
:
OnBnClickedButtonDelete()
{
//TODO:
在此添加控件通知处理程序代码
if(MessageBox(_T("确定删除当前记录?
"),NULL,MB_YESNO)==IDYES)
{
CStringNum;intt;
CDatabasedb;
db.Open(_T("ODBC;DSN=MYACCESS"));
More_setrs(&db);
rs.Open(More_set:
:
dynaset,_T("select*from加班记录表"));
rs.Move(m_nListCtrl.GetSelectionMark());
Num=rs.column2;
t=-(24*(365*(rs.column5.GetYear()-rs.column4.GetYear())+(30*(rs.column5.GetMonth()-rs.column4.GetMonth()))+(rs.column5.GetDay()-rs.column4.GetDay()))+rs.column5.GetHour()-rs.column4.GetHour());
rs.Delete();//删除当前记录
rs.MoveNext();//移到下一记录
if(rs.IsEOF())//删除记录为最后一条记录处理
rs.MoveLast();
if(rs.IsBOF())//删空记录集处理
rs.SetFieldNull(NULL);
rs.Close();
db.Close();
MyShow();
MoreToMonth(Num,t);
}
}
voidMore:
:
MyShow(void)
{
externCStringsz_Admin2;
CStringSQL;
if(sz_Admin2!
=_T(""))
{
CDatabasedb;
db.Open(_T("ODBC;DSN=MYACCESS"));
CDataRowsetworkrs(&db);
rs.Open(CDataRowsetwork:
:
dynaset,_T("select*from员工表"));
while(!
rs.IsEOF())
{
if(rs.column2==sz_Admin2)
{
SQL.Format(_T("select*from加班记录表WHERE加班记录表.员工号='%s'ORDERBY编号DESC"),rs.column1);
break;
}
rs.MoveNext();
}
rs.Close();
db.Close();
}
else
SQL=_T("select*from加班记录表ORDERBY编号DESC");
m_nListCtrl.DeleteAllItems();
CDatabasedb;
db.Open(_T("ODBC;DSN=MYACCESS"));
More_setrs(&db);
rs.Open(More_set:
:
dynaset,SQL);
while(!
rs.IsEOF())
{
CStringstr1;
str1.Format(_T("%d"),rs.column1);
intPos;
Pos=m_nListCtrl.InsertItem(0,str1);
m_nListCtrl.SetItemText(Pos,1,rs.column2);
m_nListCtrl.SetItemText(Pos,2,rs.column3.Format("%Y-%m-%d"));
m_nListCtrl.SetItemText(Pos,3,rs.column4.Format("%Y-%m-%d%H:
%M:
%S"));
m_nListCtrl.SetItemText(Pos,4,rs.column5.Format("%Y-%m-%d%H:
%M:
%S"));
m_nListCtrl.SetItemText(Pos,5,rs.column6);
m_nListCtrl.SetItemText(Pos,6,rs.column7);
rs.MoveNext();
}
rs.Close();
db.Close();
}
voidMore:
:
OnBnClickedOk()
{
//TODO:
在此添加控件通知处理程序代码
externCStringsz_Admin;
if(UpdateData(TRUE))
{
if(MessageBox(_T("确定添加?
"),NULL,MB_YESNO)==IDYES)
{
CStringNum;intt;
CDatabasedb;
db.Open(_T("ODBC;DSN=MYACCESS"));
More_setrs;
rs.Open(More_set:
:
dynaset,_T("select*from加班记录表"));
rs.AddNew();
rs.column2=m_nNum;
rs.column3=CTime(m_nStart.GetYear(),m_nStart.GetMonth(),m_nStart.GetDay(),0,0,0);
rs.column4=CTime(m_nStart.GetYear(),m_nStart.GetMonth(),m_nStart.GetDay(),m_nStart.GetHour(),m_nStart.GetMinute(),m_nStart.GetSecond());
rs.column5=CTime(m_nEnd.GetYear(),m_nEnd.GetMonth(),m_nEnd.GetDay(),m_nEnd.GetHour(),m_nEnd.GetMinute(),m_nEnd.GetSecond());
Num=rs.column2;
t=24*(365*(rs.column5.GetYear()-rs.column4.GetYear())+(30*(rs.column5.GetMonth()-rs.column4.GetMonth()))+(rs.column5.GetDay()-rs.column4.GetDay()))+rs.column5.GetHour()-rs.column4.GetHour();
rs.column6=m_nEvent;
rs.column7=sz_Admin;
rs.Update();
rs.Close();
db.Close();
MoreToMonth(Num,t);
}
MyShow();
//OnOK();
}
}
BOOLMore:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//TODO:
在此添加额外的初始化
externCStringsz_Admin;
m_nListCtrl.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
LPWSTRname[7]={_T("编号"),_T("员工号"),_T("加班日期"),_T("加班开始时间"),_T("加班结束时间"),_T("加班事由"),_T("批准人")};
for(intn=0;n<=6;n++)
{
LVCOLUMNlv;
lv.fmt=LVCFMT_CENTER;
lv.mask=LVCF_WIDTH|LVCF_TEXT|LVCF_FMT;
lv.pszText=name[n];
if(n==3||n==4)
lv.cx=190;
else
lv.cx=100;
m_nListCtrl.InsertColumn(n,&lv);
}
if(sz_Admin!
=_T(""))
{
m_nAllow=sz_Admin;
UpdateData(false);
}
if(sz_Admin=="")
{
GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(FALSE);
GetDlgItem(IDOK)->EnableWindow(FALSE);
SetWindowPos(NULL,50,50,600,260,SWP_NOMOVE|SWP_SHOWWINDOW);
}
MyShow();
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
//异常:
OCX属性页应返回FALSE
}
3.2请假
BOOLOff:
:
OnInitDialog()
voidOff:
:
OnBnClickedOk()
voidOff:
:
MyShow(void)
voidOff:
:
OnBnClickedButtonDelete()
voidOff:
:
OffToMonth(CStringNum,intt)
成员变量:
m_nAllow、m_nEnd、m_nEvent、m_nListCtrl、m_nNum、m_nStart
BOOLOff:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//TODO:
在此添加额外的初始化
externCStringsz_Admin;
m_nListCtrl.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
LPWSTRname[6]={_T("编号"),_T("员工号"),_T("请假开始时间"),_T("请假结束时间"),_T("请假事由"),_T("批准人")};
for(intn=0;n<=5;n++)
{
LVCOLUMNlv;
lv.fmt=LVCFMT_CENTER;
lv.mask=LVCF_WIDTH|LVCF_TEXT|LVCF_FMT;
lv.pszText=name[n];
if(n==2||n==3)
lv.cx=190;
else
lv.cx=100;
m_nListCtrl.InsertColumn(n,&lv);
}
if(sz_Admin!
=_T(""))
{
m_nAllow=sz_Admin;
UpdateData(false);
}
if(sz_Admin=="")
{
GetDlgItem(ID_BUTTON_DELETE)->EnableWindow(FALSE);
GetDlgItem(IDOK)->EnableWindow(FALSE);
SetWindowPos(NULL,50,50,600,260,SWP_NOMOVE|SWP_SHOWWINDOW);
}
MyShow();
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
//异常:
OCX属性页应返回FALSE
}
voidOff:
:
OnBnClickedOk()
{
//TODO:
在此添加控件通知处理程序代码
externCStringsz_Admin;
if(UpdateData(TRUE))
{
if(MessageBox(_T("确定添加?
"),NULL,MB_YESNO)==IDYES)
{
intt;
CDatabasedb;
db.Open(_T("ODBC;DSN=MYACCESS"));
Off_setrs;
rs.Open(Off_set:
:
dynaset,_T("select*from请假记录表"));
rs.AddNew();
rs.column2=m_nNum;
rs.column3=CTime(m_nStart.GetYear(),m_nStart.GetMonth(),m_nStart.GetDay(),m_nStart.GetHour(),m_nStart.GetMinute(),m_nStart.GetSecond());
rs.column4=CTime(m_nEnd.GetYear(),m_nEnd.GetMonth(),m_nEnd.GetDay(),m_nEnd.GetHour(),m_nEnd.GetMinute(),m_nEnd.GetSecond());t=365*(rs.column4.GetYear()-rs.column3.GetYear())+(30*(rs.column4.GetMonth()-rs.column3.GetMonth()))+(rs.column4.GetDay()-rs.column3.GetDay());
rs.column5=m_nEvent;
rs.column6=sz_Admin;
rs.Update();
rs.Close();
db.Close();
OffToMonth(m_nNum,t);
}
MyShow();
}
}
voidOff:
:
MyShow(void)
{
externCStringsz_Admin2;
CStringSQL;
if(sz_Admin2!
=_T(""))
{
CDatabasedb;
db.Open(_T("ODBC;DSN=MYACCESS"));
CDataRowsetworkrs(&db);
rs.Open(CDataRowsetwork:
:
dynaset,_T("select*from员工表"));
while(!
rs.IsEOF())
{
if(rs.column2==sz_Admin2)
{
SQL.Format(_T("select*from请假记录表WHERE请假记录表.员工号='%s'ORDERBY编号DESC"),rs.column1);
break;
}
rs.MoveNext();
}
rs.Close();
db.Close();
}
else
SQL=_T("select*from请假记录表ORDERBY编号DESC");
m_nListCtrl.DeleteAllItems();
CDatabasedb;
db.Open(_T("ODBC;DSN=MYACCESS"));
Off_setrs(&db);
rs.Open(Off_set:
:
dynaset,SQL);
while(!
rs.IsEOF())
{
CStringstr1;
str1.Format(_T("%d"),rs.column1);
intPos;
Pos=m_nListCtrl.InsertItem(0,str1);
m_nListCtrl.SetItemText(Pos,1,rs.column2);
m_nListCtrl.SetItemText(Pos,2,rs.column3.Format("%Y-%m-%d%H:
%M:
%S"));
m_nListCtrl.SetItemText(Pos,3,rs.column4.Format("%Y-%m-%d%H:
%M:
%S"));
m_nListCtrl.SetItemText(Pos,4,rs.column5);
m_nListCtrl.SetItemText(Pos,5,rs.column6);
rs.MoveNext();
}
rs.Close();
db.Close();
}
voidOff:
:
OnBnClickedButtonDelete()
{
//TODO:
在此添加控件通知处理程序代码
if(MessageBox(_T("确定删除当前记录?
"),NULL,MB_YESNO)==IDYES)
{
CStringNum;
intt;
CDatabasedb;
db.Open(_T("ODBC;DSN=MYACCESS"));
Off_setrs(&db);
rs.Open(Off_set:
:
dynaset,_T("select*from请假记录表"));
rs.Move(m_nListCtrl.GetSelectionMark());
Num=rs.column2;
t=-(365*(rs.column4.GetYear()-rs.column3.GetYear())+(30*(rs.column4.GetMonth()-rs.column3.GetMonth()))+(rs.column4.GetDay()-rs.column