1第1章系统设计1.1系统功能分析考勤管理系统的主要功能如下:1.上班时间的设定。上下班时间相对固定,可以保存在客户端的设置文件中。2.员工出入单位的情况记录.出入情况主要由考勤机来记录,但是需要设置人工添加的功能,以备特殊情况的处理。3.请假、加班和出差情况的记录。4.每个月底进行整月的出勤情况统计。1.2系统功能模块设计根据系统功能的要求,可以将系统分解成几个功能模块来分别设计,功能模块图如图1-1所示。图1-1人事管理功能模块图考勤管理系统出差记录请假记录加班记录补记出勤上下班时间设置工作情况考勤统计21.3数据流程图出勤的原始记录主要来源于考勤机,并且以固定格式保存在数据库中。考勤管理系统的任务就是处理这些数据。经理审批记录出勤时间各种统计信息员工管理人员考勤员月度员工考勤统计表上下班时间安排请假值班、出差记录员工出勤记录3第2章数据库设计2.1数据库需求分析根据数据流程,可以列出以下管理系统所需的数据项和数据结构。(1)出勤记录:记录号、员工、出入情况和出入时间,如图2-1。(2)月度考勤统计:记录号、员工、年月、累计正常工作时间、累计请假时间、累计加班时间、累计出差时间、迟到次数、早退次数和矿工次数,如图2-2。(3)请假记录:记录号、员工、假期起始时间/结束时间和请假缘由,如图2-3。(4)加班记录:记录号、员工、加班时间长度和日期,如图2-4。(5)出差记录:记录号、员工、出差起始时间/结束时间和具体描述,如图2-5。所需的外部数据支持:(1)人员信息:员工号、密码、权限、姓名、部门、和当前状态等。(2)部门设置:部门编号、名称等。图2-1出勤记录表图2-2月度考勤统计表4图2-3请假记录表图2-4加班记录表图2-5出差记录表5第3章各个功能模块的创建3.1生成程序框架本系统的应用程序使用MFCODBC的方法开发,采用Dialogbased的应用框架,如图3-1为。由一个对话框和若干个功能对话框组成。为了使用ODBC类,需要在stdafx.h中加入#include”afxdb.h”头文件。本程序需要连接一个数据库,所以定义了一个CDatabase型的全局变量db,用于打开和关闭数据库。数据库的打开在登录认证数据库中。为了访问数据库中的表格,本程序从CRecordset中派生了8个类,分别用于封装所需访问的表格,如表3-1。通过访问成员变量可以访问当前记录中字段的值。表3-1CRecordset派生类对应的表格CRecordset派生类表格CAttendanceRSATTENDANCE出勤记录表CCounterRSCOUNTER计数器表CDepartRSDEPARTMENT部门信息表CErrandRSERRAND出差记录表6CRecordset派生类表格CLeaveRSLEAVE请假记录表COvertimeRSOVERTIME加班记录表CPersonRSPERSON员工个人信息表CStatRSATTENDANCE_ATAT月度考勤统计表3.2登录认证对话框登录窗口如图3-2所示,包括3个输入框和2个按钮。主要控件类型、ID和对应的成员变量及说明如表3-4。图3-2登录窗口表3-4登录认证对话框控件列表控件类型ID成员变量说明ComboBoxIDC_CMB_DSNm_strDSNODBC数据源EditBoxIDC_EDT_USERm_strUser用户名EditBoxIDC_EDT_PASSWDm_strPasswd密码ButtonIDOK无“登录”按钮ButtonIDCANCEL无“取消”按钮对IDOK的点击加登录代码。CLoginDlg类需要用到加密类,本程序使用的是CCrypt类。在cpp文件的开头加入#include”Crypt.h”一行。另外,为了使用全局数据库变量db,需要在cpp文件开头加入以下语句:ExternCDatabasedb;用户认证过程在“登录”按钮的处理函数中:代码见附录【1】为了运行登录认证对话框,还需在App类的InitInstance()函数中在显示主对话框前加入以下代码:CLoginDlgLoginDlg;7If(LoginDlg.DoModal()!=IDOK)returnFALSE;3.3主对话框窗口的设计用户登录后即显示主对话框,如图3-5所示。包括5个按钮。控件列表如表3-6。图3-5主对话框表3-6主对话框控件列表控件类型ID成员变量说明StaticTextIDC_STATIC_HEAD无“考勤管理系统”静态文本ButtonIDC_BTN_CONFIG无“设置”按钮ButtonIDC_BTN_RECORD无“出勤记录”按钮ButtonIDC_BTN_STATISTICS无“统计”按钮ButtonIDC_BTN_RELOGIN无“重新登录”按钮ButtonIDC_BTN_EXIT无“退出”按钮在CAttendanceDlg中定义以下成员变量:Public:CBrushm_brush;CStatDlg*m_pStatDlg;CAttDlg*m_pAttDlg;CFontm_font;对话框初始化时需要改变标题字体大小,因此在OnInitDialog()中加入以下代码:8//改变标题字体大小LOGFONTLogFont;GetFont()-GetLogFont(&LogFont);LogFont.lfHeight+=LogFont.lfHeight/2;LogFont.lfWidth+=LogFont.lfWidth/2;m_font.CreateFontIndirect(&LogFont);GetDlgItem(IDC_STATIC_HEAD)-SetFont(&m_font);为了美观起见,还插入了背景图片,通过Ctrl+R引入图片后,在OnPaint()中的条件语句的else()中添加下列代码:见附录【2】对话框中5个按钮的功能主要是显示相应的功能对话框。给按钮的BN_CLICKED事件的处理和退出代码见附录【3】。3.4上班时间设置对话框的创建此对话框用于设置上下班时间,布局如图3-7.所示。主要控件类型、ID和对应的成员变量及说明如表3-8所示。图3-7时间设置对话框表3-8时间设置对话框控件列表控件类型ID成员变量说明DataTimePickerIDC_WORKSTAT_DATETIMEPICKER1m_Time1上午上班时间DataTimePickerIDC_WORKSTAT_DATETIMEPICKER2m_Time2中午下班时间DataTimePickerIDC_WORKSTAT_DATETIMEPICKER3m_Time3下午上班时间DataTimePickerIDC_WORKSTAT_DATETIMEPICKER4m_Time4下午下班时间ButtonIDC_WORKPLAN_MODIFY无“修改”按钮ButtonIDC_WORKPLAN_RESET无“恢复默认设置”按钮一般上下班时间是相对固定的,而且需要在统计是频繁使用,所以不需要保9存在数据库中,因此采用标准的INI设置文件来保存这些数据。首先,在构造函数中初始化4个时间的取值:CWorkplanDlg::CWorkplanDlg(CWnd*pParent/*=NULL*/):CDialog(CWorkplanDlg::IDD,pParent){m_Time1=0;m_Time2=0;m_Time3=0;m_Time4=0;}“修改”按钮的BN_CLICKED事件处理用于保存当前的设置:代码见附录【4】“恢复默认设置”按钮的BN_CLICKED事件处理程序用于恢复初始设置。这个函数同时被OnInitDialog()函数应用,以实现初始化操作,代码见附录【5】3.5考勤修改对话框的创建考勤修改对话框主要用来人工输入出勤情况。在考勤机出现问题是,它可以及时弥补数据。同时加班、请假、出差的记录都是需要通过这个对话框来输入。对话框布局如图3-9所示。为了区分不同的输入,在对话框中嵌入了CPropertySheet和4个CPropertyPage,这4个CPropertyPage分别放置出勤、加班、请假和出差记录的修改界面,而共用一个查询条件设置。图3-9下方空白处用于放置CPropertySheet和4个CPropertyPage。对话框中的主要控件类型、ID和对应的成员变量及说明如表3-10所示。10图3-9考勤修改对话框表3-10考勤修改对话框控件列表控件类型ID成员变量说明CheckBoxIDC_CHK_SEEKBYTIMEm_bSeekbytime时间范围选项CheckBoxIDC_CHK_SEEKBYPERSONm_bSeekbyperson员工选项DateTimePickerIDC_DATETIMEPICKER1m_StartTime起始时间DateTimePickerIDC_DATETIMEPICKER2m_EndTime结束时间EditBoxIDC_EDT_SEEKPERSONIDm_strPersonID员工号EditBoxIDC_EDT_SEEKPERSONNAMEm_strName姓名为了使用CPropertySheet和CPropertyPage,需要在类定义中加入以下变量:CPage1m_Page1;CPage2m_Page2;CPage3m_Page3;CPage4m_Page4;CPropertySheetm_Sheet;然后在OnInitDialog中添加以下代码:见附录【6】当输入员工号时,需要检索员工姓名,以确定设置的条件有效。加入IDC_EDT_SEEKPERSONID的EN_CHANGE消息,函数如下:见附录【7】3.6修改出勤记录属性页的创建加入一个对话框资源,将其封装设为从CPropertyPage继承的CPage1类。对话框布局如图3-11所示。对话框中主要控件、ID和对应的成员变量及说明如表3-12所示。11图3-11修改出勤记录属性页表3-12修改出勤记录属性页控件列表控件类型ID成员变量说明EditBoxIDC_EDIT_IOTIMEm_strIOTime出入时间EditBoxIDC_EDIT_DEPARTIDm_strDepartID部门编号EditBoxIDC_EDIT_DEPARTNAMEm_strDepartName部门名称EditBoxIDC_EDIT_PERSONIDm_strPersonID员工号EditBoxIDC_EDIT_PERSONNAMEm_strPersonName员工姓名RadioButtonIDC_RADIO_OUT无出入选项“出”RadioButtonIDC_RADIO_IN无出入选项“入”ButtonIDC_BTN_ADDALL无“全部员工”按钮ButtonIDC_BTN_ADDDEPART无“部门员工”按钮ButtonIDC_BTN_ADDPERSON无“单个员工”按钮ButtonIDC_BTN_DELETEATTEND无“删除所选记录”按钮ButtonIDC_BTN_SEEKIO无“按条件检索”按钮ListControlIDC_LIST1m_cList“出勤记录列表”界面初始化操作如下:见附录【8】为了方便更新列表框内容,编写UpdateList()函数,调用此函数可使列表框显示给定的数据表格。见附录【9】当输入部门编号时,自动检索部门名称。见附录【10】输入员工号是,检索相应信息。见附录【11】添加部门和全体员工出勤记录的过程最终可分解为添加单个员工记录的过程。设置以下子程序是为了避免程序的重复。见附录【12】12添加记录的3个按钮处理程序分别调用以上的函数。见附录【13】“删除所选纪录”按钮用于删除列表中当前所选纪录。见附录【14】“按条件检索”按钮用于激活检索条件。见附录【15】3.7加班记录属性页的创建加班记录属性页的创建与考勤修改属性页类似,封装类设为从CPropertyPage继承的Cpage2类。为了将它们放入同一个PropertySheet,需将二者大小设为一致。界面设计如图3-1