下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 基于VC++的考勤系统(论文)

基于VC++的考勤系统(论文).doc

基于VC++的考勤系统(论文)

宋如梭
2017-10-16 0人阅读 举报 0 0 暂无简介

简介:本文档为《基于VC++的考勤系统(论文)doc》,可适用于IT/计算机领域

基于VC的考勤系统(论文)基于VC的考勤系统摘要:随着现代科学技术的发展~越来越多的公司和企业对职工的考勤都实行了信息化管理~使用计算机系统代替复杂的手工方式来管理考勤事务。考勤系统可以有效地管理公司员工的出勤情况~规范人事制度管理~保证公司正常的工作~是人力资源管理的重要组成部分。因此~考勤管理系统的设计与实现有着十分重要的意义。系统的开发主要包括后台数据库的建立~维护以及前端应用程序的开发两个方面~主要模块包括基本信息管理模块~考勤信息管理模块~统计查询模块和系统用户管理模块。系统是使用VisualC开发语言~使用MicrosoftVisualStudio作为工具软件~数据库为Access。系统采用目前比较流行的ODBC数据访问技术~并将每个数据库表的字段和操作封装到类中~它使应用程序的各个窗口都能够共享对表的操作~不需要重复编码~使程序更加易于维护~从而将面向对象的程序设计思想应用到数据库应用程序中。关键字:VisualC~Access~MFC~考勤管理~ODBC数据访问技术。VCbasedontheattendancesystemAbstract:Withthedevelopmentofmodernscienceandtechnology,anincreasingnumberofcompaniesandenterprisesoftheattendanceofallemployeestoimplementtheinformationmanagement,theuseofcomplexcomputersystemstoreplacemanualmethodstomanagetimeandattendancemattersAttendancesystemcaneffectivelymanagestaffattendanceandstandardizethemanagementofthepersonnelsystemtoensurethatnormalworkisanimportanthumanresourcemanagementcomponentTherefore,theAttendanceManagementSystemDesignandImplementationisveryimportantSystemmainlyincludestheestablishmdbmdb基于功能模块分析~为考勤系统创建个数据表。其数据库的设计如下:表考勤表,ATTENDANCE,字段名称字段数据类型字段描述PERSON文本员工号~唯一标志~外键ID数字考勤统计编号INOUT文本考勤出入类型IOTIME日期时间上下班时间要求:每个员工每天的出勤记录只有一条~因此员工号和出勤时间作为唯一标志。外键:员工号必须在数据库表中已经存在。表考勤统计表,ATTENDANCESTAT,字段名称字段数据类型字段描述ID数字序列号YEARMONTH日期时间统计时间PERSON文本员工号~外键WORKHOUR数字工作时间OVERHOUR数字加班时间LEAVEHDAY文本请假情况ERRANDHDAY文本出差情况LATETIMES数字迟到次数EARLYTIMES数字早退次数ABSENTTIMES数字缺勤次数表考勤记录表,COUNTER,字段名称字段数据类型字段描述ID文本考勤类型编号COUNTERVALUE数字次数统计DESCRIPTION文本考勤类型注:此表没有关键字。表部门表,DEPARTMENT,字段名称字段数据类型字段描述ID文本部门简称NAME文本部门名称MANAGER文本部门经理INTRO文本部门简介注:此表没有关键字。表教育水平表,EDULEVEL,字段名称字段数据类型字段描述CODE数字教育情况编号DESCRIPTION文本学历注:此表没有关键字。表出差表,ERRAND,字段名称字段数据类型字段描述ID数字序列号PERSON文本员工号~外键STARTTIME日期时间开始时间ENDTIME日期时间结束时间DESCRIPTION文本出差情况描述表岗位表,JOB,字段名称字段数据类型字段描述CODE文本职称简写DESCRIPTION文本岗位描述注:此表没有关键字。表请假表,LEAVE,字段名称字段数据类型字段描述ID数字序列号PERSON文本员工号~外键STARTTIME日期时间开始时间ENDTIME日期时间结束时间REASON文本请假原因描述表非正常工资类型表,OTHERTYPE,字段名称字段数据类型字段描述CODE数字类型编号DESCRIPTION文本非正常工资类型注:此表没有关键字。表加班表,OVERTIME,字段名称字段数据类型字段描述ID数字序列号PERSON文本员工号~外键WORKHOURS数字加班时间WORKDATE日期时间加班日期表员工信息表,PERSON,字段名称字段数据类型字段描述ID文本员工号~唯一标志PASSWD文本员工密码AUTHORITY数字权限设臵NAME文本员工姓名SEX文本性别BIRTHDAY日期时间出生年月DEPARTMENT文本部门简称JOB文本岗位职称EDULEVEL文本教育水平SPECIALTY文本专业ADDRESS文本地址TEL文本联系方式EMAIL文本电子邮箱STATE文本工作状态REMARK文本备注关键字:ID表员工登记表,PERSONNEL,字段名称字段数据类型字段描述ID数字序列号PERSON文本员工号CHANGE文本变化RECORDTIME日期时间记录时间表员工变动表,PERSONNELCHANGE,字段名称字段数据类型字段描述CODE数字编号DESCRIPTION文本描述表工资表,SALARY,字段名称字段数据类型字段描述ID数字序列号YEARMONTH日期时间年月PERSON文本员工名BASIC数字基本工资BONUS数字奖金ADDDETAIL数字加班费ADDTOTAL数字总共费用SUBDETAIL数字误工费SUBTOTAL数字减少统计TOTAL数字总体统计表福利奖金表,SALARYOTHER,字段名称字段数据类型字段描述ID数字序列号YEARMONTH日期时间年月PERSON文本员工号TYPE文本类型NAME文本员工姓名MONEY数字工资DESCRIPTIONL文本描述表工资创建表,SALARYSET,字段名称字段数据类型字段描述PERSON文本员工号SALARY数字工资此系统中将使用MFCODBC进行编程~并用MFC提供的动态数据交换机制,recordfieldexchange~RFX,~这将会给我们访问表中各个字段的值带来很大的方便~同时也方便系统升级为其他的数据库系统。四考勤系统的实现,一,系统登录功能的实现首先给出登录对话框~如图所示:图登录对话框用户要使用本系统~首先必须通过系统的身份认证。如果用户名错误或者不存在~将无法进入系统。,二,系统管理系统管理功能包括:重新登录和退出系统。如图所示:图系统管理,三,考勤管理考勤管理中负责对加班、出差和请假情况记录。如图所示:图考勤管理加班信息管理加班信息管理主要是对加班员工的加班时间以及加班日期进行管理。包括添加~删除加班信息。如图所示:图加班信息管理出差信息管理出差信息管理主要是对出差员工信息进行管理。包括添加~查询~删除出差信息。信息包括出差时间、员工号、员工名称以及出差原因。如图所示:图出差信息管理请假信息管理请假信息管理主要是对请假员工信息进行管理。包括添加~删除请假信息。信息包括请假时间、员工号、员工名称以及请假原因。如图所示:图请假信息管理,四,修改查询管理修改查询管理包括添加修改和查询统计两个功能。如图所示:图修改查询管理添加修改添加修改包括分别对全体员工的出勤情况进行添加~修改~删除。如图所示:图添加修改查询统计查询统计功能可以对某个月某个时间段的全体员工出勤情况进行统计~并且能够查询单个员工当月出勤情况。如图所示:图查询统计,五,系统设臵系统设臵主要对上下班时间进行设定~可以根据不同情况自行设定。如图所示:图系统设臵结论经过一个学期的设计~“考勤信息管理系统”已经基本设计完成。在这几个月的开发过程中~学到了许多有关数据库管理软件设计的东西。另外~通过对VC的使用~我也对软件有了一些认识~学到了很多关于该软件可视化编程的东西,也深深体会到了VC的功能强大~使用和操作简单。基于该系统的一些设计~下面对系统做一个总结。在整个设计过程中~主要的工作有:系统的权限及安全设计~包括用户权限的个人设定~密码保护与修改。员工信息、出勤信息、员工工资、相关查询、密码修改、帮助说明和退出系统模块的页面设计及功能的设计实现。设计中力求界面友好、简洁~易于操作。代码部分尽量避免逻辑错误~算法设计简单合理~尽量使程序具有较好的可读性~有利于其他的设计者对程序的阅读。力求对数据库操作的安全与稳定~尽量避免数据库操作异常~并要保证查询的快速无误。当然在设计中还有很多不足的地方。对于这样的软件开发~由于没有相应的切合实际的需求分析~所以在开发过程中遇到了许多棘手的问题。现在开发出来的软件对数据库的操作还不够稳定常会出现非法操作~异常处理做的还很欠缺。程序代码中还存在不少的Bug~这些在最后的测试过程中还有必要做较多的修改和完善。在设计时~由于时间和能力有限还有部分的功能没有实现~希望系统能在以后升级成更高版本时得以实现。致谢在论文完成之际~我要特别感谢我的指导老师的热情关怀和悉心指导。在我撰写论文的过程中~老师倾注了大量的心血和汗水~无论是在论文的选题、构思和资料的收集方面~还是在论文的研究方法以及成文定稿方面~我都得到了杨婧广博的学识、深厚的学术素养、严老师悉心细致的教诲和无私的帮助~特别是她谨的治学精神和一丝不苟的工作作风使我终生受益~在此表示真诚地感谢和深深的谢意。在论文的写作过程中~也得到了许多同学的宝贵建议~在此一并致以诚挚的谢意。感谢所有关心、支持、帮助过我的良师益友。最后~向在百忙中抽出时间对本文进行评审并提出宝贵意见的各位专家表示衷心地感谢:参考文献:刘瑞,吴跃进,王宗越VisualC项目开发实用案例科学出版社孙鑫余安萍VC深入详解电子工业出版社陈清华等VisualC课程设计案例精选与编程指导东南大学出版社刘长明等VISUALC实践与提高多媒体篇中国铁道出版社龙马工作室VISUALC管理信息系统完整项目实例剖析人民邮电出版社訾秀玲等Access数据库技术及应用教程清华大学出版社李闽溟等VisualC数据库系统开发实例导航人民邮电出版社严华峰等VISUALC课程设计案例精编(第二版)中国水利水电出版社张荣梅,梁晓林VisualC实用教程冶金工业出版社魏亮,李春葆编著VisualC程序设计例学与实践清华大学出版社附录:部分代码如下:voidCAttendanceDlg::OnAgainlogin(){隐藏主对话框ShowWindow(SWHIDE)显示登录对话框CLoginDlgdlgif(dlgDoModal()==IDOK){ShowWindow(SWSHOW)显示对话框}elseEndDialog(IDCANCEL)退出程序TODO:Addyourcommandhandlercodehere}CAttDlg::CAttDlg(CWnd*pParent*=*):CDialog(CAttDlg::IDD,pParent){设臵起始时间CTimeEndt=CTime::GetCurrentTime()当前时间CTimeSpantp(,,,)时间间隔为天{{AFXDATAINIT(CAttDlg)mStartTime=EndttpmEndTime=EndtmstrPersonID=T("")mstrName=T("")mbSeekbyperson=FALSEmbSeekbytime=FALSE}}AFXDATAINIT}intCAttendanceApp::ExitInstance(){if(dbIsOpen())dbClose()关闭数据库returnCWinApp::ExitInstance()}全局函数~将时间串转换为CTime型变量CTimeStrToTime(CStringstr){时间串格式"YmdH:M:S",如"::"intnYear,nMonth,nDay,nHour,nMinute,nSecondsscanf(strLeft(),"d",nYear)得到年sscanf(strMid(,),"d",nMonth)得到月sscanf(strMid(,),"d",nDay)得到日sscanf(strMid(,),"d",nHour)得到时sscanf(strMid(,),"d",nMinute)得到分sscanf(strMid(,),"d",nSecond)得到分构造CTime变量CTimeresult(nYear,nMonth,nDay,nHour,nMinute,nSecond)returnresult}voidCAttendanceDlg::OnBtnConfig(){显示工作时间设臵对话框CWorkplanDlgdlgdlgDoModal()}voidCAttendanceDlg::OnBtnRecord(){非模态显示出勤记录对话框if(!mpAttDlg)指针为空~创建对话框{mpAttDlg=newCAttDlg()mpAttDlg>Create(IDDDLGATTENDANCE,this)mpAttDlg>ShowWindow(SWSHOW)}else对话框已创建mpAttDlg>ShowWindow(SWSHOW)显示窗口}voidCAttendanceDlg::OnBtnStatistics(){非模态显示考勤统计对话框if(!mpStatDlg)指针为空~创建对话框{mpStatDlg=newCStatDlg()mpStatDlg>Create(IDDDLGSTAT,this)mpStatDlg>ShowWindow(SWSHOW)}else对话框已创建mpStatDlg>ShowWindow(SWSHOW)显示窗口}CAttendanceDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){pDC>SetBkMode(TRANSPARENT)设臵背景模式returnmbrush返回画刷}voidCAttendanceDlg::OnAgainlogin(){隐藏主对话框ShowWindow(SWHIDE)显示登录对话框CLoginDlgdlgif(dlgDoModal()==IDOK){ShowWindow(SWSHOW)显示对话框}elseEndDialog(IDCANCEL)退出程序TODO:Addyourcommandhandlercodehere}BOOLCLoginDlg::OnInitDialog(){CDialog::OnInitDialog()改变"登录人事管理系统"字体大小LOGFONTLogFontGetFont()>GetLogFont(LogFont)LogFontlfHeight=LogFontlfHeightLogFontlfWidth=LogFontlfWidthmfontCreateFontIndirect(LogFont)GetDlgItem(IDCSTATICLOGINTEXT)>SetFont(mfont)如数据库为打开状态~则关闭if(dbIsOpen())dbClose()returnTRUEreturnTRUEunlessyousetthefocustoacontrolEXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCLoginDlg::OnOK(){BOOLbLogin=FALSECStringstrPasswd,strCountUpdateData()更新数据变量if(!dbOpen(mstrDSN))return连接数据库strPasswd=CCrypt::Encrypt(mstrPasswd,)加密密码CRecordsetrs(db)构造记录集rsOpen(CRecordset::forwardOnly,"selectCOUNT(ID)asCOUNTfromPERSONwhereID='"mstrUser"'andPASSWD='"strPasswd"'andAUTHORITY=''")执行查询rsGetFieldValue("COUNT",strCount)rsClose()关闭数据集if(strCount=="")判断认证是否通过{EndDialog(IDOK)结束对话框~返回IDOK}else{MessageBox("请确认用户名和密码,注意大小写!","认证失败")dbClose()关闭数据库}}BOOLCPage::OnInitDialog(){CDialog::OnInitDialog()出入情况缺省为出((CButton*)GetDlgItem(IDCRADIOOUT))>SetCheck(TRUE)为List添加网格mcListSetExtendedStyle(LVSEXGRIDLINES)mcListSetExtendedStyle(LVSEXFULLROWSELECT)设臵List的列intnWidth=mcListInsertColumn(,"记录编号",LVCFMTLEFT,nWidth)mcListInsertColumn(,"员工号",LVCFMTLEFT,nWidth)mcListInsertColumn(,"出入情况",LVCFMTLEFT,nWidth)mcListInsertColumn(,"时间",LVCFMTLEFT,nWidth)CAttendanceRSrs(db)构造出勤记录表UpdateList(rs)更新ListTODO:AddextrainitializationherereturnTRUEreturnTRUEunlessyousetthefocustoacontrolEXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCPage::OnChangeEdtDepartid(){UpdateData()更新数据CDepartRSrs(db)构造记录集rsmstrFilter="ID='"mstrDepartID"'"设臵过滤条件rsOpen()打开记录集if(rsGetRecordCount()==)判断部门代码输入是否正确{mstrDepartName=rsmNAME提取部门名称}elsemstrDepartNameEmpty()清除部门名称rsClose()关闭记录集UpdateData(FALSE)更新界面数据TODO:IfthisisaRICHEDITcontrol,thecontrolwillnotsendthisnotificationunlessyouoverridetheCDialog::OnInitDialog()functionandcallCRichEditCtrl()SetEventMask()withtheENMCHANGEflagORedintothemaskTODO:Addyourcontrolnotificationhandlercodehere}voidCPage::OnChangeEdtPersonid(){UpdateData()更新数据CPersonRSrs(db)构造PERSON记录表rsmstrFilter="ID='"mstrPersonID"'"设臵过滤条件rsOpen()打开记录表if(rsGetRecordCount()==)判断员工号是否正确{mstrPersonName=rsmNAME提取员工姓名mstrDepartID=rsmDEPARTMENT提取员工所在部门编号}elsemstrPersonNameEmpty()清除员工姓名显示rsClose()关闭记录表UpdateData(FALSE)更新界面数据OnChangeEdtDepartid()显示部门名称TODO:IfthisisaRICHEDITcontrol,thecontrolwillnotsendthisnotificationunlessyouoverridetheCDialog::OnInitDialog()functionandcallCRichEditCtrl()SetEventMask()withtheENMCHANGEflagORedintothemaskTODO:Addyourcontrolnotificationhandlercodehere}voidCPage::IOAdd(CStringstrPersonID){intcounter用于计数CStringstrIO保存出入情况CCounterRSrscounter(db)构造计数器记录表记录编号rscountermstrFilter="ID='A'"设臵过滤器~提取计数值rscounterOpen()打开计数器记录表counter=rscountermCOUNTERVALUE提取计数值counter计数值加rscounterEdit()编辑计数器rscountermCOUNTERVALUE=counter保存当前计数rscounterUpdate()提交修改rscounterClose()关闭计数器记录表添加记录判断确定出入情况if(((CButton*)GetDlgItem(IDCRADIOOUT))>GetCheck())strIO="O"elsestrIO="I"转换出入时间类型intnYear,nMonth,nDay,nHour,nMinute年,月,日,时,分sscanf(mstrIOTimeLeft(),"d",nYear)得到年sscanf(mstrIOTimeMid(,),"d",nMonth)得到月sscanf(mstrIOTimeMid(,),"d",nDay)得到日sscanf(mstrIOTimeMid(,),"d",nHour)得到时sscanf(mstrIOTimeMid(,),"d",nMinute)得到分得到出入时间CTimeIOtime(nYear,nMonth,nDay,nHour,nMinute,)CAttendanceRSrsattendance(db)构造考勤记录表rsattendanceOpen()打开考勤记录表rsattendanceAddNew()追加考勤记录rsattendancemID=counterrsattendancemPERSON=strPersonIDrsattendancemINOUT=strIOrsattendancemIOTIME=IOtimersattendanceUpdate()rsattendanceClose()关闭考勤记录表UpdateList(rsattendance)更新列表框}voidCPage::OnBtnAddperson(){if(!mstrPersonNameIsEmpty())判断员工是否存在{IOAdd(mstrPersonID)追加单个员工记录}TODO:Addyourcontrolnotificationhandlercodehere}voidCPage::OnBtnAdddepart(){inti,n用于保存记录条数CPersonRSrsperson(db)构造员工信息表if(mstrDepartNameIsEmpty())return判断部门代号是否正确设臵过滤条件rspersonmstrFilter="DEPARTMENT='"mstrDepartID"'andSTATE='T'"rspersonOpen()打开员工信息表n=rspersonGetRecordCount()获取员工人数i=初始化已添加记录条数初始化进度条mcProgressSetRange(,n)mcProgressSetPos()while(!rspersonIsEOF())对数据表中所有记录进行处理{IOAdd(rspersonmID)添加当前员工出勤记录rspersonMoveNext()跳到下一个员工记录mcProgressSetPos(i)显示进度}rspersonClose()关闭员工信息表TODO:Addyourcontrolnotificationhandlercodehere}voidCPage::OnBtnAddall(){inti,n用于保存记录条数CPersonRSrsperson(db)构造员工信息表设臵过滤条件,提取员工列表rspersonmstrFilter="STATE='T'"rspersonOpen()打开员工信息表n=rspersonGetRecordCount()获取员工人数i=初始化已添加记录条数初始化进度条mcProgressSetRange(,n)mcProgressSetPos()while(!rspersonIsEOF())对数据表中所有记录进行处理{IOAdd(rspersonmID)添加当前员工出勤记录rspersonMoveNext()跳到下一个员工记录mcProgressSetPos(i)显示进度}rspersonClose()关闭员工信息表TODO:Addyourcontrolnotificationhandlercodehere}voidCPage::OnBtnDeleteattend(){CStringstrSQLintnItem得到第一个被选择Item的位臵POSITIONpos=mcListGetFirstSelectedItemPosition()if(pos==){AfxMessageBox("没有选择记录!")return}while(pos)遍历所有被选Item{nItem=mcListGetNextSelectedItem(pos)得到ItemIndex构造SQL语句strSQL="deletefromATTENDANCEwhereID="mcListGetItemText(nItem,)dbExecuteSQL(strSQL)执行}CAttendanceRSrs(db)构造出勤记录表UpdateList(rs)更新列表框TODO:Addyourcontrolnotificationhandlercodehere}voidCPage::UpdateList(CAttendanceRSrs){inti=CStringstrID,strTimersOpen()打开出勤记录表mcListDeleteAllItems()清除列表框内容while(!rsIsEOF())对数据表中所有记录进行处理{mcListInsertItem(i,"")添加新ItemstrIDFormat("d",rsmID)转换为字符串mcListSetItemText(i,,strID)mcListSetItemText(i,,rsmPERSON)mcListSetItemText(i,,rsmINOUT)mcListSetItemText(i,,rsmIOTIMEFormat("YmdH:M"))rsMoveNext()跳到下一条记录i}rsClose()关闭出勤记录表}BOOLCPage::OnInitDialog(){CDialog::OnInitDialog()为List添加网格mcListSetExtendedStyle(LVSEXGRIDLINES)mcListSetExtendedStyle(LVSEXFULLROWSELECT)设臵List的列intnWidth=mcListInsertColumn(,"记录编号",LVCFMTLEFT,nWidth)mcListInsertColumn(,"员工号",LVCFMTLEFT,nWidth)mcListInsertColumn(,"加班时间",LVCFMTLEFT,nWidth)mcListInsertColumn(,"加班日期",LVCFMTLEFT,nWidth)COvertimeRSrs(db)构造加班记录表UpdateList(rs)更新ListreturnTRUEreturnTRUEunlessyousetthefocustoacontrolEXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCPage::UpdateList(CLeaveRSrs){inti=CStringstrID,strSTime,strETimersOpen()打开加班记录表mcListDeleteAllItems()清除列表框内容while(!rsIsEOF())对数据表中所有记录进行处理{mcListInsertItem(i,"")添加新ItemstrIDFormat("d",rsmID)转换为字符串mcListSetItemText(i,,strID)mcListSetItemText(i,,rsmPERSON)strSTime=rsmSTARTTIMEFormat("ymdH:M")mcListSetItemText(i,,strSTime)strETime=rsmENDTIMEFormat("ymdH:M")mcListSetItemText(i,,strETime)mcListSetItemText(i,,rsmREASON)rsMoveNext()跳到下一条记录i}rsClose()关闭记录表}BOOLCPage::OnInitDialog(){CDialog::OnInitDialog()为List添加网格mcListSetExtendedStyle(LVSEXGRIDLINES)mcListSetExtendedStyle(LVSEXFULLROWSELECT)设臵List的列intnWidth=mcListInsertColumn(,"记录编号",LVCFMTLEFT,nWidth)mcListInsertColumn(,"员工号",LVCFMTLEFT,nWidth)mcListInsertColumn(,"开始时间",LVCFMTLEFT,nWidth)mcListInsertColumn(,"结束时间",LVCFMTLEFT,nWidth)mcListInsertColumn(,"具体描述",LVCFMTLEFT,nWidth)CErrandRSrs(db)构造出差记录表UpdateList(rs)更新ListreturnTRUEreturnTRUEunlessyousetthefocustoacontrolEXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCPage::UpdateList(CErrandRSrs){inti=CStringstrID,strSTime,strETimersOpen()打开出差记录表mcListDeleteAllItems()清除列表框内容while(!rsIsEOF())对数据表中所有记录进行处理{mcListInsertItem(i,"")添加新ItemstrIDFormat("d",rsmID)转换为字符串mcListSetItemText(i,,strID)mcListSetItemText(i,,rsmPERSON)strSTime=rsmSTARTTIMEFormat("ymdH:M")mcListSetItemText(i,,strSTime)strETime=rsmENDTIMEFormat("ymdH:M")mcListSetItemText(i,,strETime)mcListSetItemText(i,,rsmDESCRIPTION)rsMoveNext()跳到下一条记录i}rsClose()关闭出差记录表}BOOLCStatDlg::OnInitDialog(){CDialog::OnInitDialog()为List添加网格mcListSetExtendedStyle(LVSEXGRIDLINES)设臵List的列intnWidth=mcListInsertColumn(,"记录编号",LVCFMTLEFT,)mcListInsertColumn(,"员工号",LVCFMTLEFT,)mcListInsertColumn(,"年月",LVCFMTLEFT,nWidth)mcListInsertColumn(,"正常工作时间(小时)",LVCFMTLEFT,nWidth)mcListInsertColumn(,"加班时间(小时)",LVCFMTLEFT,nWidth)mcListInsertColumn(,"请假时间(半天)",LVCFMTLEFT,nWidth)mcListInsertColumn(,"出差时间(半天)",LVCFMTLEFT,nWidth)mcListInsertColumn(,"迟到次数",LVCFMTLEFT,nWidth)mcListInsertColumn(,"早退次数",LVCFMTLEFT,nWidth)mcListInsertColumn(,"旷工次数",LVCFMTLEFT,nWidth)CStatRSrs(db)构造出勤记录表UpdateList(rs)更新ListreturnTRUEreturnTRUEunlessyousetthefocustoacontrolEXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCStatDlg::UpdateList(CStatRSrs){inti=CStringstrrsOpen()打开统计数据表mcListDeleteAllItems()清除列表框内容while(!rsIsEOF())对数据表中所有记录进行处理{mcListInsertItem(i,"")添加新ItemstrFormat("d",rsmID)转换为字符串mcListSetItemText(i,,str)mcListSetItemText(i,,rsmPERSON)mcListSetItemText(i,,rsmYEARMONTH)strFormat("d",rsmWORKHOUR)mcListSetItemText(i,,str)strFormat("d",rsmOVERHOUR)mcListSetItemText(i,,str)strFormat("d",rsmLEAVEHDAY)mcListSetItemText(i,,str)strFormat("d",rsmERRANDHDAY)mcListSetItemText(i,,str)strFormat("d",rsmLATETIMES)mcListSetItemText(i,,str)strFormat("d",rsmEARLYTIMES)mcListSetItemText(i,,str)strFormat("d",rsmABSENTTIMES)mcListSetItemText(i,,str)rsMoveNext()跳到下一条记录i}rsClose()关闭统计数据表}voidCStatDlg::OnStatBtnStat(){CRecordsetrsQattend(db)构造Qattend记录集CRecordsetrsQleave(db)构造Qleave记录集CRecordsetrsQerrand(db)构造Qerrand记录集CTimeSpantp(,,,)构造一个天的CTimeSpanCTimeSpantp(,,,)构造一个小时的CTimeSpanCTimeSpanTimeSpan保存上下班时间intnHours保存上下午工作时间CStringstrSTime,strETime保存始末时间CTimeTimeStamp,LateTime,EarlyTime,WorkStart,WorkEnd保存中间判断时间intnWorkHour,nOverHour,nLeaveHDay,nErrandHDay保存时间间隔长度BOOLbLate,bEarly,bAbsent,bLeave,bErrand保存判断结果intnLateTimes,nEarlyTimes,nAbsentTimes保存次数CStringcstr暂存起始时间charstr暂存起始时间inti,j,n,counter用于循环和计数CStringstrTmp,strTmp,strTmp临时变量临时变量,年,月,日,时,分,秒intnHour,nMinute,nSecondCStringstrFileName="workplanini"INI文件名UpdateData()更新数据读取INI文件GetPrivateProfileString("WorkPlan","Time","::",str,,strFileName)GetPrivateProfileString("WorkPlan","Time","::",str,,strFileName)GetPrivateProfileString("WorkPlan","Time","::",str,,strFileName)GetPrivateProfileString("WorkPlan","Time","::",str,,strFileName)for(i=i<i)cstri=stri定义四个时间间隔变量并初始化为INI文件中的值CTimeSpan*pTSfor(i=i<i){sscanf(cstriLeft(),"d",nHour)得到时sscanf(cstriMid(,),"d",nMinute)得到分sscanf(cstriMid(,),"d",nSecond)得到秒构造一个时间间隔变量pTS=newCTimeSpan(,nHour,nMinute,nSecond)TimeSpani=*pTS赋值deletepTS}nHours=(TimeSpanTimeSpan)GetTotalHours()计算上午工作时间if((TimeSpanTimeSpan)GetMinutes()>)nHours四舍五入nHours=(TimeSpanTimeSpan)GetTotalHours()计算下午工作时间if((TimeSpanTimeSpan)GetMinutes()>)nHours四舍五入转换统计开始时间strSTime="#"mSTimeFormat("Ymd")"#"转换统计结束时间~且天数加strETime="#"(mETimetp)Format("Ymd")"#"提取员工列表CPersonRSrsperson(db)构造员工表rspersonmstrFilter="STATE='T'"设臵过滤器~提取员工列表rspersonOpen()打开员工表n=rspersonGetRecordCount()记录员工人数i=初始化已处理员工人数mcProgressSetRange(,n)设臵进度条mcProgressSetPos()初始化进度条while(!rspersonIsEOF())依次对每个员工进行统计{获取出勤记录执行查询rsQattendOpen(CRecordset::forwardOnly,"selectINOUT,IOTIMEfromATTENDANCEwherePERSON='"rspersonmID"'andIOTIME>"strSTime"andIOTIME<"strETime"orderbyIOTIME")strTmpEmpty()清空strTmp初始化nWorkHour=nOverHour=nLeaveHDay=nErrandHDay=nLateTimes=nEarlyTimes=nAbsentTimes=TimeStamp=mSTime初始化时间戳为统计开始时间while(TimeStamp<mETimetp)判断是否超出统计结束时间{if(TimeStampGetDayOfWeek()!=TimeStampGetDayOfWeek()!=)判断是否工作日{for(j=j<=j)遍历班次{LateTime=TimeStampTimeSpan*j设臵迟到时间EarlyTime=TimeStampTimeSpan*j设臵早退时间判断是否请假rsQleaveOpen(CRecordset::forwardOnly,"selectIDfromLEAVEwherePERSON='"rspersonmID"'andSTARTTIME<#"LateTimeFormat("YmdH:M:S")"#andENDTIME>#"EarlyTimeFormat("YmdH:M:S")"#")bLeave=(rsQleaveGetRecordCount()>)判断是否有请假记录rsQleaveClose()关闭记录集判断是否出差rsQerrandOpen(CRecordset::forwardOnly,"selectIDfromERRANDwherePERSON='"rspersonmID"'andSTARTTIME<#"LateTimeFormat("YmdH:M:S")"#andENDTIME>#"EarlyTimeFormat("YmdH:M:S")"#")bErrand=(rsQerrandGetRecordCount()>)判断是否有出差记录rsQerrandClose()关闭记录集if(bLeave)如果有请假记录nLeaveHDay请假记录加elseif(bErrand)如果有出差记录{nErrandHDay出差计数加nWorkHour=nHoursj按正常班累加工作时间}else正常上班{WorkStart=LateTime设臵工作开始时间WorkEnd=EarlyTime设臵工作结束时间bLate=TRUE初始化迟到判断bAbsent=FALSE初始化旷工判断判断是否迟到if(!rsQattendIsEOF()记录集不空strTmpIsEmpty())空,第一次GetFieldValuersQattendGetFieldValue("IOTIME",strTmp)得到IOTIMEwhile(!rsQattendIsEOF()StrToTime(strTmp)<=LateTime){根据时间顺序判断是否迟到得到INOUTrsQattendGetFieldValue("INOUT",strTmp)bLate=(strTmp=="O")判断上班时间前是否报到rsQattendMoveNext()跳到下一条出勤记录得到IOTIMEif(!rsQattendIsEOF())rsQattendGetFieldValue("IOTIME",strTmp)}判断是否旷工if(bLate)判断是否迟到{if(!rsQattendIsEOF()StrToTime(strTmp)<EarlyTime)WorkStart=StrToTime(strTmp)记录迟到时间elsebAbsent=TRUE如果下班前仍未报到记为旷工}bEarly=FALSE判断是否早退while(!rsQattendIsEOF()StrToTime(strTmp)<EarlyTime){得到INOUTrsQattendGetFieldValue("INOUT",strTmp)bEarly=(strTmp=="O")判断是否有早退if(bEarly){将早退时间记录为工作结束时间WorkEnd=StrToTime(strTmp)}elseWorkEnd=EarlyTime将下班时间记录为工作结束时间rsQattendMoveNext()跳至下一条出勤记录得到IOTIMEif(!rsQattendIsEOF())rsQattendGetFieldValue("IOTIME",strTmp)}如果旷工~增加旷工次数记录if(bAbsent)nAbsentTimeselse{如果迟到~增加迟到次数记录if(bLate)nLateTimes如果早退~增加早退次数记录if(bEarly)nEarlyTimes计算实际工作时间nWorkHour=(WorkEndWorkStart)GetTotalHours()if((WorkEndWorkStart)GetMinutes()>)nWorkHour四舍五入}}}Endof遍历班次}Endof是否工作日TimeStamp=tp推进一天}EndofTimeStamp<mETimetprsQattendClose()关闭Qattend记录集统计加班时间CRecordsetrsQovertime(db)构造Qovertime记录集rsQovertimeOpen(CRecordset::forwardOnly,"selectsum(WORKHOURS)asSUMfromOVERTIMEwherePERSON='"rspersonmID"'andWORKDATE>#"mSTimeFormat("YmdH:M:S")"#andWORKDATE<#"mETimeFormat("YmdH:M:S")"#")if(rsQovertimeGetRecordCount()>)有记录{提取加班时间rsQovertimeGetFieldValue("SUM",strTmp)sscanf(strTmp,"d",nOverHour)}elsenOverHour=无记录rsQovertimeClose()判断是否已有该月考勤记录CStatRSrsstat(db)构造统计数据表设臵过滤串rsstatmstrFilter="PERSON='"rspersonmID"'andYEARMONTH='"mstrTime"'"rsstatOpen()打开数据表if(rsstatGetRecordCount()==)判断是否有该月份考勤记录{获取计数CCounterRSrscounter(db)构造计数器表rscountermstrFilter="ID='S'"设臵过滤器~提取计数值rscounterOpen()打开计数器记录表counter=rscountermCOUNTERVALUE提取计数值counter计数值加rscounterEdit()编辑计数器rscountermCOUNTERVALUE=counter保存当前计数rscounterUpdate()提交修改rscounterClose()关闭计数器记录表追加统计记录rsstatAddNew()rsstatmID=counterrsstatmYEARMONTH=mstrTimersstatmPERSON=rspersonmIDrsstatmWORKHOUR=nWorkHourrsstatmOVERHOUR=nOverHourrsstatmLEAVEHDAY=nLeaveHDayrsstatmERRANDHDAY=nErrandHDayrsstatmLATETIMES=nLateTimesrsstatmEARLYTIMES=nEarlyTimesrsstatmABSENTTIMES=nAbsentTimesrsstatUpdate()提交修改}else{记录已存在修改数据rsstatEdit()rsstatmWORKHOUR=nWorkHourrsstatmOVERHOUR=nOverHourrsstatmLEAVEHDAY=nLeaveHDayrsstatmERRANDHDAY=nErrandHDayrsstatmLATETIMES=nLateTimesrsstatmEARLYTIMES=nEarlyTimesrsstatmABSENTTIMES=nAbsentTimesrsstatUpdate()提交修改}rsstatClose()关闭数据表i已统计员工数加mcProgressSetPos(i)显示统计进度rspersonMoveNext()跳到下一个员工记录}rspersonClose()关闭员工表CStatRSrsstat(db)构造统计数据表UpdateList(rsstat)更新列表框

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/54

基于VC++的考勤系统(论文)

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利