• 491.00 KB
  • 2022-05-17 12:56:05 发布

课程设计论文-基于vb的考勤管理系统设计

  • 39页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
考勤管理系统1.1系统设计1.1.1系统的设计目标考勤管理系统的总体任务是实现考勤管理的规范化、考勤数据统计的自动化。系统的设计目标即是完成这一任务。1.1.2设计思想系统应尽量结合单位现有的软硬件环境,充分利用现有资源。所以本系统除了要能够手工录入员工的考勤记录外,还应能够与考勤机相结合,实现考勤信息录入自动化。系统的考勤类型应能够灵活设定,以便用户随时调整。系统应具备报表功能,查询统计时能够直接生成相关员工的考勤报表,报表要能够导出、打印。系统应该具备数据库维护功能,能够让用户进行数据表的备份和恢复。系统应采用模块化程序设计,便于功能的组合与修改,以及以后尽可能进行补充。综合考虑,确定本系统使用C/S工作模式,以oracle作为后台数据库,visualbasic6.0为前台程序开发语言。1.1.3系统功能模块划分u根据系统的设计思想,划分系统功能为以下几个模块。u员工信息的管理模块u考勤类型的设定模块u员工考勤信息手工录入模块u经考勤机生成并处理的考勤信息导入模块u员工考勤情况统计报表生成模块u数据库维护模块 系统功能模块图如图1.1所示考勤管理系统员工信息管理考勤类型设定信息手工录入信息导入生成统计报表数据库维护图1.1系统功能模块图1.2系统设计数据库设计在数据库程序设计中是非常重要的一个环节,具体指的是数据库中各个表结构的设计,包括信息保存在哪些表格中,各个表详细结构以及各个表格之间的关系。数据库结构是数据库应用程序的基础,它的好坏直接影响到应用程序的执行效率,数据库结构设计得好,就会减少数据库的存储量,并且使数据保持很高的完整性和一致性,还会提高数据查询的数度,运用前台编程工具时,也会有一定程序上的简化。数据库设计分为以下三个阶段。l数据库需求分析l数据库概念结构设计l数据库逻辑结构设计1.2.1数据库需求分析数据库需求分析是数据库结构设计的第一个阶段,也是非常重要的一个阶段,这个阶段的任务是收集数据基本信息和取得数据处理的流程。需求分析要做的工作是与用户结合,调查用户需要操作的资料,以决定在数据库中存储什么数据,还要弄清用户怎么处理各种数据资料,理清数据库中个数据之间的关系。这个阶段的工作成功应该有以下三个方面的内容。 l数据项:每种具体数据的名称、意义、类型、取值范围以及与其他数据项之间的逻辑关系。l数据集:若干数据项的有逻辑关联的集合,包括名称、意义和组成数据集的数据项。l数据流:应用系统运行时,数据是怎样输入、处理和输出的。这三个方面的内容就是本系统的数据字典文档,如果数据库需求分析阶段的工作没有做好,数据字典在将来的系统开发过程中就有可能随时发生变化,开发后期可能面临程序午休止的修改和调试,甚至是一切的推到重来,因此一定要重视这个阶段的工作。系统处理数据的流程,如图1.2所示生成考勤统计表员工信息数据考勤类型数据员工考勤信息数据考勤类型设定员工信息管理考勤信息手工录入考勤类型数据导入图1.2数据流程图通过分析数据流程,设计数据集和数据项如下。l员工信息数据集,数据项为员工号、员工姓名、员工性别、员工所属部门。l考勤类型数据集,数据项为类型号、类型名称。l员工考勤情况数据集,数据项为考勤日期、员工号、考勤类型号、备注。1.2.2数据库结构设计本系统采用E-R图的方法来进行数据库概念结构设计。1.员工信息实体E-R图 员工信息实体E-R图如图1.3所示。员工信息员工号员工姓名员工性别所属部门图1.3员工信息实体E-R图2.考勤类型实体E-R图考勤类型实体E-R图如图1.4所示。考勤类型类型号类型名称图1.4考勤类型实体E-R图3.员工考勤情况实体E-R图员工考勤情况实体E-R图如图1.5所示。 员工考勤情况考勤日期员工号考勤类型号备注图1.5员工考勤情况实体E-R图4.实体和实体之间的关系E-R图实体和实体之间的关系E-R图如图1.6所示。员工具有哦、考勤情况属于考勤类型图1.6各实体之间的关系E-R图数据库各个表格的设计结果,如表1.1~1.3所示。表1.1考勤类型表格[KQLXB]字段数据类型能否为空备注BHVARCHAR2(4)NOTNULL类型编号(主键)LXVARCHAR2(20)NULL类型名称表1.2员工信息表格[YGB]字段数据类型能否为空备注BHVARCHAR2(8)NOTNULL员工编号(主键)XMVARCHAR2(12)NOTNULL员工姓名XBVARCHAR2(2)NOTNULL员工性别BMVARCHAR2(20)NULL员工部门 表1.3考勤管理表格[KQGLB]字段数据类型能否为空备注KQRQDATENOTNULL考勤日期(主键1)YGBHVARCHAR2(8)NOTNULL员工编号(主键2)(指向员工信息表BH字段的外键)LXBHVARCHAR2(4)NOTNULL类型编号(指向考勤类型表BH字段的外键)BZVARCHAR2(20)NULL备注1.3设计系统的界面1.3.1窗口的设计经过构细,本系统需要创建五个窗口:考勤管理系统登录窗口、考勤类型管理窗口、员工信息管理窗口、考勤情况录入窗口、考勤信息统计窗口1.考勤管理系统登录窗口运行界面2.考勤管理系统登录窗口设计界面 主要事件与代码:PrivateSubForm_Resize()Image1.Width=Me.WidthImage1.Height=Me.HeightLabel1.Left=(Me.Width)/2-Label1.Width/2Label2.Left=(Me.Width)/2-Label2.Width/2Label3.Left=(Me.Width)/2-Label3.Width/2EndSubPrivateSubToolbar1_ButtonClick(ByValButtonAsMSComctlLib.Button)SelectCaseButton.KeyCase"bt2"frm_yggl.Show,MeCase"bt3"frm_kqlx.Show,MeCase"bt4"frm_kqlr.Show,MeCase"bt5"Frm_kqtj.Show,Me EndSelectEndSub1.员工信息管理窗口运行界面2.员工信息管理窗口设计界面属性设置:1.Frm_yggl的属性设置 属性名值含义Caption员工信息管理 BorderStyle1FixedsingleStartUpPosition1所有者中心2.Combo1的属性设置Style2DropdownListList男 女 LockedTrue 3.DataGrid1的属性设置DataSourceAdodc1 4.Text1--Text3的属性设置LockedTrue 主要事件与代码:Dimadd_flagAsBoolean,modify_flagAsBooleanPrivateSubAdodc1_MoveComplete(ByValadReasonAsADODB.EventReasonEnum,ByValpErrorAsADODB.Error,adStatusAsADODB.EventStatusEnum,ByValpRecordsetAsADODB.Recordset)IfAdodc1.Recordset.RecordCount>0ThenText1.Text=Adodc1.Recordset.Fields("bh")&""Text2.Text=Adodc1.Recordset.Fields("xm")&""Text3.Text=Adodc1.Recordset.Fields("bm")&""IfAdodc1.Recordset.Fields("xb")="男"ThenCombo1.ListIndex=0ElseCombo1.ListIndex=1EndIf ElseText1.Text=""Text2.Text=""Text3.Text=""Combo1.ListIndex=0CallshowbuttonsEndIfEndSubPrivateSubcmdadd_Click()Text1.Text=""Text2.Text=""Text3.Text=""Text1.Locked=FalseText2.Locked=FalseText3.Locked=FalseCombo1.Locked=FalseDataGrid1.Enabled=Falseadd_flag=TrueCallshowbuttonsEndSubPrivateSubcmdcancle_Click()IfAdodc1.Recordset.RecordCount>0ThenText1.Text=Adodc1.Recordset.Fields("bh")&""Text2.Text=Adodc1.Recordset.Fields("xm")&""Text3.Text=Adodc1.Recordset.Fields("bm")&""IfAdodc1.Recordset.Fields("xb")="男"ThenCombo1.ListIndex=0 ElseCombo1.ListIndex=1EndIfElseText1.Text=""Text2.Text=""Text3.Text=""Combo1.ListIndex=0EndIfText1.Locked=TrueText2.Locked=TrueText3.Locked=TrueCombo1.Locked=TrueDataGrid1.Enabled=Trueadd_flag=Falsemodify_flag=FalseCallshowbuttonsEndSubPrivateSubcmddelete_Click()ret=MsgBox("你真的要删除"+Adodc1.Recordset.Fields("xm")+"的记录吗?",vbYesNo+vbQuestion+vbDefaultButton2,"提示")Ifret=vbYesThenAdodc1.Recordset.DeleteAdodc1.Recordset.UpdateEndIfDataGrid1.SetFocusEndSubPrivateSubcmdexit_Click() UnloadMeEndSubPrivateSubcmdmodify_Click()Text1.Locked=FalseText2.Locked=FalseText3.Locked=FalseCombo1.Locked=FalseDataGrid1.Enabled=Falsemodify_flag=TrueCallshowbuttonsEndSubPrivateSubcmdsave_Click()Text1.Text=Trim(Text1.Text)Text2.Text=Trim(Text2.Text)Text3.Text=Trim(Text3.Text)Ifis_data_ok()=FalseThenExitSubEndIfin_bh=Text1.Textin_xm=Text2.Textin_xb=Combo1.Textin_bm=Text3.TextIfadd_flag=TrueThenAdodc1.Recordset.AddNewEndIfAdodc1.Recordset.Fields("bh")=in_bhAdodc1.Recordset.Fields("xm")=in_xm Adodc1.Recordset.Fields("xb")=in_xbAdodc1.Recordset.Fields("bm")=in_bmAdodc1.Recordset.UpdateIfadd_flag=TrueThenAdodc1.Recordset.Find"bh=""+in_bh+""",,adSearchForward,1EndIfText1.Locked=TrueText2.Locked=TrueText3.Locked=TrueCombo1.Locked=TrueDataGrid1.Enabled=Trueadd_flag=Falsemodify_flag=FalseCallshowbuttonsDataGrid1.SetFocusEndSubPrivateSubForm_Load()add_flag=Falsemodify_flag=FalseCallshowbuttonsEndSubPrivateSubshowbuttons()Ifadd_flag=FalseAndmodify_flag=FalseThencmdadd.Enabled=TrueIfAdodc1.Recordset.RecordCount=0ThenCmdmodify.Enabled=False cmddelete.Enabled=FalseElseCmdmodify.Enabled=Truecmddelete.Enabled=TrueEndIfcmdexit.Enabled=TrueCmdcancle.Enabled=FalseCmdsave.Enabled=FalseElsecmdadd.Enabled=FalseCmdmodify.Enabled=Falsecmddelete.Enabled=Falsecmdexit.Enabled=FalseCmdcancle.Enabled=TrueCmdsave.Enabled=TrueEndIfEndSubPrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)Ifadd_flag=TrueOrmodify_flag=TrueThenMsgBox("数据正在编辑,不能退出!")Cancel=TrueEndIfEndSubPrivateSubText1_KeyPress(KeyAsciiAsInteger)If(KeyAscii<48OrKeyAscii>57)AndKeyAscii<>8ThenKeyAscii=0 EndIfEndSubPrivateFunctionis_data_ok()AsBooleanIfmodify_flag=TrueThenold_bh=Adodc1.Recordset.Fields("bh")EndIfIfLen(Text1.Text)<8ThenMsgBox("编号的长度不够!")is_data_ok=FalseText1.SetFocusExitFunctionEndIfIfLen(Text2.Text)=0ThenMsgBox("姓名未输入!")is_data_ok=FalseText2.SetFocusExitFunctionEndIfIfadd_flag=TrueThenAdodc2.RecordSource="select*fromygbwherebh=""+Text1.Text+"""Adodc2.RefreshElseAdodc2.RecordSource="select*fromygbwherebh=""+Text1.Text+""andbh<>""+old_bh+"""Adodc2.RefreshEndIfIfAdodc2.Recordset.RecordCount>0Then MsgBox("编号有重复!")is_data_ok=FalseText1.SetFocusExitFunctionEndIfis_data_ok=TrueEndFunction1.考勤情况录入窗口运行界面2.考勤情况录入窗口设计界面 属性设置:1.Frm_kqlr的属性设置属性名值含义Caption考勤情况录入BorderStyle1FixedsingleStartUpPosition1所有者中心2.数据源Adodc的设置Adodc1名称AdoDataGridAdodc2名称AdoKQGLBAdodc3名称AdoKQLXBAdodc4名称AdoYGB2.下拉框Combo的属性设置Combo1名称ComboYGB生成员工列表Combo2名称ComboKQLXB生成考勤类型列表LockedTrueStyle2DropdownList 3.DataGrid1的属性设置DataSourceAdoDataGrid4.Text1的属性设置LockedTrue主要事件与代码:Dimadd_flagAsBoolean,modify_flagAsBooleanDimygb_recAsInteger,lxb_recAsIntegerDimkq_dateAsString"add_flag:增加状态标志(布尔型)modify_flag:修改状态标志(布尔型)"ygb_rec:员工表记录总数(数值型)lxb_rec:类型表记录总数(数值型)"kq_date:考勤的日期(类型是字符型)PrivateSubAdoDataGrid_MoveComplete(ByValadReasonAsADODB.EventReasonEnum,ByValpErrorAsADODB.Error,adStatusAsADODB.EventStatusEnum,ByValpRecordsetAsADODB.Recordset)IfAdoDataGrid.Recordset.RecordCount>0Then"数据表内容不为空ComboYGB.Text=AdoDataGrid.Recordset.Fields("员工")&""ComboKQLXB.Text=AdoDataGrid.Recordset.Fields("类型")&""Text1.Text=AdoDataGrid.Recordset.Fields("bz")&""EndIfEndSubPrivateSubcmdadd_Click()"增加按钮"增加按钮的单击事件"1:生成员工的增加列表框Callformyglist(kq_date,"add")"2:文本框、组合框解锁Text1.Text="""文本框清空 Text1.Locked=False"取消对象的只读ComboYGB.Locked=FalseComboKQLXB.Locked=FalseComboYGB.ListIndex=0ComboKQLXB.ListIndex=0"3:锁定表格、日期不能动DataGrid1.Enabled=False"锁定表格DTPicker1.Enabled=False"锁定日期"4:设置表单状态add_flag=True"设置为增加编辑状态Callshowbuttons"刷新按钮状态ComboYGB.SetFocusEndSubPrivateSubcmdmodify_Click()"修改按钮"修改按钮的单击事件"1:文本框、组合框解锁Text1.Locked=False"取消对象的只读ComboKQLXB.Locked=False"2:锁定表格、日期不能动DataGrid1.Enabled=False"锁定表格DTPicker1.Enabled=False"锁定日期"3:设置表单状态modify_flag=True"设置为修改编辑状态Callshowbuttons"刷新按钮状态ComboKQLXB.SetFocusEndSubPrivateSubcmdcancle_Click()"取消按钮 "取消按钮的单击事件"1:生成员工的浏览列表Callformyglist(kq_date,"browse")"2:恢复数据,并设置文本框、下拉框对象只读IfAdoDataGrid.Recordset.RecordCount>0Then"数据表内容不为空ComboYGB.Text=AdoDataGrid.Recordset.Fields("员工")&""ComboKQLXB.Text=AdoDataGrid.Recordset.Fields("类型")&""Text1.Text=AdoDataGrid.Recordset.Fields("bz")&""EndIfComboYGB.Locked=True"设置对象的只读ComboKQLXB.Locked=True"3:表格、日期控件可以动DataGrid1.Enabled=True"取消锁定表格DTPicker1.Enabled=True"取消锁定日期"4:修改表单的状态add_flag=False"设置为非增加状态modify_flag=False"设置为非修改状态Callshowbuttons"刷新按钮状态DataGrid1.SetFocusEndSubPrivateSubcmdsave_Click()"保存按钮"保存按钮的单击事件"1:保存的信息保存到变量Text1.Text=Trim(Text1.Text)in_date=kq_date"日期信息in_yg=Trim(ComboYGB.Text)"员工信息in_lx=Trim(ComboKQLXB.Text)"类型信息in_bz=Text1.Text"备注信息"----------------------- "2:数据保存Ifadd_flag=TrueThen"增加数据AdoKQGLB.Recordset.AddNewElse"修改数据AdoKQGLB.Recordset.Find"kqrq="+in_date,,adSearchForward,1AdoKQGLB.Recordset.Find"ygbh=""+Mid(in_yg,1,8)+""",,adSearchForward"定位记录EndIfAdoKQGLB.Recordset.Fields("kqrq")=in_date"日期AdoKQGLB.Recordset.Fields("ygbh")=Mid(in_yg,1,8)"员工编号AdoKQGLB.Recordset.Fields("lxbh")=Mid(in_lx,1,4)"类型编号AdoKQGLB.Recordset.Fields("bz")=in_bz"备注AdoKQGLB.Recordset.Update"保存到后台数据库Callformyglist(kq_date,"browse")AdoKQGLB.Refresh"数据源刷新AdoDataGrid.Refresh"表格刷新AdoDataGrid.Recordset.Find"员工=""+in_yg+""",,adSearchForward"---------------------------"3:保存的后续工作(设置对象只读、取消表格日期锁定、设置表单状态)Text1.Locked=True"设置对象的只读ComboYGB.Locked=TrueComboKQLXB.Locked=TrueDataGrid1.Enabled=True"取消锁定表格DTPicker1.Enabled=True"取消日期锁定add_flag=False"设置为非增加状态modify_flag=False"设置为非修改状态Callshowbuttons"刷新按钮状态DataGrid1.SetFocusEndSub PrivateSubcmdexit_Click()"退出按钮"退出按钮的单击事件UnloadMeEndSubPrivateSubForm_Load()"表单的初始化事件"1:生成日期信息,考勤日期默认为今天的日期WithDTPicker1.Year=Year(Date).Month=Month(Date).Day=Day(Date).CustomFormat="yyyy年MM月d日dddd""设置日期格式EndWithkq_date=CStr(Date)"2:生成数据集---KQGLBWithAdoKQGLB"与kqglb表关联.ConnectionString="Provider=OraOLEDB.Oracle.1;Password=xscj1234;PersistSecurityInfo=True;UserID=system;DataSource=xscj".CommandType=adCmdText.RecordSource="select*fromkqglborderbykqrq".RefreshEndWith"--------------------------"3:生成数据集---KQLXBWithAdoKQLXB"与kqlxb表关联 .ConnectionString="Provider=OraOLEDB.Oracle.1;Password=xscj1234;PersistSecurityInfo=True;UserID=system;DataSource=xscj".CommandType=adCmdText.RecordSource="selectbh||""||lxas类型fromkqlxborderbybh".RefreshEndWithlxb_rec=AdoKQLXB.Recordset.RecordCount"保存类型表数据集记录总数"生成comboKQLXB列表(列表格式:类型编号+名称)WhileAdoKQLXB.Recordset.EOF<>TrueComboKQLXB.AddItem(AdoKQLXB.Recordset.Fields("类型"))AdoKQLXB.Recordset.MoveNextWendIflxb_rec>0Then"类型表非空ComboKQLXB.ListIndex=0EndIf"-----------------------------"4:生成数据集---YGBWithAdoYGB"与ygb表关联.ConnectionString="Provider=OraOLEDB.Oracle.1;Password=xscj1234;PersistSecurityInfo=True;UserID=system;DataSource=xscj".CommandType=adCmdText.RecordSource="select*fromygb".RefreshEndWithygb_rec=AdoYGB.Recordset.RecordCount"保存员工表数据集的记录总数Callformyglist(kq_date,"browse")"生成今天的考勤员工浏览列表"----------------------------- "5:生成表格的数据集WithAdoDataGrid"与表单的datagrid1表格相关联.ConnectionString="Provider=OraOLEDB.Oracle.1;Password=xscj1234;PersistSecurityInfo=True;UserID=system;DataSource=xscj".CommandType=adCmdText.RecordSource="selectkqrq,ygbh||""||xmas员工,b.bh||""||lxas类型,bzfromygba,kqlxbb,kqglbcwherekqrq=""+kq_date+""anda.bh=c.ygbhandb.bh=c.lxbhorderbya.bh".RefreshEndWith"-----------------------------add_flag=False"设置表单为非增加状态modify_flag=False"设置表单为非修改状态Callshowbuttons"刷新按钮状态EndSubPrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)"表单退出前发生的事件Ifadd_flag=TrueOrmodify_flag=TrueThenMsgBox("正在编辑,不能退出!")Cancel=TrueEndIfEndSubPrivateSubDTPicker1_Change()"日期改变时发生的事件kq_date=CStr(DTPicker1.Year)+"-"+CStr(DTPicker1.Month)+"-"+CStr(DTPicker1.Day)"新日期 Callformyglist(kq_date,"browse")"重新生成员工下拉列表WithAdoDataGrid.RecordSource="selectkqrq,a.bh||""||xmas员工,b.bh||""||lxas类型,bzfromygba,kqlxbb,kqglbcwherekqrq=""+kq_date+""anda.bh=c.ygbhandb.bh=c.lxbhorderbykqrq".Refresh"数据源刷新(表格数据刷新)EndWithCallshowbuttons"刷新按钮状态DataGrid1.SetFocusEndSubPrivateSubshowbuttons()"自定义过程,作用:控制按钮的显示Ifadd_flag=FalseAndmodify_flag=FalseThen"数据浏览状态(非增加、非修改)Ifygb_rec=0Orlxb_rec=0Then"员工表或考勤类型表内容为空cmdadd.Enabled=FalseElseIfAdoDataGrid.Recordset.RecordCount=ygb_recThen"所有员工的考勤信息已录入cmdadd.Enabled=FalseElsecmdadd.Enabled=TrueEndIfEndIfIfAdoDataGrid.Recordset.RecordCount>0Then"表格数据集非空Cmdmodify.Enabled=TrueElse"表格数据集为空Cmdmodify.Enabled=False EndIfCmdsave.Enabled=FalseCmdcancle.Enabled=Falsecmdexit.Enabled=TrueElse"数据编辑状态(增加、修改)cmdadd.Enabled=FalseCmdmodify.Enabled=Falsecmdexit.Enabled=FalseCmdsave.Enabled=TrueCmdcancle.Enabled=TrueEndIfEndSubPrivateSubformyglist(ByVallist_dateAsString,ByValoper_modeAsString)"自定义函数,作用是形成员工的下拉列表"形参1:list_date,日期型变量,表示考勤的日期"形参2:oper_mode,字符型变量,表示操作的模式(增加模式:add浏览模式:browse)WithAdoYGBIfoper_mode="add"Then"增加操作模式.RecordSource="selectbh||""||xmas员工fromygbwherebhnotin(selectygbhfromkqglbwherekqrq=""+list_date+"")orderbybh"Else"浏览操作模式.RecordSource="selectbh||""||xmas员工fromygbwherebhin(selectygbhfromkqglbwherekqrq=""+list_date+"")orderbybh"EndIf.RefreshEndWith "生成comboYGB列表(格式:员工编号+姓名)ComboYGB.Clear"清除列表WhileAdoYGB.Recordset.EOF<>TrueComboYGB.AddItem(AdoYGB.Recordset.Fields("员工"))AdoYGB.Recordset.MoveNextWendEndSub1.考勤类型管理窗口运行界面2.考勤类型管理窗口设计界面主要事件与代码:Dimadd_flagAsBoolean,modify_flagAsBoolean PrivateSubAdodc1_MoveComplete(ByValadReasonAsADODB.EventReasonEnum,ByValpErrorAsADODB.Error,adStatusAsADODB.EventStatusEnum,ByValpRecordsetAsADODB.Recordset)IfAdodc1.Recordset.RecordCount>0ThenText1.Text=Adodc1.Recordset.Fields("bh")&""Text2.Text=Adodc1.Recordset.Fields("lx")&""ElseText1.Text=""Text2.Text=""CallshowbuttonsEndIfEndSubPrivateSubshowbuttons()Ifadd_flag=FalseAndmodify_flag=FalseThencmdadd.Enabled=TrueIfAdodc1.Recordset.RecordCount=0ThenCmdmodify.Enabled=Falsecmddelete.Enabled=FalseElseCmdmodify.Enabled=Truecmddelete.Enabled=TrueEndIfcmdexit.Enabled=TrueCmdcancle.Enabled=FalseCmdsave.Enabled=FalseElsecmdadd.Enabled=False Cmdmodify.Enabled=Falsecmddelete.Enabled=Falsecmdexit.Enabled=FalseCmdcancle.Enabled=TrueCmdsave.Enabled=TrueEndIfEndSubPrivateSubcmdadd_Click()Text1.Text=""Text2.Text=""Text1.Locked=FalseText2.Locked=FalseDataGrid1.Enabled=Falseadd_flag=TrueCallshowbuttonsEndSubPrivateSubcmdcancle_Click()IfAdodc1.Recordset.RecordCount>0ThenText1.Text=Adodc1.Recordset.Fields("bh")&""Text2.Text=Adodc1.Recordset.Fields("lx")&""ElseText1.Text=""Text2.Text=""EndIfText1.Locked=TrueText2.Locked=TrueDataGrid1.Enabled=True add_flag=Falsemodify_flag=FalseCallshowbuttonsEndSubPrivateSubcmddelete_Click()ret=MsgBox("你真的要删除"+Adodc1.Recordset.Fields("lx")+"的类型吗?",vbYesNo+vbQuestion+vbDefaultButton2,"提示")Ifret=vbYesThenAdodc1.Recordset.DeleteAdodc1.Recordset.UpdateEndIfDataGrid1.SetFocusEndSubPrivateSubcmdexit_Click()UnloadMeEndSubPrivateSubcmdmodify_Click()Text1.Locked=FalseText2.Locked=FalseDataGrid1.Enabled=Falsemodify_flag=TrueCallshowbuttonsEndSubPrivateSubcmdsave_Click()Text1.Text=Trim(Text1.Text) Text2.Text=Trim(Text2.Text)Ifis_data_ok()=FalseThenExitSubEndIfin_bh=Text1.Textin_lx=Text2.TextIfadd_flag=TrueThenAdodc1.Recordset.AddNewEndIfAdodc1.Recordset.Fields("bh")=in_bhAdodc1.Recordset.Fields("lx")=in_lxAdodc1.Recordset.UpdateIfadd_flag=TrueThenAdodc1.Recordset.Find"bh=""+in_bh+""",,adSearchForward,1EndIfText1.Locked=TrueText2.Locked=TrueDataGrid1.Enabled=Trueadd_flag=Falsemodify_flag=FalseCallshowbuttonsDataGrid1.SetFocusEndSubPrivateSubForm_Load()Me.Showadd_flag=Falsemodify_flag=FalseCallshowbuttons DataGrid1.SetFocusEndSubPrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)Ifadd_flag=TrueOrmodify_flag=TrueThenMsgBox("数据正在编辑,不能退出!")Cancel=TrueEndIfEndSubPrivateSubText1_KeyPress(KeyAsciiAsInteger)If(KeyAscii<48OrKeyAscii>57)AndKeyAscii<>8ThenKeyAscii=0EndIfEndSubPrivateFunctionis_data_ok()AsBooleanIfmodify_flag=TrueThenold_bh=Adodc1.Recordset.Fields("bh")EndIfIfLen(Text1.Text)<4ThenMsgBox("编号的长度不够!")is_data_ok=FalseText1.SetFocusExitFunctionEndIfIfLen(Text2.Text)=0ThenMsgBox("类型名称未输入!") is_data_ok=FalseText2.SetFocusExitFunctionEndIfIfadd_flag=TrueThenAdodc2.RecordSource="select*fromkqlxbwherebh=""+Text1.Text+"""Adodc2.RefreshElseAdodc2.RecordSource="select*fromkqlxbwherebh=""+Text1.Text+""andbh<>""+old_bh+"""Adodc2.RefreshEndIfIfAdodc2.Recordset.RecordCount>0ThenMsgBox("编号有重复!")is_data_ok=FalseText1.SetFocusExitFunctionEndIfis_data_ok=TrueEndFunction1.考勤信息统计窗口运行界面 1.考勤信息统计窗口设计界面: 属性设置:1.Frm_kqlr的属性设置属性名值含义Caption考勤信息统计 BorderStyle1FixedsingleStartUpPosition1所有者中心2.数据源Adodc的设置  Adodc1名称AdoGrid Adodc2名称AdoBM Adodc3名称AdoLX 2.下拉框Combo的属性设置Combo1名称ComboBM生成部门列表Combo2名称ComboLX生成考勤类型列表LockedTrue Style2DropdownList3.DataGrid1的属性设置DataSourceAdoGrid 4.DTPicker的属性设置DTPicker1名称DT开始日期 DTPicker2名称DT结束日期  主要事件与代码:Dimbegin_dateAsString,end_dateAsStringDimcombo_strAsString,bm_strAsString,lx_strAsString"begin_date:开始日期(字符型)end_date:结束日期(字符型)"combo_str:组合字符串(字符型)bm_str:部门字符串(字符型)lx_str:类型字符串(字符型) PrivateSubForm_Load()"表单的初始化事件"1:生成部门列表框ComboBM.ClearComboBM.AddItem("所有部门")AdoBM.RefreshWhileAdoBM.Recordset.EOF<>TrueComboBM.AddItem(AdoBM.Recordset.Fields("bm"))AdoBM.Recordset.MoveNextWendComboBM.ListIndex=0"2:生成类型列表框ComboLX.ClearComboLX.AddItem("所有类型")AdoLX.RefreshWhileAdoLX.Recordset.EOF<>TrueComboLX.AddItem(AdoLX.Recordset.Fields("lx"))AdoLX.Recordset.MoveNextWendComboLX.ListIndex=0"3:初始化日期值DT结束日期.Value=DateDT开始日期.Value=Date-DT结束日期.DayOfWeek+1begin_date=CStr(DT开始日期.Value)end_date=CStr(DT结束日期.Value)DT结束日期.MaxDate=Data"4:生成表格数据 AdoGrid.RecordSource="selectbm,xm,lx,count(*)as次数fromygba,kqlxbb,kqglbcwherekqrq>=""+begin_date+""andkqrq<=""+end_date+""anda.bh=c.ygbhandb.bh=c.lxbhgroupbybm,xm,lxorderbybm,xm"AdoGrid.Refresh"5:其他变量的初始化combo_str="00""全部部门,全部类型bm_str=""lx_str=""EndSubPrivateSubcmdcount_Click()"统计按钮的单击事件SelectCasecombo_strCase"00""全部部门,全部类型AdoGrid.RecordSource="selectbm,xm,lx,count(*)as次数fromygba,kqlxbb,kqglbcwherekqrq>=""+begin_date+""andkqrq<=""+end_date+""anda.bh=c.ygbhandb.bh=c.lxbhgroupbybm,xm,lxorderbybm,xm"Case"10""某一部门,全部类型AdoGrid.RecordSource="selectbm,xm,lx,count(*)as次数fromygba,kqlxbb,kqglbcwherebm=""+bm_str+""andkqrq>=""+begin_date+""andkqrq<=""+end_date+""anda.bh=c.ygbhandb.bh=c.lxbhgroupbybm,xm,lxorderbybm,xm"Case"01""全部部门,某一类型AdoGrid.RecordSource="selectbm,xm,lx,count(*)as次数fromygba,kqlxbb,kqglbcwherelx=""+lx_str+""andkqrq>=""+begin_date+""andkqrq<=""+end_date+""anda.bh=c.ygbhandb.bh=c.lxbhgroupbybm,xm,lxorderbybm,xm" Case"11""某一部门,某一类型AdoGrid.RecordSource="selectbm,xm,lx,count(*)as次数fromygba,kqlxbb,kqglbcwherebm=""+bm_str+""andlx=""+lx_str+""andkqrq>=""+begin_date+""andkqrq<=""+end_date+""anda.bh=c.ygbhandb.bh=c.lxbhgroupbybm,xm,lxorderbybm,xm"EndSelectAdoGrid.RefreshEndSubPrivateSubcmdexit_Click()"退出按钮"退出按钮的单击事件UnloadMeEndSubPrivateSubComboBM_Click()IfComboBM.ListIndex=0Then"全部部门bm_str="""清空部门名称combo_str="0"+Mid(combo_str,2,1)Elsebm_str=Trim(ComboBM.Text)"保存部门名称combo_str="1"+Mid(combo_str,2,1)EndIfEndSubPrivateSubComboLX_Click()IfComboLX.ListIndex=0Then"全部类型lx_str="""清空类型名称 combo_str=Mid(combo_str,1,1)+"0"Elselx_str=Trim(ComboLX.Text)"保存类型名称combo_str=Mid(combo_str,1,1)+"1"EndIfEndSubPrivateSubDT结束日期_Change()end_date=CStr(DT结束日期.Value)EndSubPrivateSubDT开始日期_Change()begin_date=CStr(DT开始日期.Value)EndSub