1、 考勤系统开发方案及过程 编写人:Paul 编写时间:7月23日 一、设计目标 伴随计算机发展及网络技术应用,当今社会正快速向信息自动化社会前进,信息自动化作用也越来越大,尤其是各行业管理领域,智能化信息处理已是提升效率、规范管理、客观审查最有效路径。考勤作为一个企业基项管理,是单位对职员工作管理基础依据。开发考勤管理系统,正是完善企业信息化管理关键步骤。对于职员考勤假如仍使用传统手工方法录入将是一项复杂工作。面对庞大信息量,该方法现关键存在以下弊端: 1、 浪费人力、效率低下; 2、考勤结果反应速度慢(一月才能汇总一次)
2、主管部门不能立即全方面地监督职员出勤情况; 3、难避免考勤中弄虚作假现象。部分单位上报工资人数往往大于实际考勤和领工资人数,造成企业大量工资流失; 4、因为考勤数据不正确,企业劳感人事工资管理系统很多基础数据也存在较大误差,给人事部门很多全局性统计工作也带来了不正确性; 5、考勤统计工作复杂繁重,难以确保统计结果正确性、立即性。 所以,人工考勤已极难满足企业规范化管理要求。建立现代化智能考勤管理系统势在必行。 经过考勤管理系统能满足企业多个考勤及管理要求,能为企业带来巨大经济效益: 1、考勤管理系统经过考勤机判定并统计职员上下班关信息,能够确保考勤数据正确、公正、安全,降低考勤人
3、员工作负担,避免人为原因干扰和弄虚作假现象; 2、全部职员考勤信息可一次读回,考勤系统对信息统一处理,快速、全方面; 3、能为人事工资管理系统提供可靠数据资料,确保人事统计正确、可靠; 4、各管理用计算机及管理软件用Windows环境下全汉字界面平台,能灵活处理多种特殊情况,方便修改多种基础信息,提供丰富统计报表,查询方便,管理安全,操作简便易学; 二、设计任务 1. 能够方便地对上班时间进行设定; 2. 能够提供职员出入单位情况统计。出入情况关键由考勤机来统计,不过需要设置人工添加功效,如出勤统计、月度考勤统计、人员信息、部门设置等,已备特殊情况处理; 3. 能
4、够提供请假、加班和出差情况统计,并实现查询、添加、修改、删除、浏览等处理功效; 4. 能够在每个月底进行整个月出勤情况统计; 5. 能够含有一定安全性、协调性和完整性。 三 、设计内容和步骤 在软、硬件方面对系统需求,软件要求易学,轻易掌握,能够很简单方便管理多种信息。硬件配置要求不能太高,这么能够很好适应该前企业情况。 1. 系统功效模块设计: 系统功效模块图1-1所表示。 考勤管理系统 上下班时间设置 工作情况统计 考勤统计 手工补计出勤 加班统计 请假统计 出差统计 图1-1系统功效模块图 2. 数据
5、步骤图: 系统数据步骤图1-2所表示,出勤原始统计关键起源于考勤机,而且以固定格式保留在数据库中。考勤管理系统任务是怎样处理这些数据。 图1-2考勤管理系统数据步骤图 职员 上下班划卡 统计出勤时间 职员 出勤统计 请假、值班、出差统计 月度职员考勤统计表 多种统计信息 经理审批 请假、值班、出差 经过 考勤员 请假、值班、出差 上下班时间安排 上下班时间安排 管理人员 3.数据库概念结构设计(E-R图)以下所表示: 职员 职员号 职员密码 权限 姓名 所在部门 ┄┄ 出差统计 统计编号 起始时间 结束时间 具体描述 出勤统计
6、 月度考勤统计 请假统计 加班统计 统计编号 出入状态 出入时间 统计编号 年月 累计工作时间 累计加班时间 累计请假时间 累计出差时间 迟到次数 早退次数 矿工时间 统计编号 起始时间 结束时间 缘由 统计编号 加班时间 日期 统计 统计 统计 统计 统计 图1-3 E-R 图 3. 数据库需求分析: 依据数据步骤,能够列出以下管理系统所需数据项和数据结构。 出勤统计:统计号、职员、出入情况和出入时间,图1-4所表示。 图1-4 ATTENDANCE出勤统计表 月度考勤统计:
7、统计号、职员、年月、累计正常工作时间、累计请假时间、累计加班时间、累计出差时间、迟到次数、早退次数和旷工次数,图1-5所表示。 图1-5 ATTENDANCE_STAT月度考勤统计表 请假统计:统计号、职员、假期起始时间/结束时间和请假缘由,图1-6所表示。 图1-6 LEAVE 请假统计表 加班统计:统计号、职员、加班时间长度和日期,图1-7所表示。 图1-7 OVERTIME 加班统计表 出差统计:统计号、职员、出差起始时间/结束时间和具体描述,图1-8所表示。 图1-5 ERRAND 出差统计表 人员信息:职员号、密码、权限、姓名、部门和目前状态等,图1-9所表示。
8、 图1-9 PERSON 人员信息表 部门设置:部门编号、名称等,图1-10所表示。 图1-10 DEPARTMENT 部门设置表 5.数据库操作准备: 为了使用ODBC类,需要在stdafx.h中加入#include”afxdb.h”一行。因本程序只需要连接一个数据库,所以定义了一个Cdatabase型全局变量db,一次性打开和关闭数据库。数据库打开在登录认证对话框中。在主程序结束前需关闭数据库,所以在App类ExitInstance()函数中加入代码:if (db.IsOpen()) db.Close();为了编程便捷,能够为数据库中每一个表映射一个统计集类(从CrecordSet
9、类继承),其映射关系如表1-1所表示。这些类经过RFX(Record Field Exchange)机制将组员变量和表格中字段值联络起来,经过方问组员变量能够访问目前统计中字段值。 Crecordset派生类 表格 CAttendanceRS ATTENDANCE出勤统计表 CCounterRS COUNTER计数器表 CdepartRS DEPARTMENT部门信息表 CerrandRS ERRAND出差统计表 CLeaveRS LEAVE请假统计表 COvertimeRS OVERTIME加班统计表 CPersonRS
10、 PERSON职员个人信息表 CStatRS ATTENDANCE_STAT月度考勤统计表 表1-1 CRecordset派生类对应表格 6.主对话框设计: 主对话框界面图1-11所表示。用户能够经过菜单进行方便操作,如添加统计,统计统计等。每个菜单项关联了一个对话框,在对应菜单项初始化中使用:类名 dlg; dlg.DoModal();两条语句来进行实现。 图1-11 主对话框 6. 考勤统计对话框创建 考勤统计对话框界面设计图1-12所表示。用户可进行月度统计,也能够经过查找满足条件统计如年月、职员、姓名等来
11、进行相关统计。 图1-12 考勤统计对话框 四、测试和评价 经过测试,该应用程序能够很好实现上班时间设定;能够提供职员出入单位情况统计;能够提供请假、加班和出差情况统计,并实现查询、添加、修改、删除、浏览等处理功效;能够在每个月底进行整个月出勤情况统计;能够拥有一定安全性、协调性和完整性。但在安全性上存在一定漏洞;功效不够完善,不能进行统一查询;界面相对简单,所以总体评价为中等。 期望能得到彭老师指导得以愈加完善此系统,添补漏洞。 五、附录 1.主界面源代码清单: BOOL CAttendanceDlg::OnInitDialo
12、g() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL { CString strAb
13、outMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } void CAttendanceDlg::OnBtnConfig() { // 显示工作时间设置对话框 CWorkplanDlg dlg; dlg.DoModal(); } 2.考勤修改对话
14、框源代码清单: BOOL CAttDlg::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 |
15、 SWP_NOACTIVATE ); return TRUE; } 为了方便地更新列表框内容,编写了UpdateList()函数,调用些函数可使列表框显示给定数据表格。 void CPage1::UpdateList(CAttendanceRS& rs) //更新列表框内容 { int i=0; CString strID,strTime; rs.Open(); // 打开出勤统计表 m_cList.DeleteAllItems(); // 清除列表框内容 while(!rs.IsEOF()) // 对数据表中全部统计进行处理 { m_cList.
16、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++;
17、 } rs.Close(); // 关闭出勤统计表 } 添加部门和全体职员出勤统计过程最终可分解为添加单个职员统计过程。为了避免程序反复,设置了下面子程序: // 添加出勤统计函数 void CPage1::IO_Add(CString strPersonID) { int counter; // 用于计数 CString strIO; // 保留出入情况 CCounterRS rs_counter(&db); // 结构计数器统计表 // 统计编号 rs_counter.m_strFilter = "ID='A'"; // 设置过滤器,提取计数值 rs
18、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
19、OUT))->GetCheck()) strIO="O"; else strIO="I"; // 转换出入时间类型 int nYear,nMonth,nDay,nHour,nMinute; // 年,月,日,时,分 sscanf(m_strIOTime.Left(4), "%d", &nYear); // 得到年 sscanf(m_strIOTime.Mid(5,2), "%d", &nMonth); // 得到月 sscanf(m_strIOTime.Mid(8,2), "%d", &nDay); // 得到日 sscanf(m_strIOTime.Mid
20、11,2), "%d", &nHour); // 得到时 sscanf(m_strIOTime.Mid(14,2), "%d", &nMinute); // 得到分 // 得到出入时间 CTime IO_time(nYear,nMonth,nDay,nHour,nMinute,0); CAttendanceRS rs_attendance(&db); // 结构考勤统计表 rs_attendance.Open(); // 打开考勤统计表 rs_attendance.AddNew(); // 追加考勤统计 rs_attendance.m_ID=counter; rs
21、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.考勤统计对话框源代码清单 当输入职员号时,检索职员姓名,用于确定输入。 void CStatDlg::OnChangeStatEdtSeekpersonid() { Upda
22、teData(); // 更新数据 CPersonRS rs(&db); // 结构统计集 rs.m_strFilter = "ID='" + m_strPersonID + "'"; // 设置过滤条件 rs.Open(); // 打开统计集 if(rs.GetRecordCount()==1) // 判定职员统计是否存在 { m_strPersonName=rs.m_NAME; // 得到职员姓名 } else m_strPersonName.Empty(); // 清除职员姓名显示 rs.Close(); // 关闭统计集 UpdateDat
23、a(FALSE); // 更新界面数据 } 在以上代码中用到了StrToTime函数,这是一个全局函数,代码以下: Ctime StrToTime(Cstring str) { //时间串格式“%Y-%m-%d %H:%M:%S”,如“1999-01-01 11:11:11” int nYear,nMonth,nDay,nHour,nMinute,nSecond; sscanf(str.Left(4),”%d”,&nYear); //得到年 sscanf(str.Mid(5,2),”%d”,&nMonth); //得到月 sscanf(str.Mid(8,2),”
24、d”,&nDay); //得到日 sscanf(str.Mid(11,2),”%d”,&nHour); //得到时 sscanf(str.Mid(14,2),”%d”,&nMinute); //得到分 sscanf(str.Mid(17,2),”%d”,&nSecond); //得到秒 //结构Ctime变量 Ctime result(nYear,nMonth,nDay,nHour,nMinute,nSecond); Return result; } 4.参考文件: 1、陈建春.Visual C++开发GIS系统,开发实例剖析,. 2、陈建春.Visual C++高级编程技术,开发实例剖析,1999年. 3、李于剑.Visual C++实践和提升,图形图象编程篇, . 4、同志工作室.Visual C++6.0开发技巧和实例教程, . 5、赵仕健. Visual C++6.0编程和实例解析, . 6、钱 能. C++程序设计教程, 1999年.






