- 144.00 KB
- 2022-05-17 13:09:37 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
内容提要近些年来,随着社会的发展和科技的进步,人们的工作与生活也越来越离不开计算机,对于各工作单位,企业来说就是如此了。如在各个企业中,企业员工的考勤工作不仅工作量大,而且时效性强,过去,企业多采用签到和报表的形式进行管理,效率很差,并且也容易出错;随着数据库技术的发展和企业信息化建设的进行,使用计算机管理企业考勤工作能成为大势所趋,它为企业的考勤工作节约了大量的人力和物力,也大大减轻了考勤工作人员的工作量。考勤管理系统可以有效地管理企事业单位员工的出勤情况,规范人事制度管理,保证企事业单位的正常动作,是人力资产管理的重要组成部分。后台数据库使用SQLServer,前台开发工具使用VisualC++。本系统采用目前比较流行的ADO数据访问技术,并将每个数据库表的字段和操作封装到类中,使应用程序的各个窗体都能够共享对表的操作,无需重复编码,使程序更加易于维护,从而成功地将面向对象的程序设计思想应用到数据库应用程序设计中。这也是本系统的特色和优势。按照软件工程的思想,对考勤信息管理系统进行功能分析:l 实现系统登陆功能(密码修改功能),并限制不同用户(包括普通工人、人事部门人员、财务部人员以及管理员)登陆所查看的信息;l 输入员工基本信息,包括姓名、性别、所属部门等;l 浏览和修改员工基本信息;l 输入出勤信息;l 浏览和修改员工的出勤情况,可同时查看该员工基本信息;l 按实际出勤情况查询员工;l 按姓名信息查询员工;关键字:考勤管理系统 SQLServer数据库 VisualC++开发语言 管理信息系统
内容提要近些年来,随着社会的发展和科技的进步,人们的工作与生活也越来越离不开计算机,对于各工作单位,企业来说就是如此了。如在各个企业中,企业员工的考勤工作不仅工作量大,而且时效性强,过去,企业多采用签到和报表的形式进行管理,效率很差,并且也容易出错;随着数据库技术的发展和企业信息化建设的进行,使用计算机管理企业考勤工作能成为大势所趋,它为企业的考勤工作节约了大量的人力和物力,也大大减轻了考勤工作人员的工作量。考勤管理系统可以有效地管理企事业单位员工的出勤情况,规范人事制度管理,保证企事业单位的正常动作,是人力资产管理的重要组成部分。后台数据库使用SQLServer,前台开发工具使用VisualC++。本系统采用目前比较流行的ADO数据访问技术,并将每个数据库表的字段和操作封装到类中,使应用程序的各个窗体都能够共享对表的操作,无需重复编码,使程序更加易于维护,从而成功地将面向对象的程序设计思想应用到数据库应用程序设计中。这也是本系统的特色和优势。按照软件工程的思想,对考勤信息管理系统进行功能分析:l 实现系统登陆功能(密码修改功能),并限制不同用户(包括普通工人、人事部门人员、财务部人员以及管理员)登陆所查看的信息;l 输入员工基本信息,包括姓名、性别、所属部门等;l 浏览和修改员工基本信息;l 输入出勤信息;l 浏览和修改员工的出勤情况,可同时查看该员工基本信息;l 按实际出勤情况查询员工;l 按姓名信息查询员工;关键字:考勤管理系统 SQLServer数据库 VisualC++开发语言 管理信息系统
目录第一章 考勤管理系统功能分析.3第二章模块图及流程图.5第三章、程序源代码及部分模块界面.73.1 系统主界面及登录模块.73.2 节假日信息编辑和管理.93.3部门信息编辑和管理.113.4员工信息编辑和管理.153.5.出勤信息编辑和管理.213.6加班信息编辑和管理.263.7请假信息编辑和管理.293.8出差信息编辑和管理.323.9 日考勤统计表对话框.343.10 月考勤统计表对话框.363.11用户信息管理模块.39
考勤管理系统第一章 考勤管理系统功能分析本程序设计的是一个公司员工每天的考勤管理程序,经过简单扩充成为一个完整的考勤管理系统。下面来说一下本程序的各个模块的功能及数据库的结构。一、本系统由基本信息管理、考勤信息管理和统计查询模块、系统用户管理四个主要模块组成,具体功能如下:基本信息的添加、修改、删除和查询。基本信息管理包括节假日日期设置、部门信息管理和员工信息管理。考勤信息管理包括出勤管理、加班管理、请假管理和出差管理等功能。统计查询功能包括日考勤统计表、月考勤统计表和当日缺勤人员列表。系统用户管理包括用户信息管理、修改用户密码二、数据库的结构设计结构设计是总体设计阶段非常重要的环节,好的数据库结构可以简化开发过程,使系统功能更加清晰明确。 数据库中包含6个表,即节假日信息表HolidaySet、部门信息表DepInfo、员工信息表EmpInfo、考勤信息表CheckInfo、加班信息表Overtime和用户信息表UserInfo等。(1) 节假日信息表HolidaySet,用来保存节假日信息,表的结构如表:编号字段名称数据类型说明1Idint记录编号,主键2HolidayDateChar50节假日日期3HolidayNameVarchar50节假日名称(2)部门信息表DepInfo,用来保存部门信息,本系统采用树状结构来管理部门数据,也就是在部门之间建立从属关系。编号字段名称数据类型说明1Depldint记录编号2DepNameVarchar50部门名称3DescribesVarchar250部门功能描述4UIDint上级部门编号(3)员工信息表Emplnfo,用来保存员工信息。编号字段名称数据类型说明1Empldint记录编号,主键2NameVarchar50员工姓名3SexChar2性别4BirthdayVarchar20生日5IdCardVarchar20身份证号6OfficePhoneVarchar30办公电话7MobileVarchar30移动电话8HireDateVarchar20到岗日期9Depldint所在部门
10MissionVarchar40工作岗位11DutyVarchar20职务12MemoVarchar200备注信息(4)考勤信息表Checklnfo,用来保存考勤基本信息,除加班信息外,出勤、出差、请假和矿工信息都保存要此表中。编号字段名称数据类型说明1CheckDateChar10考勤日期2Empldint员工编号3QuanQinChar2是否全勤4ChuChaiChar2是否出差5BingJiaChar2是否病假6ShiJiaChar2是否事假7KuangGongChar2是否旷工8XiuXiChar2是否休息9ChiDaoChar2是否迟到10ZaoTuiChar2是否早退11MemoVarchar200备注信息第二章模块图及流程图考勤管理系统功能模块示意图 系统主流程分析如图用户管理功能模块图第三章、程序源代码及部分模块界面 3.1 系统主界面及登录模块本系统是一个基于对话框的工程,工程名为CheckManage,默认的主对话框为IDD-CHECKMANAGE-DIALOG。制作一个背景图片(要求bmp格式),可以使用photoshop等工具制作适合自己的图片。用户要使用本系统,首先必须通过系统的身份证,当前用户的数据应该是全局有效的,在工程的任何位置都可以访问它。添加一个类CGlobal,用于保存全局变量。在CGlobal.h和CGlobal.cpp中添加代码:#include"UserInfo.h"CUserInfocurUser;在StdAfx.h中添加如下代码:#include"Global.h"因为StdAfx.h默认包含在很多程序中,这样在这些程序中就可以直接访问curUser对象了。在访问之前,还需要添加如下命令引入外部变量。ExternCUserInfocurUser;
打开ClassWizard窗口,为对话框IDD_LOGIN_DIALOG创建一个类,类名为CLoginDlg。在用户验证框中输入用户名的编辑框为IDC-USER-EDIT,输入密码的编辑框为IDC-PASSWD–EDIT。在属性窗口中,选中编辑框IDC-PASSWD–EDIT的Password属性,这样用户在输入数据时编辑框中只显示“*”。其函数CLoginDIg::OnOK(),代码如下:voidCLoginDlg::OnOK(){//将对话框中编辑框的数据读取到成员变量中 UpdateData(TRUE); //没有输入用户名 if(m_User=="") { MessageBox("请输入用户名","信息提示"); GetDlgItem(IDC_USER_EDIT)->SetFocus(); return; } //定义用户信息表变量 CUserInfoUser; //判断用户是否存在 if(!User.IsExistUser(m_User)) { count++; if(count<3) { MessageBox("用户名不存在,请重新输入!","用户名错误",MB_ICONINFORMATION); m_User=""; m_Passwd=""; UpdateData(FALSE); GetDlgItem(IDC_USER_EDIT)->SetFocus(); return; } else { MessageBox("重试次数已到,不能再输入用户名和密码,即将退出系统!","用户名错误",MB_ICONEXCLAMATION); exit(0); return; } } //判断密码是否正确 User.GetInfo(m_User); if(User.Passwd!=m_Passwd) { count++; if(count<3) {
MessageBox("用户名或密码错误,请重新输入!","用户名或密码错误",MB_ICONINFORMATION); m_User=""; m_Passwd=""; UpdateData(FALSE); GetDlgItem(IDC_USER_EDIT)->SetFocus(); return; } else { MessageBox("重试次数已到,不能再输入用户名和密码,即将退出系统!","用户名或密码错误",MB_ICONEXCLAMATION); exit(0); return; } } //关闭对话框 CDialog::OnOK();}Count是公共变量,用于记录登录失败的次数。如果登录失败达到3次,则退出系统。为了在LoginDIg.cpp中使用CUsers对象,需要在程序开始部分添加代码:#include"Users.h" 下面在主对话框中添加代码,使对话框在启动时首先打开登录对话框.在ClassWizard窗口中添加CCheckManageDlg::OnInitDialog()函数,并在其中添加如下代码:CLoginDIgdIg://启动登录窗体If(dIg.DoModal()!=IDOK)OnOk();Else //读取用户信息到curUser对象中curUserGetInfo(dIg.m_User);程序将打开登录对话框,如果用户不是通过单击“确定”按钮关闭登录对话框,则调用OnOk()函数关闭主对话框。在登录对话框的代码中,用户只有在通过身份认证后才能调用OnOk()函数关闭对话框。因此可以判断,如果dlg.DoModal()的返回值为IDOK,则表示用户已经通过了身份认证。3.2 节假日信息编辑和管理节假日信息编辑对话框的ID属性为IDD_HOLIDAY_EDIT_DIALOG,对话框的布局如图。在CHolidayEditDlg.h中,添加2个公共变量,代码如下:Public:CStringcld; //如果为"",表示插入CStringcTime; //保存原来时间当用户单击“确定”按钮时触发OnOk()函数,对应的代码如下:voidCHolidayEditDlg::OnOK(){
//TODO:Addextravalidationhere UpdateData(TRUE); CHolidaySetcur; cur.HolidayDate=m_time.Format("%Y-%m-%d"); cur.HolidayName=m_name; if(cId=="") //添加记录 { if(cur.HaveHoliday(cur.HolidayDate)) { MessageBox("已经加入了此节假日!"); return; } cur.SqlInsert(); } else //修改记录 { if(cTime!=cur.HolidayDate) { if(cur.HaveHoliday(cur.HolidayDate)) { MessageBox("已经加入了此节假日!"); return; } } cur.SqlUpdate(cId); } CDialog::OnOK();}3.3部门信息编辑和管理 部门信息管理对话框的名称为IDD_DEPMAN_DIALOG,本系统中使用树状结构来描述部门数据,所以要使用到Tree控件。Tree是控件显示结点对象的分层列表,每个Node对象均由一个标签和一个可选的位图组成。在对话框IDD_DEPMAN_DIALOG中添加一具Tree控件,ID属性为IDC_TREE1。为了用户好选择部门,对应的类为CDepSelDlg。对话框的界面布局如左图。为了保存选择部门的信息,在DepSelDlg.hk中添加两个公共变量,代码如下:Public: IntDepld; CStringDepName;当用户单击“确定”按钮时解发CDepSelDlg::OnOK()函数,代码如下:CDepSelDlg::CDepSelDlg(CWnd*pParent/*=NULL*/):CDialog(CDepSelDlg::IDD,pParent){ //{{AFX_DATA_INIT(CDepSelDlg) //NOTE:theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT}voidCDepSelDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDepSelDlg) DDX_Control(pDX,IDC_TREE1,m_tree); //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CDepSelDlg,CDialog)//{{AFX_MSG_MAP(CDepSelDlg)//}}AFX_MSG_MAPEND_MESSAGE_MAP()//CDepSelDlgmessagehandlersBOOLCDepSelDlg::OnInitDialog(){ CDialog::OnInitDialog(); //TODO:Addextrainitializationhere //装入部门信息 dep.LoadDep(); //添加根节点 m_treeImageList.Create(16,16,FALSE,1,0); //创建CImageList控件 //装入ICON资源 HICONhIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON1)); m_treeImageList.Add(hIcon); //将ICON资源添加到CImageList控件中 //将CImageList控件与Tree控件相关联 m_tree.SetImageList(&m_treeImageList,LVSIL_NORMAL); m_root=m_tree.InsertItem("部门信息"); //添加根节点 //调用AddtoTree()函数,将所有部门信息添加到Tree控件中 AddtoTree(m_root,0); m_tree.Expand(m_root,TVE_EXPAND);//展开根节点 returnTRUE; //returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCDepSelDlg::AddtoTree(HTREEITEMm_node,intUpperId){ //使用递归方法将部门添加到TreeView控件中 inti; HTREEITEMm_child; //依次访问dep对象中的部门数组,查找满足条件的记录添加到Tree控件中
for(i=0;iEnableWindow(FALSE); GetDlgItem(IDC_MODI_BUTTON)->EnableWindow(FALSE); GetDlgItem(IDC_DEL_BUTTON)->EnableWindow(FALSE); } //装入部门信息 dep.LoadDep(); //添加根节点 m_treeImageList.Create(16,16,FALSE,1,0); //创建CImageList控件 //装入ICON资源 HICONhIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON1)); m_treeImageList.Add(hIcon); //将ICON资源添加到CImageList控件中 //将CImageList控件与Tree控件相关联 m_tree.SetImageList(&m_treeImageList,LVSIL_NORMAL); m_root=m_tree.InsertItem("部门信息"); //添加根节点 //调用AddtoTree()函数,将所有部门信息添加到Tree控件中 AddtoTree(m_root,0); m_tree.Expand(m_root,TVE_EXPAND);//展开根节点//选中根节点 m_tree.SelectItem(m_root); returnTRUE; //returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE
}voidCEmpManDlg::RefreshData(){ UpdateData(TRUE);CEmpInfoemp;3.5.出勤信息编辑和管理出勤信息管理对话框的与以上相似,就不讲它的实现了。出勤信息编辑对话框的ID属性为IDD_ON_DUTY_EDIT_DIALOG,对话框的布局如上图。用户首先单击“选择部门”按钮,在左侧的表格中将显示选择部门中的所有员工信息。选择一个员工,会在右侧下方显示他的出勤状态。选择出勤状态,然后单击“确定”按钮,可以保存指定员工的出勤情况。其代码如下:BOOLCOnDutyEditDlg::OnInitDialog(){ CDialog::OnInitDialog(); //TODO:Addextrainitializationhere //修改状态下不用选择部门信息 if(EmpId!="") GetDlgItem(IDC_SEL_DEP_BUTTON)->EnableWindow(FALSE); m_checkdate=CheckDate; UpdateData(FALSE); RefreshData(); returnTRUE; //returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}//刷新数据voidCOnDutyEditDlg::RefreshData(){ UpdateData(TRUE); //根据部门编号设置SELECT语句 CStringcDepId; cDepId.Format("%d",iDepId); //设置SELECT语句 CStringcSource="SELECTEmpIdAS员工编号,NameAS姓名" "FROMEmpInfoWHEREDepId="+cDepId; if(EmpId!="") cSource+="ANDEmpId="+EmpId; //刷新ADOData控件的记录源 m_Adodc.SetRecordSource(cSource); m_Adodc.Refresh(); //设置列宽度
_variant_tvIndex; vIndex=long(0); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(0); vIndex=long(1); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(100);}//选择部门voidCOnDutyEditDlg::OnSelDepButton(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); //打开选择部门对话框 CDepSelDlgdlg; dlg.DoModal(); //从对话框中读取选择部门的信息 iDepId=dlg.DepId; m_DepName=dlg.DepName; UpdateData(FALSE); //根据选择的部门信息,刷新表格数据 RefreshData();}//全勤voidCOnDutyEditDlg::OnQuanQinRadio(){//TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); m_chidao=false; m_zaotui=false; UpdateData(FALSE);}//休息voidCOnDutyEditDlg::OnXiuXiRadio(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); m_chidao=false; m_zaotui=false; UpdateData(FALSE);}//旷工voidCOnDutyEditDlg::OnKuangGongRadio(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); m_chidao=false; m_zaotui=false;
UpdateData(FALSE);}//迟到voidCOnDutyEditDlg::OnChiDaoCheck(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); m_quanqin=-1; UpdateData(FALSE);}//早退voidCOnDutyEditDlg::OnZaoTuiCheck(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); m_quanqin=-1; UpdateData(FALSE);}voidCOnDutyEditDlg::OnOK(){ //TODO:Addextravalidationhere UpdateData(TRUE); //是否选择人员 if(m_Adodc.GetRecordset().GetEof()) { MessageBox("请选择人员"); return; } //是否进行添加考勤状态 if(m_quanqin==-1&&m_chidao==false&&m_zaotui==false) { MessageBox("请选择出勤状态"); return; } //赋值到CCheckInfo对象中 CCheckInfocur; cur.CheckDate=CheckDate; cur.EmpId=atol(m_Datagrid.GetItem(0)); switch(m_quanqin) { case0:3.6加班信息编辑和管理
加班信息编辑对话框的ID属性为IDD_OVERTIME_EDIT_DIALOG,对话框的布局如图。其类为COvertimeEditDIg,代码如下:BOOLCOvertimeEditDlg::OnInitDialog(){ CDialog::OnInitDialog(); //TODO:Addextrainitializationhere //修改状态下不用选择部门信息 if(EmpId!="") GetDlgItem(IDC_SEL_DEP_BUTTON)->EnableWindow(FALSE); m_checkdate=otDate; RefreshData(); returnTRUE; //returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}//刷新数据voidCOvertimeEditDlg::RefreshData(){ UpdateData(TRUE); //根据部门编号设置SELECT语句 CStringcDepId; cDepId.Format("%d",iDepId); //设置SELECT语句 CStringcSource="SELECTEmpIdAS员工编号,NameAS姓名" "FROMEmpInfoWHEREDepId="+cDepId; if(EmpId!="") cSource+="ANDEmpId="+EmpId; //刷新ADOData控件的记录源 m_Adodc.SetRecordSource(cSource); m_Adodc.Refresh(); //设置列宽度 _variant_tvIndex; vIndex=long(0); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(0); vIndex=long(1); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(100);}//选择部门voidCOvertimeEditDlg::OnSelDepButton(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); //打开选择部门对话框
CDepSelDlgdlg; dlg.DoModal(); //从对话框中读取选择部门的信息 iDepId=dlg.DepId; m_DepName=dlg.DepName; UpdateData(FALSE); //根据选择的部门信息,刷新表格数据 RefreshData();}//确定按钮voidCOvertimeEditDlg::OnOK(){ //TODO:Addextravalidationhere UpdateData(TRUE); //是否选择人员 if(m_Adodc.GetRecordset().GetEof()) { MessageBox("请选择人员"); return; } //是否进行添加考勤状态 if(m_overtime==-1) { MessageBox("请选择加班类型"); return; } //赋值到COvertime对象中 COvertimecur; cur.otDate=otDate; cur.EmpId=atol(m_Datagrid.GetItem(0)); cur.otHour=m_hour; cur.Describes=m_describe; switch(m_overtime) { case0: cur.otType="法定节假日加班"; break; case1: cur.otType="周六日加班"; break; case2: cur.otType="日常加班"; break; } if(EmpId=="") {
//在添加时,若人员有加班记录,则不允许添加 if(cur.HaveEmp(otDate,m_Datagrid.GetItem(0))) { MessageBox("已经有此员工的加班信息,不能添加"); return; } //插入记录 cur.SqlInsert(); } else { //修改CheckInfo表记录 cur.SqlUpdate(cur.otDate,m_Datagrid.GetItem(0)); } CDialog::OnOK();}3.7请假信息编辑和管理 请假信息编辑对话框的ID属性为IDD_LEAVE_EDIT_DIALOG,其布局如图。对话框对应的类为CLeaveEditDlg,代码如下:BOOLCLeaveEditDlg::OnInitDialog(){ CDialog::OnInitDialog(); //TODO:Addextrainitializationhere if(EmpId!="") GetDlgItem(IDC_SEL_DEP_BUTTON)->EnableWindow(FALSE); m_checkdate=CheckDate; RefreshData(); returnTRUE; //returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}//刷新数据voidCLeaveEditDlg::RefreshData(){ UpdateData(TRUE); //根据部门编号设置SELECT语句 CStringcDepId; cDepId.Format("%d",iDepId);
//设置SELECT语句 CStringcSource="SELECTEmpIdAS员工编号,NameAS姓名" "FROMEmpInfoWHEREDepId="+cDepId; if(EmpId!="") cSource+="ANDEmpId="+EmpId; //刷新ADOData控件的记录源 m_Adodc.SetRecordSource(cSource); m_Adodc.Refresh(); //设置列宽度 _variant_tvIndex; vIndex=long(0); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(0); vIndex=long(1); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(100);}//选择部门voidCLeaveEditDlg::OnSelDepButton(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); //打开选择部门对话框 CDepSelDlgdlg; dlg.DoModal(); //从对话框中读取选择部门的信息 iDepId=dlg.DepId; m_DepName=dlg.DepName; UpdateData(FALSE); //根据选择的部门信息,刷新表格数据 RefreshData();}voidCLeaveEditDlg::OnOK(){ //TODO:Addextravalidationhere UpdateData(TRUE); //是否选择人员 if(m_Adodc.GetRecordset().GetEof()) { MessageBox("请选择人员"); return; } //是否进行添加考勤状态 if(m_shijia==-1) { MessageBox("请选择出勤状态");
return; } //赋值到CCheckInfo对象中 CCheckInfocur; cur.CheckDate=CheckDate; cur.EmpId=atol(m_Datagrid.GetItem(0)); switch(m_shijia) { case0: cur.ShiJia="是"; cur.BingJia="否"; cur.QuanQin="否"; cur.ChuChai="否"; cur.KuangGong="否"; cur.XiuXi="否"; cur.ChiDao="否"; cur.ZaoTui="否"; break; case1: cur.ShiJia="否"; cur.BingJia="是"; cur.QuanQin="否"; cur.ChuChai="否"; cur.KuangGong="否"; cur.XiuXi="否"; cur.ChiDao="否"; cur.ZaoTui="否"; break; } cur.Memo=m_memo; if(EmpId=="") { //在添加时,若人员有出勤记录,则不允许添加 if(cur.HaveEmp(CheckDate,m_Datagrid.GetItem(0))) { MessageBox("已经有此员工的出勤信息,不能添加"); return; } //插入记录 cur.SqlInsert(); } else
{ //修改CheckInfo表记录 cur.UpdateLeave(cur.CheckDate,EmpId); } CDialog::OnOK();}就可以实现了。3.8出差信息编辑和管理 出差信息编辑对话框的ID属性为IDD_ERRAND_DIALOG,对话框的布局如图,对应的类为CErrandEditDlg。代码如下:BOOLCErrandEditDlg::OnInitDialog(){ CDialog::OnInitDialog(); //TODO:Addextrainitializationhere //修改状态下不用选择部门信息 if(EmpId!="") GetDlgItem(IDC_SEL_DEP_BUTTON)->EnableWindow(FALSE); m_checkdate=CheckDate; UpdateData(FALSE); RefreshData(); returnTRUE; //returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}//刷新数据voidCErrandEditDlg::RefreshData(){ UpdateData(TRUE); //根据部门编号设置SELECT语句 CStringcDepId; cDepId.Format("%d",iDepId); //设置SELECT语句 CStringcSource="SELECTEmpIdAS员工编号,NameAS姓名" "FROMEmpInfoWHEREDepId="+cDepId; if(EmpId!="") cSource+="ANDEmpId="+EmpId; //刷新ADOData控件的记录源m_Adodc.SetRecordSource(cSource); m_Adodc.Refresh(); //设置列宽度 _variant_tvIndex;
vIndex=long(0); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(0); vIndex=long(1); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(100);}//选择部门voidCErrandEditDlg::OnSelDepButton(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); //打开选择部门对话框 CDepSelDlgdlg; dlg.DoModal(); //从对话框中读取选择部门的信息 iDepId=dlg.DepId; m_DepName=dlg.DepName; UpdateData(FALSE); //根据选择的部门信息,刷新表格数据 RefreshData();}voidCErrandEditDlg::OnOK(){ //TODO:Addextravalidationhere UpdateData(TRUE); //是否选择人员 if(m_Adodc.GetRecordset().GetEof()) { MessageBox("请选择人员"); return; } //赋值到CCheckInfo对象中 CCheckInfocur; cur.CheckDate=CheckDate; cur.EmpId=atol(m_Datagrid.GetItem(0)); cur.ChuChai="是"; cur.QuanQin="否"; cur.BingJia="否"; cur.ShiJia="否"; cur.KuangGong="否"; cur.XiuXi="否"; cur.ChiDao="否"; cur.ZaoTui="否"; cur.Memo=m_memo; if(EmpId=="") {
//在添加时,若人员有出勤记录,则不允许添加 if(cur.HaveEmp(CheckDate,m_Datagrid.GetItem(0))) { MessageBox("已经有此员工的出勤信息,不能添加"); return; } //插入记录 cur.SqlInsert(); } else { //修改CheckInfo表记录 cur.UpdateErrand(cur.CheckDate,m_Datagrid.GetItem(0)); } CDialog::OnOK();}就可以实现了。3.9 日考勤统计表对话框
日考勤统计表可以按日查询所有员工的出勤、加班、请假和出差等信息。对话框的ID属性为IDD_TIME_SEL_DIALOG,对话框的布局如图。其代码如下:BOOLCTimeSelDlg::OnInitDialog(){ CDialog::OnInitDialog(); //TODO:Addextrainitializationhere m_time=CTime::GetCurrentTime(); UpdateData(FALSE); RefreshData(); returnTRUE; //returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCTimeSelDlg::RefreshData(){ UpdateData(TRUE); //根据部门编号设置SELECT语句 CStringcTime; cTime=m_time.Format("%Y-%m-%d"); //设置SELECT语句 CStringcSource="SELECTc.EmpIdAS员工编号,e.NameAS姓名,c.CheckDateAS出勤日期," "c.QuanQinAS是否全勤,c.ChuChaiAS是否出差,c.ShiJiaAS是否事假," "c.BingJiaAS是否病假,c.KuangGongAS是否旷工,c.XiuXiAS是否休息," "c.ChiDaoAS是否迟到,c.ZaoTuiAS是否早退,c.MemoAS备注" "FROMCheckInfoc,EmpInfoeWHEREc.EmpId=e.EmpIdANDc.CheckDate=""+cTime+"""; //刷新ADOData控件的记录源 m_Adodc.SetRecordSource(cSource); m_Adodc.Refresh(); //设置列宽度 _variant_tvIndex; vIndex=long(0); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(1); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(2); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(80); vIndex=long(3);
m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(4); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(5); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(6); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(7); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(8); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(9); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(10); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(11); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(100);}//查询按钮voidCTimeSelDlg::OnReserchButton(){ //TODO:Addyourcontrolnotificationhandlercodehere RefreshData();}就可以实现了。3.10 月考勤统计表对话框 月考勤统计表对话框的ID属性为IDD_MONTH_DIALOG,对话框的布局如图。代码如下:BOOLCDepDlg::OnInitDialog(){ CDialog::OnInitDialog(); //TODO:Addextrainitializationhere inti; for(i=1980;i<=2050;i++) { cYear.Format("%d",i); m_year.AddString(cYear); } m_year.SetCurSel(0); for(i=1;i<=9;i++) { cMonth.Format("%d",i); m_month.AddString("0"+cMonth); } for(i=10;i<=12;i++)
{ cMonth.Format("%d",i); m_month.AddString(cMonth); } //设置为当前日期 CTimet=CTime::GetCurrentTime(); m_year.SetCurSel(t.GetYear()-1980); m_month.SetCurSel(t.GetMonth()-1); iDepId=-1; UpdateData(FALSE); RefreshData(); returnTRUE; //returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}//刷新数据voidCDepDlg::RefreshData(){ UpdateData(TRUE); //根据部门编号设置SELECT语句 CStringcStrCnd,cDepId; cDepId.Format("%d",iDepId); if(iDepId>0) cStrCnd="Andd.DepId="+cDepId; else cStrCnd=""; CStringcTime; //查询日期 //得到年份和月份 m_year.GetLBText(m_year.GetCurSel(),cYear); m_month.GetLBText(m_month.GetCurSel(),cMonth); //得到日期 cTime=cYear+"-"+cMonth; //设置SELECT语句 CStringcSource="SELECTe.NameAS姓名," "ISNULL(v1.CountQuanQin,0)AS全勤天数,ISNULL(v2.CountChuChai,0)AS出差天数," "ISNULL(v3.CountShiJia,0)AS事假天数,ISNULL(v4.CountBingJia,0)AS事假天数," "ISNULL(v5.CountKuangGong,0)AS旷工天数,ISNULL(v6.CountXiuXi,0)AS休息天数," "ISNULL(v7.CountChiDao,0)AS迟到次数,ISNULL(v8.CountZaoTui,0)AS早退次数"
"FROMv_QuanQinv1,v_ChuChaiv2,v_ShiJiav3,v_BingJiav4,DepInfod," "v_KuangGongv5,v_XiuXiv6,v_ChiDaov7,v_ZaoTuiv8,EmpInfoe" "WHEREe.EmpId*=v1.EmpIdANDe.EmpId*=v2.EmpIdAnde.DepId=d.DepId" "ANDe.EmpId*=v3.EmpIdANDe.EmpId*=v4.EmpIdANDe.EmpId*=v5.EmpId" "ANDe.EmpId*=v6.EmpIdANDe.EmpId*=v7.EmpIdANDe.EmpId*=v8.EmpId" "ANDv1.CheckMonth=""+cTime+""ANDv2.CheckMonth=""+cTime+ ""ANDv3.CheckMonth=""+cTime+""ANDv4.CheckMonth=""+cTime+ ""ANDv5.CheckMonth=""+cTime+""ANDv6.CheckMonth=""+cTime+ ""ANDv7.CheckMonth=""+cTime+""ANDv8.CheckMonth=""+cTime+"""+cStrCnd; //刷新ADOData控件的记录源 m_Adodc.SetRecordSource(cSource); m_Adodc.Refresh(); //设置列宽度 _variant_tvIndex; vIndex=long(0); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(1); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(2); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(80); vIndex=long(3); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(4); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(5); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(6); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(7); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60); vIndex=long(8); m_Datagrid.GetColumns().GetItem(vIndex).SetWidth(60);}//选择部门voidCDepDlg::OnSelDepButton(){
//TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); //打开选择部门对话框 CDepSelDlgdlg; dlg.DoModal(); //从对话框中读取选择部门的信息 iDepId=dlg.DepId; m_DepName=dlg.DepName; UpdateData(FALSE); RefreshData();}voidCDepDlg::OnSelchangeYearCombo(){ RefreshData(); }voidCDepDlg::OnSelchangeMonthCombo(){ RefreshData(); 3.11用户信息管理模块编辑用户信息的对话框可以用来添加和修改用户信息,对话框名称为IDD_USEREDIT_DIALOG,对话框布局如图,代码如下:BOOLCUserEditDlg::OnInitDialog(){ CDialog::OnInitDialog(); //TODO:Addextrainitializationhere if(cId=="") { m_type.SetCurSel(1); } else { GetDlgItem(IDC_USER_EDIT)->EnableWindow(FALSE); GetDlgItem(IDC_PASSWD_EDIT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM_EDIT)->EnableWindow(FALSE); m_type.SetCurSel(iType-1); } returnTRUE; //returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}//确定按钮
voidCUserEditDlg::OnOK(){ //TODO:Addextravalidationhere UpdateData(TRUE); CUserInfocur; //用户名有效性操作 if(cId=="") { //密码一致性 if(m_passwd!=m_confirm) { MessageBox("请确认密码输入是否正确,请重新输入"); m_passwd=""; m_confirm=""; UpdateData(FALSE); GetDlgItem(IDC_PASSWD_EDIT)->SetFocus(); return; } //用户名为空 if(m_user=="") { MessageBox("请输入用户名"); GetDlgItem(IDC_USER_EDIT)->SetFocus(); return; } //用户名是否存在 if(cur.IsExistUser(m_user)) { MessageBox("此用户名已经存在,请换个密码来注册"); m_user=""; UpdateData(FALSE); GetDlgItem(IDC_USER_EDIT)->SetFocus(); return; } } else { if(m_user=="admin") { MessageBox("此用户为默认用户,不能修改"); m_user=""; UpdateData(FALSE); GetDlgItem(IDC_USER_EDIT)->SetFocus(); return;
} } //给cur赋值 cur.UserName=m_user; cur.Passwd=m_passwd; cur.UserType=m_type.GetCurSel()+1; //添加 if(cId=="") { cur.SqlInsert(); } else { cur.SqlUpdate(m_user); } CDialog::OnOK();}