课程设计论文-基于VB的考勤管理系统设计.doc_第1页
课程设计论文-基于VB的考勤管理系统设计.doc_第2页
课程设计论文-基于VB的考勤管理系统设计.doc_第3页
课程设计论文-基于VB的考勤管理系统设计.doc_第4页
课程设计论文-基于VB的考勤管理系统设计.doc_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

考勤管理系统1.1系统设计1.1.1系统的设计目标考勤管理系统的总体任务是实现考勤管理的规范化、考勤数据统计的自动化。系统的设计目标即是完成这一任务。1.1.2设计思想系统应尽量结合单位现有的软硬件环境,充分利用现有资源。所以本系统除了要能够手工录入员工的考勤记录外,还应能够与考勤机相结合,实现考勤信息录入自动化。系统的考勤类型应能够灵活设定,以便用户随时调整。系统应具备报表功能,查询统计时能够直接生成相关员工的考勤报表,报表要能够导出、打印。系统应该具备数据库维护功能,能够让用户进行数据表的备份和恢复。系统应采用模块化程序设计,便于功能的组合与修改,以及以后尽可能进行补充。综合考虑,确定本系统使用c/s工作模式,以oracle作为后台数据库,visual basic 6.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.11.3所示。表1.1考勤类型表格kqlxb字段数据类型能否为空备注bhvarchar2(4)not null类型编号(主键)lxvarchar2(20)null类型名称表1.2员工信息表格ygb字段数据类型能否为空备注bhvarchar2(8)not null员工编号(主键)xmvarchar2(12)not null员工姓名xbvarchar2(2)not null员工性别bmvarchar2(20)null员工部门表1.3考勤管理表格kqglb字段数据类型能否为空备注kqrqdatenot null考勤日期(主键1)ygbhvarchar2(8)not null员工编号(主键2)(指向员工信息表bh字段的外键)lxbhvarchar2(4)not null类型编号(指向考勤类型表bh字段的外键)bzvarchar2(20)null备注1.3设计系统的界面1.3.1窗口的设计 经过构细,本系统需要创建五个窗口:考勤管理系统登录窗口、考勤类型管理窗口、员工信息管理窗口、考勤情况录入窗口、考勤信息统计窗口1. 考勤管理系统登录窗口运行界面2. 考勤管理系统登录窗口设计界面主要事件与代码:private sub form_resize() image1.width = me.width image1.height = me.height label1.left = (me.width) / 2 - label1.width / 2 label2.left = (me.width) / 2 - label2.width / 2 label3.left = (me.width) / 2 - label3.width / 2end subprivate sub toolbar1_buttonclick(byval button as mscomctllib.button)select case button.keycase bt2frm_yggl.show , mecase bt3frm_kqlx.show , mecase bt4frm_kqlr.show , mecase bt5frm_kqtj.show , meend selectend sub3. 员工信息管理窗口运行界面4. 员工信息管理窗口设计界面属性设置:1. frm_yggl的属性设置属性名值含义caption员工信息管理borderstyle1fixed singlestartupposition1所有者中心2. combo1的属性设置style2dropdown listlist男 女lockedtrue3. datagrid1的属性设置datasourceadodc14. text1-text3的属性设置lockedtrue主要事件与代码:dim add_flag as boolean, modify_flag as booleanprivate sub adodc1_movecomplete(byval adreason as adodb.eventreasonenum, byval perror as adodb.error, adstatus as adodb.eventstatusenum, byval precordset as adodb.recordset) if adodc1.recordset.recordcount 0 then text1.text = adodc1.recordset.fields(bh) & text2.text = adodc1.recordset.fields(xm) & text3.text = adodc1.recordset.fields(bm) & if adodc1.recordset.fields(xb) = 男 then combo1.listindex = 0 else combo1.listindex = 1 end if else text1.text = text2.text = text3.text = combo1.listindex = 0 call showbuttons end if end subprivate sub cmdadd_click()text1.text = text2.text = text3.text = text1.locked = falsetext2.locked = falsetext3.locked = falsecombo1.locked = falsedatagrid1.enabled = falseadd_flag = truecall showbuttonsend subprivate sub cmdcancle_click() if adodc1.recordset.recordcount 0 then text1.text = adodc1.recordset.fields(bh) & text2.text = adodc1.recordset.fields(xm) & text3.text = adodc1.recordset.fields(bm) & if adodc1.recordset.fields(xb) = 男 then combo1.listindex = 0 else combo1.listindex = 1 end ifelse text1.text = text2.text = text3.text = combo1.listindex = 0 end if text1.locked = true text2.locked = true text3.locked = true combo1.locked = true datagrid1.enabled = true add_flag = false modify_flag = false call showbuttonsend subprivate sub cmddelete_click()ret = msgbox(你真的要删除 + adodc1.recordset.fields(xm) + 的记录吗?, vbyesno + vbquestion + vbdefaultbutton2, 提示)if ret = vbyes then adodc1.recordset.delete adodc1.recordset.updateend ifdatagrid1.setfocusend subprivate sub cmdexit_click()unload meend subprivate sub cmdmodify_click()text1.locked = falsetext2.locked = falsetext3.locked = falsecombo1.locked = falsedatagrid1.enabled = falsemodify_flag = truecall showbuttonsend subprivate sub cmdsave_click()text1.text = trim(text1.text)text2.text = trim(text2.text)text3.text = trim(text3.text)if is_data_ok() = false then exit subend ifin_bh = text1.textin_xm = text2.textin_xb = combo1.textin_bm = text3.textif add_flag = true then adodc1.recordset.addnewend ifadodc1.recordset.fields(bh) = in_bhadodc1.recordset.fields(xm) = in_xmadodc1.recordset.fields(xb) = in_xbadodc1.recordset.fields(bm) = in_bmadodc1.recordset.updateif add_flag = true then adodc1.recordset.find bh= + in_bh + , , adsearchforward, 1end iftext1.locked = truetext2.locked = truetext3.locked = truecombo1.locked = truedatagrid1.enabled = trueadd_flag = falsemodify_flag = falsecall showbuttonsdatagrid1.setfocusend subprivate sub form_load()add_flag = falsemodify_flag = falsecall showbuttonsend subprivate sub showbuttons()if add_flag = false and modify_flag = false thencmdadd.enabled = trueif adodc1.recordset.recordcount = 0 then cmdmodify.enabled = false cmddelete.enabled = falseelse cmdmodify.enabled = true cmddelete.enabled = trueend ifcmdexit.enabled = truecmdcancle.enabled = falsecmdsave.enabled = falseelsecmdadd.enabled = falsecmdmodify.enabled = falsecmddelete.enabled = falsecmdexit.enabled = falsecmdcancle.enabled = truecmdsave.enabled = trueend ifend subprivate sub form_queryunload(cancel as integer, unloadmode as integer)if add_flag = true or modify_flag = true then msgbox (数据正在编辑,不能退出!) cancel = trueend ifend subprivate sub text1_keypress(keyascii as integer)if (keyascii 57) and keyascii 8 then keyascii = 0end ifend subprivate function is_data_ok() as booleanif modify_flag = true then old_bh = adodc1.recordset.fields(bh)end ifif len(text1.text) 8 then msgbox (编号的长度不够!) is_data_ok = false text1.setfocus exit functionend ifif len(text2.text) = 0 then msgbox (姓名未输入!) is_data_ok = false text2.setfocus exit functionend ifif add_flag = true then adodc2.recordsource = select * from ygb where bh= + text1.text + adodc2.refresh else adodc2.recordsource = select * from ygb where bh= + text1.text + and bh + old_bh + adodc2.refreshend ifif adodc2.recordset.recordcount 0 then msgbox (编号有重复!) is_data_ok = false text1.setfocus exit functionend ifis_data_ok = trueend function5. 考勤情况录入窗口运行界面6. 考勤情况录入窗口设计界面属性设置:1. frm_kqlr的属性设置属性名值含义caption考勤情况录入borderstyle1fixed singlestartupposition1所有者中心2.数据源adodc的设置adodc1名称adodatagridadodc2名称adokqglbadodc3名称adokqlxbadodc4名称adoygb2. 下拉框combo的属性设置combo1名称comboygb生成员工列表combo2名称combokqlxb生成考勤类型列表lockedtruestyle2dropdown list3. datagrid1的属性设置datasourceadodatagrid4. text1的属性设置lockedtrue主要事件与代码: dim add_flag as boolean, modify_flag as boolean dim ygb_rec as integer, lxb_rec as integer dim kq_date as string add_flag:增加状态标志(布尔型) modify_flag:修改状态标志(布尔型) ygb_rec:员工表记录总数(数值型) lxb_rec:类型表记录总数(数值型) kq_date:考勤的日期(类型是字符型) private sub adodatagrid_movecomplete(byval adreason as adodb.eventreasonenum, byval perror as adodb.error, adstatus as adodb.eventstatusenum, byval precordset as adodb.recordset) if adodatagrid.recordset.recordcount 0 then 数据表内容不为空 comboygb.text = adodatagrid.recordset.fields(员工) & combokqlxb.text = adodatagrid.recordset.fields(类型) & text1.text = adodatagrid.recordset.fields(bz) & end if end sub private sub cmdadd_click() 增加按钮 增加按钮的单击事件 1:生成员工的增加列表框 call formyglist(kq_date, add) 2:文本框、组合框解锁 text1.text = 文本框清空 text1.locked = false 取消对象的只读 comboygb.locked = false combokqlxb.locked = false comboygb.listindex = 0 combokqlxb.listindex = 0 3:锁定表格、日期不能动 datagrid1.enabled = false 锁定表格 dtpicker1.enabled = false 锁定日期 4:设置表单状态 add_flag = true 设置为增加编辑状态 call showbuttons 刷新按钮状态 comboygb.setfocus end sub private sub cmdmodify_click() 修改按钮 修改按钮的单击事件 1:文本框、组合框解锁 text1.locked = false 取消对象的只读 combokqlxb.locked = false 2:锁定表格、日期不能动 datagrid1.enabled = false 锁定表格 dtpicker1.enabled = false 锁定日期 3:设置表单状态 modify_flag = true 设置为修改编辑状态 call showbuttons 刷新按钮状态 combokqlxb.setfocus end sub private sub cmdcancle_click() 取消按钮 取消按钮的单击事件 1:生成员工的浏览列表 call formyglist(kq_date, browse) 2:恢复数据,并设置文本框、下拉框对象只读 if adodatagrid.recordset.recordcount 0 then 数据表内容不为空 comboygb.text = adodatagrid.recordset.fields(员工) & combokqlxb.text = adodatagrid.recordset.fields(类型) & text1.text = adodatagrid.recordset.fields(bz) & end if comboygb.locked = true 设置对象的只读 combokqlxb.locked = true 3:表格、日期控件可以动 datagrid1.enabled = true 取消锁定表格 dtpicker1.enabled = true 取消锁定日期 4:修改表单的状态 add_flag = false 设置为非增加状态 modify_flag = false 设置为非修改状态 call showbuttons 刷新按钮状态 datagrid1.setfocus end sub private sub cmdsave_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:数据保存 if add_flag = true then 增加数据 adokqglb.recordset.addnew else 修改数据 adokqglb.recordset.find kqrq= + in_date, , adsearchforward, 1 adokqglb.recordset.find ygbh= + mid(in_yg, 1, 8) + , , adsearchforward 定位记录 end if adokqglb.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 保存到后台数据库 call formyglist(kq_date, browse) adokqglb.refresh 数据源刷新 adodatagrid.refresh 表格刷新 adodatagrid.recordset.find 员工= + in_yg + , , adsearchforward - 3:保存的后续工作(设置对象只读、取消表格日期锁定、设置表单状态) text1.locked = true 设置对象的只读 comboygb.locked = true combokqlxb.locked = true datagrid1.enabled = true 取消锁定表格 dtpicker1.enabled = true 取消日期锁定 add_flag = false 设置为非增加状态 modify_flag = false 设置为非修改状态 call showbuttons 刷新按钮状态 datagrid1.setfocus end sub private sub cmdexit_click() 退出按钮 退出按钮的单击事件 unload me end sub private sub form_load() 表单的初始化事件 1:生成日期信息,考勤日期默认为今天的日期 with dtpicker1 .year = year(date) .month = month(date) .day = day(date) .customformat = yyyy年mm月d日 dddd 设置日期格式 end with kq_date = cstr(date) 2:生成数据集-kqglb with adokqglb 与kqglb表关联 .connectionstring = provider=oraoledb.oracle.1;password=xscj1234;persist security info=true;user id=system;data source=xscj .commandtype = adcmdtext .recordsource = select * from kqglb order by kqrq .refresh end with - 3:生成数据集-kqlxb with adokqlxb 与kqlxb表关联 .connectionstring = provider=oraoledb.oracle.1;password=xscj1234;persist security info=true;user id=system;data source=xscj .commandtype = adcmdtext .recordsource = select bh| |lx as 类型 from kqlxb order by bh .refresh end with lxb_rec = adokqlxb.recordset.recordcount 保存类型表数据集记录总数 生成combokqlxb列表(列表格式:类型编号+名称) while adokqlxb.recordset.eof true combokqlxb.additem (adokqlxb.recordset.fields(类型) adokqlxb.recordset.movenext wend if lxb_rec 0 then 类型表非空 combokqlxb.listindex = 0 end if - 4:生成数据集-ygb with adoygb 与ygb表关联 .connectionstring = provider=oraoledb.oracle.1;password=xscj1234;persist security info=true;user id=system;data source=xscj .commandtype = adcmdtext .recordsource = select * from ygb .refresh end with ygb_rec = adoygb.recordset.recordcount 保存员工表数据集的记录总数 call formyglist(kq_date, browse) 生成今天的考勤员工浏览列表 - 5:生成表格的数据集 with adodatagrid 与表单的datagrid1表格相关联 .connectionstring = provider=oraoledb.oracle.1;password=xscj1234;persist security info=true;user id=system;data source=xscj .commandtype = adcmdtext .recordsource = select kqrq,ygbh| |xm as 员工,b.bh| |lx as 类型,bz from ygb a,kqlxb b,kqglb c where kqrq= + kq_date + and a.bh=c.ygbh and b.bh=c.lxbh order by a.bh .refresh end with - add_flag = false 设置表单为非增加状态 modify_flag = false 设置表单为非修改状态 call showbuttons 刷新按钮状态 end sub private sub form_queryunload(cancel as integer, unloadmode as integer) 表单退出前发生的事件 if add_flag = true or modify_flag = true then msgbox (正在编辑,不能退出!) cancel = true end if end sub private sub dtpicker1_change() 日期改变时发生的事件 kq_date = cstr(dtpicker1.year) + - + cstr(dtpicker1.month) + - + cstr(dtpicker1.day) 新日期 call formyglist(kq_date, browse) 重新生成员工下拉列表 with adodatagrid .recordsource = select kqrq,a.bh| |xm as 员工,b.bh| |lx as 类型,bz from ygb a,kqlxb b,kqglb c where kqrq= + kq_date + and a.bh=c.ygbh and b.bh=c.lxbh order by kqrq .refresh 数据源刷新(表格数据刷新) end with call showbuttons 刷新按钮状态 datagrid1.setfocus end sub private sub showbuttons() 自定义过程,作用:控制按钮的显示 if add_flag = false and modify_flag = false then 数据浏览状态(非增加、非修改) if ygb_rec = 0 or lxb_rec = 0 then 员工表或考勤类型表内容为空 cmdadd.enabled = false else if adodatagrid.recordset.recordcount = ygb_rec then 所有员工的考勤信息已录入 cmdadd.enabled = false else cmdadd.enabled = true end if end if if adodatagrid.recordset.recordcount 0 then 表格数据集非空 cmdmodify.enabled = true else 表格数据集为空 cmdmodify.enabled = false end if cmdsave.enabled = false cmdcancle.enabled = false cmdexit.enabled = true else 数据编辑状态(增加、修改) cmdadd.enabled = false cmdmodify.enabled = false cmdexit.enabled = false cmdsave.enabled = true cmdcancle.enabled = true end if end sub private sub formyglist(byval list_date as string, byval oper_mode as string) 自定义函数,作用是形成员工的下拉列表 形参1:list_date,日期型变量,表示考勤的日期 形参2:oper_mode,字符型变量,表示操作的模式(增加模式:add 浏览模式:browse) with adoygb if oper_mode = add then 增加操作模式 .recordsource = select bh| |xm as 员工 from ygb where bh not in (select ygbh from kqglb where kqrq= + list_date + ) order by bh else 浏览操作模式 .recordsource = select bh| |xm as 员工 from ygb where bh in (select ygbh from kqglb where kqrq= + list_date + ) order by bh end if .refresh end with 生成comboygb列表(格式:员工编号+姓名) comboygb.clear 清除列表 while adoygb.recordset.eof true comboygb.additem (adoygb.recordset.fields(员工) adoygb.recordset.movenext wend end sub7. 考勤类型管理窗口运行界面8. 考勤类型管理窗口设计界面 主要事件与代码:dim add_flag as boolean, modify_flag as booleanprivate sub adodc1_movecomplete(byval adreason as adodb.eventreasonenum, byval perror as adodb.error, adstatus as adodb.eventstatusenum, byval precordset as adodb.recordset)if adodc1.recordset.recordcount 0 then text1.text = adodc1.recordset.fields(bh) & text2.text = adodc1.recordset.fields(lx) & else text1.text = text2.text = call showbuttonsend ifend subprivate sub showbuttons()if add_flag = false and modify_flag = false thencmdadd.enabled = trueif adodc1.recordset.recordcount = 0 then

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论