考勤管理系统文档格式.docx
《考勤管理系统文档格式.docx》由会员分享,可在线阅读,更多相关《考勤管理系统文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
三、设计内容和步骤
在软、硬件方面对系统的需求,软件要求易学,容易掌握,可以很简单方便的管理各种信息。
硬件的配置要求不能太高,这样可以很好的适应当前的企业情况。
1.系统功能模块设计:
系统功能模块如图1-1所示。
图1-1系统功能模块图
2.数据流程图:
系统的数据流程图1-2所示,出勤的原始记录主要来源于考勤机,并且以固定格式保存在数据库中。
考勤管理系统的任务是如何处理这些数据。
图1-2考勤管理系统数据流程图
3.数据库概念结构设计(E-R图)如下所示:
图1-3E-R图
3.数据库需求分析:
根据数据流程,可以列出以下管理系统所需的数据项和数据结构。
出勤记录:
记录号、员工、出入情况和出入时间,如图1-4所示。
图1-4ATTENDANCE出勤记录表
月度考勤统计:
记录号、员工、年月、累计正常工作时间、累计请假时间、累计加班时间、累计出差时间、迟到次数、早退次数和旷工次数,如图1-5所示。
图1-5ATTENDANCE_STAT月度考勤统计表
请假记录:
记录号、员工、假期起始时间/结束时间和请假缘由,如图1-6所示。
图1-6LEAVE请假记录表
加班记录:
记录号、员工、加班时间长度和日期,如图1-7所示。
图1-7OVERTIME加班记录表
出差记录:
记录号、员工、出差起始时间/结束时间和具体描述,如图1-8所示。
图1-5ERRAND出差记录表
人员信息:
员工号、密码、权限、姓名、部门和当前状态等,如图1-9所示。
图1-9PERSON人员信息表
部门设置:
部门编号、名称等,如图1-10所示。
图1-10DEPARTMENT部门设置表
5.数据库操作的准备:
为了使用ODBC类,需要在stdafx.h中加入#include”afxdb.h”一行。
因本程序只需要连接一个数据库,所以定义了一个Cdatabase型的全局变量db,一次性打开和关闭数据库。
数据库的打开在登录认证对话框中。
在主程序结束前需关闭数据库,因此在App类的ExitInstance()函数中加入代码:
if(db.IsOpen())db.Close();
为了编程便捷,可以为数据库中的每一个表映射一个记录集类(从CrecordSet类继承),其映射关系如表1-1所示。
这些类通过RFX(RecordFieldExchange)机制将成员变量和表格中的字段值联系起来,通过方问成员变量可以访问当前记录中字段的值。
Crecordset派生类
表格
CAttendanceRS
ATTENDANCE出勤记录表
CCounterRS
COUNTER计数器表
CdepartRS
DEPARTMENT部门信息表
CerrandRS
ERRAND出差记录表
CLeaveRS
LEAVE请假记录表
COvertimeRS
OVERTIME加班记录表
CPersonRS
PERSON员工个人信息表
CStatRS
ATTENDANCE_STAT月度考勤统计表
表1-1CRecordset派生类对应的表格
6.主对话框的设计:
主对话框界面如图1-11所示。
用户可以通过菜单进行方便的操作,如添加记录,统计记录等。
每个菜单项关联了一个对话框,在相应的菜单项的初始化中使用:
类名dlg;
dlg.DoModal();
两条语句来进行实现。
图1-11主对话框
6.考勤统计对话框的创建
考勤统计对话框界面设计如图1-12所示。
用户可进行月度统计,也可以通过查找满足条件的记录如年月、员工、姓名等来进行相关的统计。
图1-12考勤统计对话框
四、测试和评价
经过测试,该使用程序能够较好的实现上班时间的设定;
能够提供员工出入单位的情况记录;
能够提供请假、加班和出差情况的记录,并实现查询、添加、修改、删除、浏览等处理功能;
能够在每个月底进行整个月的出勤情况统计;
能够拥有一定的安全性、协调性和完整性。
但在安全性上存在一定的漏洞;
功能不够完善,不能进行统一查询;
界面相对简单,所以总体评价为中等。
希望能得到彭老师的指导得以更加完善此系统,添补漏洞。
五、附录
1.主界面源代码清单:
BOOLCAttendanceDlg:
:
OnInitDialog()
{
CDialog:
OnInitDialog();
//Add"
About..."
menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL
{CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{pSysMenu->
AppendMenu(MF_SEPARATOR);
pSysMenu->
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
voidCAttendanceDlg:
OnBtnConfig()
//显示工作时间设置对话框
CWorkplanDlgdlg;
}
2.考勤修改对话框源代码清单:
BOOLCAttDlg:
OnInitDialog()//初始化对话框
{
m_Sheet.Create(this,WS_CHILD|WS_VISIBLE,0);
//创建窗口
m_Sheet.ModifyStyleEx(0,WS_EX_CONTROLPARENT);
//修改风格
m_Sheet.ModifyStyle(0,WS_TABSTOP);
//设置窗口位置
m_Sheet.SetWindowPos(NULL,0,100,0,0,
SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE);
returnTRUE;
为了方便地更新列表框内容,编写了UpdateList()函数,调用些函数可使列表框显示给定的数据表格。
voidCPage1:
UpdateList(CAttendanceRS&
rs)//更新列表框内容
inti=0;
CStringstrID,strTime;
rs.Open();
//打开出勤记录表
m_cList.DeleteAllItems();
//清除列表框内容
while(!
rs.IsEOF())//对数据表中所有记录进行处理
{
m_cList.InsertItem(i,"
"
);
//添加新Item
strID.Format("
%d"
rs.m_ID);
//转换为字符串
m_cList.SetItemText(i,0,strID);
m_cList.SetItemText(i,1,rs.m_PERSON);
m_cList.SetItemText(i,2,rs.m_IN_OUT);
m_cList.SetItemText(i,3,rs.m_IO_TIME.Format("
%Y-%m-%d%H:
%M"
));
rs.MoveNext();
//跳到下一条记录
i++;
rs.Close();
//关闭出勤记录表
添加部门和全体员工出勤记录的过程最终可分解为添加单个员工记录的过程。
为了避免程序的重复,设置了下面的子程序:
//添加出勤记录函数
IO_Add(CStringstrPersonID)
intcounter;
//用于计数
CStringstrIO;
//保存出入情况
CCounterRSrs_counter(&
db);
//构造计数器记录表
//记录编号
rs_counter.m_strFilter="
ID='
A'
;
//设置过滤器,提取计数值
rs_counter.Open();
//打开计数器记录表
counter=rs_counter.m_COUNTER_VALUE;
//提取计数值
counter++;
//计数值加1
rs_counter.Edit();
//编辑计数器
rs_counter.m_COUNTER_VALUE=counter;
//保存当前计数
rs_counter.Update();
//提交修改
rs_counter.Close();
//关闭计数器记录表
//添加记录
//判断确定出入情况
if(((CButton*)GetDlgItem(IDC_RADIO_OUT))->
GetCheck())
strIO="
O"
elsestrIO="
I"
//转换出入时间类型
intnYear,nMonth,nDay,nHour,nMinute;
//年,月,日,时,分
sscanf(m_strIOTime.Left(4),"
&
nYear);
//得到年
sscanf(m_strIOTime.Mid(5,2),"
nMonth);
//得到月
sscanf(m_strIOTime.Mid(8,2),"
nDay);
//得到日
sscanf(m_strIOTime.Mid(11,2),"
nHour);
//得到时
sscanf(m_strIOTime.Mid(14,2),"
nMinute);
//得到分
//得到出入时间
CTimeIO_time(nYear,nMonth,nDay,nHour,nMinute,0);
CAttendanceRSrs_attendance(&
//构造考勤记录表
rs_attendance.Open();
//打开考勤记录表
rs_attendance.AddNew();
//追加考勤记录
rs_attendance.m_ID=counter;
rs_attendance.m_PERSON=strPersonID;
rs_attendance.m_IN_OUT=strIO;
rs_attendance.m_IO_TIME=IO_time;
rs_attendance.Update();
rs_attendance.Close();
//关闭考勤记录表
UpdateList(rs_attendance);
//更新列表框
3.考勤统计对话框源代码清单
当输入员工号时,检索员工姓名,用于确认输入。
voidCStatDlg:
OnChangeStatEdtSeekpersonid()
UpdateData();
//更新数据
CPersonRSrs(&
//构造记录集
rs.m_strFilter="
+m_strPersonID+"
'
//设置过滤条件
//打开记录集
if(rs.GetRecordCount()==1)//判断员工记录是否存在
m_strPersonName=rs.m_NAME;
//得到员工姓名
elsem_strPersonName.Empty();
//清除员工姓名的显示
//关闭记录集
UpdateData(FALSE);
//更新界面数据
在以上代码中用到了StrToTime函数,这是一个全局函数,代码如下:
CtimeStrToTime(Cstringstr)
{//时间串格式“%Y-%m-%d%H:
%M:
%S”,如“1999-01-0111:
11:
11”
intnYear,nMonth,nDay,nHour,nMinute,nSecond;
sscanf(str.Left(4),”%d”,&
//得到年
sscanf(str.Mid(5,2),”%d”,&
//得到月
sscanf(str.Mid(8,2),”%d”,&
//得到日
sscanf(str.Mid(11,2),”%d”,&
//得到时
sscanf(str.Mid(14,2),”%d”,&
//得到分
sscanf(str.Mid(17,2),”%d”,&
nSecond);
//得到秒
//构造Ctime变量
Ctimeresult(nYear,nMonth,nDay,nHour,nMinute,nSecond);
Returnresult;
4.参考文献:
1、陈建春.VisualC++开发GIS系统,开发实例剖析,2000年.
2、陈建春.VisualC++高级编程技术,开发实例剖析,1999年.
3、李于剑.VisualC++实践和提高,图形图象编程篇,2001年.
4、同志工作室.VisualC++6.0开发技巧和实例教程,2000年.
5、赵仕健.VisualC++6.0编程和实例分析,2000年.
6、钱能.C++程序设计教程,1999年.