人力资源管理系统
更新时间:2024-03-29 18:28:01 阅读量: 综合文库 文档下载
第2章 人力资源管理系统
随着市场竞争的日趋激烈,人才成为实现企业自身战略目标的一个非常关键的因素。企业中人心的向背和员工对工作的投入程度在很大程度上决定了该企业的兴衰与成败。如何保持本企业员工的工作责任感,激励他们的工作热情,减少人才流失,已成为困扰企业主管和人力资源经理的一个日益尖锐的问题,可以说,企业管理从根本上来讲就是对人的管理。现在“公平、公正、合理”的企业管理原则已为不少企业所采纳。但是要真正实现“公平、公正、合理”决非易事,它不是仅靠规章制度和政策就可以解决的。通过建立透明、相容、一致、易查和全面的人力资源信息系统,将与人相关的信息统一地管理起来,才有可能为“公平、公正、合理”原则的实现,以及企业在运作和劳资纠纷等方面的风险规避等建立一套科学的保障体系。
本章将为读者全面剖析人力资源管理的内容,由此得出人力资源管理系统的需求分析和数据建模,并最终演示如何利用Microsoft Access完成系统的制作。
2.1 人力资源管理
如图2.1所示,人力资源管理工作由若干相互联系的任务所组成。在安排与执行这些任务时,负有人力资源管理责任的所有人员,都必须考虑法律、政治、经济、社会、文化和技术等各因素的影响。
图2.1 人力资源管理工作的内容
第2章 人力资源管理系统 77 2.1.1 人力资源管理的任务
人力资源管理工作的主要任务有: ? 进行人力资源规划和分析。 ? 贯彻平等就业机会原则。 ? 聘任员工。
? 从事人力资源开发。 ? 确定报酬和福利。 ? 处理员工与劳资关系。
人力资源规划和分析包括几方面的任务。在进行人力资源规划的过程中,经理人员将预计未来影响劳动力供求的有关因素。人力资源分析要求具备各种相关信息资料、通信系统和评价体系,它们是从事协调人力资源工作所不可或缺的部分。
政府在遵从平等就业机会法规方面的要求,无疑将对人力资源管理工作产生重大影响。例如企业在进行战略性人力资源规划时,为贯彻在雇用少数种族成员和妇女方面的赞助性行动的要求,就必须为雇用各种各样的雇员留有充分的余地。另外,在招聘、选拔和培训人员时,所有经理人员都必须遵守平等就业机会法规的要求。
聘任员工指选择适合标准要求的相应数量的人员,来填补企业的岗位空缺。职务分析是聘任工作的基础。根据职务分析所得出的结论,就可以准备职责说明书和职务要求细则,这两项都是在招聘中需使用的材料。在人员选拔过程中,应特别注重选择最符合要求的员工来填补企业的岗位空缺。
员工培训与人力资源开发工作包括向新雇员介绍企业的各种情况、对现有员工进行职业技能培训、鼓励和帮助员工在多方面提高和发展等内容。在职务不断演化和改变的环境下,为适应技术的变化,企业就必须对员工进行培训和再培训。此外,为迎接未来的挑战,还必须鼓励各级负责人、管理者和所有员工不断有所发展和提高。为此企业一般都会制定员工职业发展计划,这种计划的目的,是为那些在企业内寻求自我发展的员工设计出发展的路径,并安排为此所需要的有关活动。为了提高员工的工作成效,企业还应对员工的工作表现进行考核,以确定员工的本职工作究竟做得怎么样。
报酬就是通过薪金、奖励和福利等方式来回报为企业工作的员工。企业必须认真设计和不断完善基本工资和薪酬制度。除工薪以外,越来越多的企业还制定了某些奖励计划,例如利润分享和工作奖励等。但是另一方面,快速增长的福利费用,特别是扶摇直上的医疗保健费用,仍将继续是一个值得认真思考和对待的重大问题。
如果员工和企业双方都想联手共创繁荣,那么管理者和员工就必须卓有成效地处理双方的关系。不论员工是否由工会来代表,企业都必须重视与员工健康、人身安全和财物保障有关的各项工作。为促成企业与员工的良好关系,企业还必须保障员工的各种权利。另外为了使员工如同管理者那样准确地了解企业对员工的期望,企业还必须制定、传达和不断更新人力资源政策和规则。在有工会的企业中,企业还应重视和处理好资方和工会的关系。
78 Access数据库开发经典案例解析 2.1.2 人力资源管理系统的作用
人力资源管理系统是建立在先进的软件和高速、大容量的硬件基础上的新的人力资源管理模式,通过集中式的信息库、自动处理信息、员工自助服务、外协以及服务共享,达到降低成本、提高效率、改进员工服务模式的目的。它通过与企业现有的网络技术相联系,保证人力资源与日新月异的技术环境同步发展。一般来说,可以分四个部分来理解人力资源管理系统。
1.管理人员角色和目标的改变
在传统的人力资源管理中,管理人员的很大一部分精力将耗费在繁琐的日常行政事务处理上,而作为企业管理层的参谋角色应该做的咨询和策略制定的工作相对缺乏。通过人力资源管理系统,管理人员将可以将绝大部分精力放在为管理层提供咨询、建议上,而在行政事务上的工作可以由电子化系统完成,只需占用人力资源管理人员极少的精力和时间。
2.提供更好的服务
人力资源管理系统可以迅速、有效地收集各种信息,加强内部的信息沟通。各种用户可以直接从系统中获得自己所需的各种信息,并根据相关的信息做出决策和相应的行动方案。
3.降低成本
人力资源管理系统通过减少人力资源管理工作的操作成本、降低员工流动率、减少通信费用等达到降低企业运作成本的目的。
4.革新管理理念
人力资源管理系统的最终目的是革新企业的管理理念而不仅仅是改进管理方式,优化人力资源管理。先进技术应用于人力资源管理不仅仅是为了将现有的人力资源管理工作做得更好,更重要的是,做些对于企业来讲更有效率的事情,成为管理层的决策支持者,为决策提供信息和解决方案。
2.1.3 人力资源管理系统发展历史
人力资源管理系统的发展历史可以追溯到20世纪60年代末期。由于当时计算机技术已经进入实际应用阶段,同时大型企业用手工方式来计算和发放薪资既费时费力又非常容易出差错,为了解决这个矛盾,第一代的人力资源管理系统应运而生。当时由于技术条件和需求的限制,用户非常少,而且那种系统充其量也只不过是一种自动计算薪资的工具,既不包含非财务的信息,也不包含薪资的历史信息,几乎没有报表生成功能和薪资数据分析功能。但是,它的出现为人力资源的管理展示了美好的前景,即用计算机的高速度和自动化来替代手工的巨大工作量,用计算机的高准确性来避免手工的错误和误差,使大规模集中处理大型企业的薪资成为可能。
第二代的人力资源管理系统出现于20世纪70年代末。由于计算机技术的飞速发展,无论是计算机的普及性,还是计算机系统工具和数据库技术的发展,都为人力资源管理
第2章 人力资源管理系统 79 系统的阶段性发展提供了可能。第二代人力资源管理系统基本上解决了第一代系统的主要缺陷,对非财务的人力资源信息和薪资的历史信息都给予了考虑,其报表生成和薪资数据分析功能也都有了较大的改善。但这一代的系统主要是由计算机专业人员开发研制的,未能系统地考虑人力资源的需求和理念,而且其非财务的人力资源信息也不够系统和全面。
人力资源管理系统的革命性变革出现在20世纪90年代末。由于市场竞争的需要,如何吸引和留住人才,激发员工的创造性、工作责任感和工作热情已成为关系企业兴衰的重要因素,人才已经成为企业最重要的资产之一。“公正、公平、合理”的企业管理理念和企业管理水平的提高,使社会对人力资源管理系统有了更高的需求;同时由于个人电脑的普及,数据库技术、客户/服务器技术,特别是Internet技术的发展,使第三代人力资源管理系统的出现成为必然。第三代人力资源管理系统的特点是从人力资源管理的角度出发,用集中的数据库将几乎所有与人力资源相关的数据(如薪资福利、招聘、个人职业生涯的设计、培训、职位管理、绩效管理、岗位描述、个人信息和历史资料)统一管理起来,形成了集成的信息源。友好的用户界面、强有力的报表生成工具、分析工具和信息的共享使人力资源管理人员得以摆脱繁重的日常工作,集中精力从战略的角度来考虑企业人力资源规划和政策。
2.2 人力资源管理系统需求分析
根据以上对人力管理内容和人力资源管理系统的分析,一个标准的人力资源管理系统应该包括如图2.2所示的几大功能。除此之外系统还应包括信息系统必须具备的通用功能,例如系统管理、权限设置、数据备份与恢复等,这些功能的具体实现方法可以参考第1章的相关内容。
人力资源管理系统 机构编制管理人员信息管理人事档案管理考勤管理薪资福利管理社会保障管理招聘管理合同管理查询统计管理系统管理 其中每个功能都由若干相关联的子功能模块组成。
2.2.1 机构编制管理
“机构编制管理”功能模块用于设置企业的组织机构,所包含的功能模块如图2.3所示。
图2.2 人力资源管理系统应包括的基本功能
80 Access数据库开发经典案例解析 机构编制管理 机构设置及编码机构详细信息 图2.3 “机构编制管理”功能模块
对于大型企业、集团公司等用户,组织机构往往非常复杂,总公司下属可能有多级子公司,子公司下又设置有各种部门,因此机构编制管理必须可以灵活地定义这些层次和属性,同时对应机构的编码应可以根据所从属的上级机构自动生成,如图2.4所示。
“机构详细信息”功能模块用于管理对应组织机构的详细信息,包括这些机构的地址、联系方法、隶属关系、单位级别、主管单位名称、单位性质、经济类型、所属行业、企业类型、单位负责人、附属关系、社会保险登记证号、失业保险缴费起始时间、缴费终止时间等信息。
图2.4 机构设置及编码
第2章 人力资源管理系统 81 2.2.2 人员信息管理
“人员信息管理”功能模块用于管理和查询企业员工的相关信息,所包含的功能模块如图2.5所示。
人员信息管理 职员基本信息职员教育经历职员个人简历行政党派职务职员离职登记职员岗位变更职员离退休登记“职员基本信息”模块用于输入、修改和查询员工的信息,包括职员编号、姓名、姓名简码、曾用名、性别、出生日期、籍贯、出生地、民族、文化程度、毕业学校、健康状况、婚姻状况、职员类型、现任职务编号、职称、本人成分、参加工作时间、进入本系统工作时间、现身份起始时间、连续工龄、用工形式、用工期限、政治面貌、参加党派时间、职业类别、现从事专业、享受待遇级别、户口所在地、户口性质、身份证号码、港澳台侨属标识、干部录聘来源、干部选聘审批单位、干部录聘时间、减员方式、减员时间、公务员录用来源、公务员特殊考试标识、进入跨地域标识、公务员录用时间、所属部门编号、年龄、入职方式、聘任日期、转正时间、工作岗位、社会保障号码、简历文件、照片文件、家庭地址、邮编、家庭电话、办公电话、手机、寻呼机、电子邮件地址、工作描述、工作证件号码、职工帐号、备注等。
“职员教育经历”模块用于输入、修改和查询员工的学历信息,包括职员编号、学历、所学专业、入学时间、学习形式、学制、毕肄业时间、毕肄业学校及单位、学位、学位授予时间、学位授予国家地区、学位授予单位、备注等。
“职员个人简历”模块用于输入、修改和查询员工的工作简历,包括职员编号、起始时间、终止时间、所在单位、从事工作或担任职务、证明人、备注等。
“行政党派职务”模块用于输入、修改和查询员工的党派及党内职务信息,包括职员编号、职务编号、职务类别、职务名称、任职时间、任职单位、任职方式、任职原因、任职文号、职务级别、职位分类、任职批准单位、职务变动类别、当前任职状况、主管或从事工作、免职时间、免职方式、免职原因、免职文号、免职批准单位、职务生效时间、降职原因、在下一级任职年限、职务属性、职员等级、备注等。
“职员离职登记”模块用于输入、修改和查询员工的离职记录,包括职员编号、离职前部门、离职前职务、离职日期、离职原因、离职手续办理、人事主管意见、审批情况等。
图2.5 “人员信息管理”功能模块
82 Access数据库开发经典案例解析 “职员岗位变更”模块用于输入、修改和查询员工的岗位变更记录,包括职员编号、职务调动日期、调动前部门编号、调动前部门名称、调动前职务名称、调动后部门编号、调动后部门名称、调动后职务名称、调动原因、调动类型、人事部门意见、审批情况等。
“职员离退休登记”模块用于输入、修改和查询员工的离退休记录,包括职员编号、离退类别、离退休时间、离退休后享受级别、离退休费支付单位、离退休后管理单位、异地安置、返聘情况、异地安置时间、死亡时间、离退休费、备注等。
2.2.3 人事档案管理
“人事档案管理”功能模块用于管理和查询企业员工人事档案的相关信息,所包含的功能模块如图2.6所示。
人事档案管理 存入档案管理档案查询申请档案查询审批档案查询情况转出档案管理档案库存管理人事档案借用“存入档案管理”模块用于输入员工的档案信息,包括档案编号、职员编号、档案类型、档案存放位置、档案存放项目、档案存入日期等。该模块不能修改已输入的档案的信息。
“档案查询申请”模块用于填写档案查询申请,内容包括查询人姓名、查询人身份证件、档案编号、查询事由、查询日期、审批情况等。
“档案查询审批”模块用于对前面的填写的查询申请进行审批,决定是否同意查询。 “档案查询情况”模块用于记录档案查看的历史,可以在该模块中查询到何人在何时查询了谁的档案。
“转出档案管理”模块用于将员工的档案转出,填写的内容包括档案编号、转出日期、转出目的地、转出事由等。
“档案库存管理”模块用于修改和查询员工的档案信息。
“人事档案借用”模块用于输入、修改和查询员工档案的借出、借入信息,包括档案编号、借用类型(借入、借出)、借用日期、源目的单位、借用事由等。
2.2.4 考勤管理
“考勤管理”功能模块用于管理和查询企业员工的工作出勤情况,包含的功能模块如图2.7所示。该功能一般和考勤机配套使用,员工的上、下班时间自动记录并转入系统中,
图2.6 “人事档案管理”功能模块
第2章 人力资源管理系统 83 当然在系统中也提供人工录入的功能,这样即便没有使用考勤机也可以使用该功能。
考勤管理 刷卡记录管理形成考勤信息月考勤统计表加班管理请假管理休假管理 “刷卡记录管理”模块用于输入和查询员工的每天上、下班时间记录,内容包括日期、职员编号、刷卡时间等。这些信息一般由考勤机自动读入,不使用考勤机的也可以在该功能模块中人工录入。
“形成考勤信息”模块用于将刷卡记录生成考勤信息,内容包括日期、职员编号、上班刷卡时间、下班刷卡时间、出勤属性、是否迟到、是否早退、是否旷工、迟到时间、早退时间、加班时间等。刷卡记录中记录的仅仅是职员刷卡的时间,该功能根据一天中不同时间的刷卡记录自动生成考勤信息。
“月考勤统计表”模块用于统计员工指定月份的出勤信息,包括日期,职员编号,迟到次数,早退次数,旷工次数,请假次数,加班时间等。
“加班管理”模块用于输入和查询员工的加班信息,包括职员编号、加班类型、加班日期、加班开始时间、加班结束时间、加班时数、加班原因、审批情况等。
“请假管理”模块用于输入和查询员工的请假信息,包括职员编号、请假类型、请假日期、请假开始时间、请假结束时间、请假时数、请假原因、审批情况等。
“休假管理”模块用于输入和查询员工的加班信息,包括职员编号、休假类型、休假日期、休假开始时间、休假结束时间、休假时数、休假原因、审批情况等。
2.2.5 薪资福利管理
“薪资福利管理”功能模块用于管理企业员工的薪资和福利,所包含的功能模块如图2.8所示。
薪资福利管理 图2.7 “考勤管理”功能模块
当月工资管理个人所得税率发放工资历史职员绩效考核职员奖励管理职员惩罚管理 图2.8 “薪资福利管理”功能模块
84 Access数据库开发经典案例解析 “当月工资管理”模块用于计算给员工当月的工资,内容包括日期、月份、职员编号、基本工资、浮动工资、合同补、粮副补、洗理费、车餐费、水电煤补、书报费、房补、利息、临时补、职务工资、工龄工资、考核工资、加班费、物价津贴、交通津贴、伙食津贴、医疗补贴、高温津贴、奖金、福利、高职补、独子补、差额补、电话补、应发金额合计、房租、水电费、请假扣除、考勤扣除、罚款、工会费、住房公积金、医疗保险、养老保险、失业保险、生育保险、工伤保险、利息税、应扣金额合计、工资合计、个人所得税、实发金额、职工帐号、是否发放、工资类型等。第一次使用该功能时员工的基本薪资信息,例如基本工资、各种补贴和各种保险等,需要人工输入,输入无误后通过系统可以自动计算出应发金额合计、应扣金额合计、工资合计、个人所得税及实发金额等数据。因为薪资的大部分项目对于个人来说基本是一致的,所以以后月份的工资计算可以将历史的数据直接导入,需要修改的地方单独调整就可以了。该功能还可以进行工资发放的操作,确定工资已发放并制作工资条。关于各种保险的计算方法,请参阅2.2.6节。
“个人所得税率”模块用于设置个人所得税的税率,这样系统可以自动算出个人应缴纳的税金并自动扣除。该功能设置的内容包括级数、不计税工资、工资下限、工资上限、个人所得税率、速算扣除数、备注等。
小知识 个人所得税的计算方法
个人所得税的税率包括三种,其中工资、薪金所得按月征收,对每月收入超过800元以上的部分征税,使用分级超额累进税率。例如税率表如表2.1所示。
表2.1 个人薪资税率表
级数 1 2 3 4 5 6 7 8 9
应纳税所得额(月) 不超过500元部分 超过500元~2000元部分 超过2000~5000元部分 超过5000~20000元部分 超过20000~40000元部分 超过40000~60000元部分 超过60000~80000元部分 超过80000~100000元部分 超过100000元部分
税率% 5 10 15 20 25 30 35 40 45
速算扣除数 0 25 125 375 1375 3375 6375 10375 15875
“发放工资历史”模块用于查询历史发放工资的记录。
“职员绩效考核”模块用于管理员工的工作绩效,作为对员工进行奖励或惩罚的依据。 “职员奖励管理”模块用于管理职员的奖励信息,内容包括职员编号、奖励类型、奖
如果员工当月薪资为4500元,其应纳税所得额为4500-800=3700,则其应该缴纳的税金为:500×0.05+1500×0.1+1700×0.15=430.00元。为了计算方便,引入了速算扣除数的概念,我们可以找到应纳税所得额所在的级数,例如3700在第3级,则应缴纳税金为该级别应纳税金额减去次级别的速算扣除数:3700×0.15-125=430.00元。
第2章 人力资源管理系统 85 励金额、是否计入工资、奖励原因、部门意见、奖励日期等。其中“是否计入工资”属性决定该奖励是否计入工资,如果选择“是”则在“当月工资管理”功能中计算当月工资时该奖励项自动计入“奖金”属性。
“职员惩罚管理”模块用于管理职员的惩罚信息,内容包括职员编号、惩罚类型、惩罚金额、是否计入工资、惩罚原因、部门意见、惩罚日期等。其中“是否计入工资”属性决定该惩罚是否计入工资,如果选择“是”则在“当月工资管理”功能中计算当月工资时该惩罚项自动计入“罚款”属性。
2.2.6 社会保障管理
“社会保障管理”功能模块用于管理企业员工的社保信息,所包含的功能模块如图2.9所示。
社会保障管理 单位参保信息养老保险信息失业保险信息医疗保险信息工伤保险信息生育保险信息社会保险台帐
“单位参保信息”模块用于设置各子公司参加社会保险的基本信息,内容包括单位编号、参加保险名称(养老保险、失业保险、医疗保险、生育保险、工伤保险及住房公积金)、参保时间、缴费年度、基数计算方式(按应发工资、按上一年个人平均工资、按上一年社会平均工资、按固定基数、其他)、基数百分比、缴费基数、缴费比率、企业支付比率、个人支付比率、在职人数、备注等。基于这些信息系统可以自动计算出社会保险台帐,从而查询各种社保费用缴纳的历史。
小知识 社会保险的定义与缴纳
社会保险是国家通过立法的形式,由社会集中建立基金,以使劳动者在年老、患病、工伤、失业、生育等丧失劳动能力的情况下能够获得国家和社会补偿和帮助的一种社会保障制度。我国社会保险的内容分为五险一金,分别为养老保险、失业保险、医疗保险、生育保险、工伤保险及住房公积金。一般社保基金由企业和个人按照一定的比率共同支付,其中支付的基数和比率根据企业的具体情况而有所不同,一般基数都会和员工的工资挂钩。例如企业养老保险的支付基数为3000元(根据基数计算方法计算出),缴费比率为31%,其中企业支付比率为23%,个人支付比率为8%,则个人月工资发放时应扣除240元的养老保险,而对应企业应当为个人支付690元的养老保险费。
“养老保险信息”模块用于设置员工养老保险的基础信息,内容包括职员编号、开始缴费时间、缴费年限、职工月缴费基数、缴费记录、补缴、增加原因、人员类别、备注等。
图2.9 “社会保障管理”功能模块
86 Access数据库开发经典案例解析 “失业保险信息”模块用于设置员工失业保险的基础信息,内容包括职员编号、个人缴费起始时间、人员类别、累计缴费时间、缴费中断时间、缴费中断原因、备注、操作员等。
“医疗保险信息”模块用于设置员工医疗保险的基础信息,内容包括职员编号、保险名称、缴费起始时间、缴费中断时间、中断开始时间、缴费终止时间、定点医疗机构1、定点医疗机构2、定点医疗机构3、定点医疗机构4、定点医疗机构5、异地安置日期、全称、地址、邮政编码、联系电话、备注等。
“工伤保险信息”模块用于设置员工工伤保险的基础信息,内容包括职员编号、工伤证号、发证日期、发证单位、事故时间、事故类别、劳动鉴定表号、工伤认定申请表号、工伤待遇审批表号、伤害部位、伤害程度、伤残等级、接触有害物质时间、职业病名称、护理依赖等级、工伤原因经过、人员类别、增加时间、减少时间、增减原因、是否工伤职工、备注等。
“生育保险信息”模块用于设置员工生育保险的基础信息,内容包括职员编号、生育时间、生育保险金支付、备注等。
“社会保险台帐”模块用于查询企业员工各种社会保险的支付历史和支付金额,其数据根据前面设定的企业支付比率、个人支付比率及“薪资福利管理”中工资发放时指定的信息自动计算生成。
2.2.7 招聘管理
“招聘管理”模块用于管理和跟踪企业招聘新员工时的全过程,所包含的功能模块如图2.10所示。
招聘管理 招聘申请登记应聘人员登记应聘人员初选应聘人员面试应聘人员录用职员转正管理 “招聘申请登记”模块用于管理企业下属各部门的招聘申请信息,内容包括申请人编号、部门编号、拟招聘人数、工作内容、招聘日期、拟聘人员所需条件、招聘理由、招聘方式、审批情况等。如果必要,还可以将该功能分为两个子功能,分别是申请和审批。这样“审批情况”属性就能在审批功能中修改了。
“应聘人员登记”模块用于管理所有应聘人员的信息,内容包括应聘人编号、应聘人姓名、姓名简码、应聘职务编号、应聘部门编号、出生日期、出生地、性别、婚姻状况、健康情况、政治面貌、家庭电话、手机、寻呼机、户口所在地、家庭地址、电子邮件地址、邮编、身份证号码、文化程度、外语水平、简历文件、照片文件、其他特长、工作职责描
图2.10 “招聘管理”功能模块
第2章 人力资源管理系统 87 述、希望待遇、备注等。
“应聘人员初选”模块用于对应聘者进行初选登记并决定是否通知面试,涉及的信息包括应聘人编号、过去经历、计算机能力、业务能力、外语水平、综合评分、初选状态等。如果需要可以将该功能分为两个子功能,分别是初选登记和审批。这样“初选状态”属性就在审批功能中修改。对于初选通过的应聘者直接将其相关数据转入“应聘人员面试”功能。
“应聘人员面试”模块用于管理通过初选的应聘人员的面试信息,内容包括应聘人编号、初选评分、外表形象、健康状况、领悟反应能力、对相关职务的了解程度、其经历与本公司配合程度、外语能力、综合评分、录用情况、面试地点、面试人、面试日期等。如果需要可以将该功能分为两个子功能,分别是面试登记和审批。这样“录用情况”属性就在审批功能中修改。对于面试通过的应聘者直接将其相关数据转入“应聘人员录用”功能。
“应聘人员录用”模块用于对通过面试的应聘人员进行录用登记,内容包括应聘人编号、面试分数、笔试成绩、综合考核、职员编号、开始聘用日期、试用期、是否转入职员表等。
“职员转正管理”模块用于将处于试用期的员工转为正式员工,涉及的内容包括应聘人编号、职员编号、证件号码、职工帐号、聘任日期、工作电话、聘任合同编号、是否转为正式员工等。
2.2.8 合同管理
“合同管理”功能模块用于管理企业和员工间的所有合同信息,包含的功能模块如图2.11所示。
合同管理 合同签订合同补充合同变更合同续签合同解除合同终止劳动争议经济补偿合同“合同签订”模块用于管理企业与员工签订的劳动合同,内容包括职员编号、合同名称、合同编号、合同期类型、合同期限、劳动合同起始日期、劳动合同终止日期、劳动合同签订日期、劳动合同协商内容、劳动合同期薪资待遇、试用期期限、试用期起始日期、试用期终止日期、试用期薪资待遇、试用合同签订日期、学徒期期限、学徒期起始日期、学徒期终止日期、学徒期薪资待遇、学徒期合同签订日期、见习期期限、见习期起始日期、见习期终止日期、见习期薪资待遇、见习期合同签订日期、保密合同签订日期、保密合同编号、保密合同特别约定、培训协议签订日期、培训协议协商内容、培训内容、培训性质、主办单位、开课日期、结业日期、课时、培训费用、服务期、费用赔偿方式、岗位协议签
图2.11 “合同管理”功能模块
88 Access数据库开发经典案例解析 订日期、岗位协议编号、岗位协议特别约定、合同鉴定日期、鉴定单位、合同类型、合同变动次数、合同状态、备注等。
“合同补充”模块用于对已签订的合同添加补充协议,内容包括职员编号、合同编号、合同补充提出方、合同补充日期、合同补充生效日期、合同补充原因、合同补充内容、新合同编号、备注等。
“合同变更”模块用于管理已签订合同的变更事务,内容包括职员编号、合同编号、经济补偿金、交纳违约金、合同变动提出方、合同变动日期、合同变动后果、合同变动生效日期、合同变动原因、合同变动类型、合同变动内容、新合同编号、备注等。
“合同续签”模块用于处理已到期合同的续签事务,内容包括职员编号、合同编号、续签合同类型、合同续签日期、合同续签期限、续签合同起始日期、续签合同终止日期、新合同编号、备注等。
“合同解除”模块用于解除已签订的合同,内容包括职员编号、合同编号、合同解除提出方、合同解除时间、合同解除原因、合同解除生效日期、解除后果、备注等。
“合同终止”模块用于终止已签订的合同,内容包括职员编号、合同编号、合同终止时间、手续办理时间、备注等。
“劳动争议”模块用于管理企业和员工之间的劳动纠纷,内容包括职员编号、合同编号、劳动争议提出方、劳动争议原因、劳动争议审理机构、劳动争议开始时间、劳动争议结束时间、劳动争议处理结果、备注等。
“经济补偿合同”模块用于管理企业和员工之间签订的经济补偿合同,内容包括职员编号、合同编号、离职前部门、离职前职务、离职日期、离职原因、年龄段、补偿年数、每年金额、总金额、法规依据、审批意见等。
2.2.9 查询统计管理
查询统计管理用于对系统的信息进行万能查询和统计,用户可以对任何信息按照任何自己指定的条件进行查询,并可以将查询结果导出成Excel文件格式。
2.3 人力资源管理系统数据库分析
根据以上的需求分析,一个基本的人力资源管理系统数据库中大致包括70张表,分别存放相应子功能的数据信息,其中组织机构编码表和职员基本信息表是关键的表,用于存放基础的数据信息。其他涉及组织机构信息和职员信息的表,都只记录机构或职员的编号,根据作为外键的编号字段和组织机构编码表或职员基本信息表相对应。因此这两张表和其他表间的关系是1:N的关系。
2.3.1 人力资源管理系统E-R图
因为整个系统涉及的实体和属性较多,限于篇幅不能也没有必要一一列举。图2.12为人力资源管理系统关键实体的E-R图。
第2章 人力资源管理系统 89
图2.12 人力资源管理系统E-R图
其他实体与基本信息表间的对应关系都是类似的。
2.3.2 人力资源管理系统表清单
表2.2仅列出一些重要表的名称及其用途供读者参考。
表2.2 人力资源管理系统表清单
表名
组织机构编码表 用户清单 权限清单
——人员信息管理类表 职员基本信息表 学历及学位子集 个人简历子集 行政党派职务子集 职员离职登记表 岗位变更子集 离休退休子集
表用途
保存企业组织机构及其层级编码的信息 保存系统使用者的信息
保存系统使用者的权限信息,可以指定到菜单级权限
保存企业职员的基本信息 保存企业职员的学历、学位等情况 保存企业职员的个人简历 保存企业职员的行政党派职务情况 对职员的离职进行登记 对职员的岗位变更进行登记 对职员的离休、退休进行登记
90 Access数据库开发经典案例解析 续表
表名
——人事档案管理类表 档案存入登记表 档案查询申请表 档案转出表 档案借用表 档案列表 ——考勤管理类表 刷卡记录表 职员考勤信息表 月考勤汇总表 加班历史表 请假历史表
——薪资福利管理类表 月工资统计表 个人所得税表 绩效考核表 职员奖励表 职员惩罚表 ——社保管理类表 单位参统信息子集 养老保险信息子集 失业保险信息子集 医疗保险子集 工伤信息子集 生育保险信息子集 ——招聘管理类表 招聘申请表 应聘人员登记表 招聘初选名单表 面试名单表 应聘人员录用表 转入正式员工登记表 ——合同管理类表 合同管理子集 合同补充子集 合同变动子集 合同续签子集
表用途
对存入的档案进行登记 保存档案查询的申请情况 保存档案转出的情况 保存档案借用的情况 保存档案信息
保存员工上、下班的刷卡记录,作为原始考核数据 用于将刷卡记录生成考勤信息 保存月份考勤信息 保存职员的加班历史 保存职员的请假历史
计算当月应发放的工资 保存个人所得税率信息 保存职员的绩效考核信息 保存职员的奖励信息 保存职员的惩罚信息
保存各个子公司的参加社会保险的基本信息 保存企业养老保险信息 保存企业失业保险信息 保存企业医疗保险信息 保存企业工伤信息 保存企业生育保险信息
保存企业的招聘申请信息 保存企业的应聘人员信息 保存企业的初选人员信息 保存企业面试的信息 保存企业的录用人员信息 将试用期职员转为正式职员
保存企业的合同信息 保存企业合同的补充信息 保存企业合同的变动信息 保存企业合同的续签信息
第2章 人力资源管理系统 续表
表名 合同解除子集 合同终止子集 劳动争议子集 经济补偿合同
表用途
保存企业合同的解除信息 保存企业合同的终止信息 保存企业的劳动争议信息 保存企业的经济补偿信息
91 2.4 实例制作介绍
基于以上需求分析和数据库分析,读者对一个标准的人力资源管理系统应该有了一个全面的认识。下面将以实例说明如何利用Microsoft Access完成系统的开发。
2.4.1 实例功能
由于篇幅有限,本实例详细介绍如图2.13所示的功能模块的开发过程,并简化其中各功能所包含的属性,对于其他功能,读者完全可以参照这些功能的开发方法完成开发。
需要强调的是,由于用户登录和权限管理的功能各个系统实现的方法是一致的,这里就不再详细介绍,具体实现方法参看第1章。
人力资源管理系统(制作示例) 机构编制管理人员信息管理薪资福利管理系统管理略() 机构设置及编码机构详细信息职员信息维护 职员信息查询当月工资管理个人所得税率 发放工资历史职员奖励管理职员惩罚管理权限管理
图2.13 详细介绍的功能模块
2.4.2 系统流程图
系统流程图如图2.14所示。
92 Access数据库开发经典案例解析 历史工资 从历史导入 惩罚记录 奖励记录 当月工资管理 修改明细并计算 导入到历史 历史工资 图2.14 系统流程图
2.5 程 序 开 发
在前面4节里详述了“人力资源管理系统”的主要内容、管理方法和实际需求,下面
将分别详述本系统程序的开发过程。
2.5.1 创建空数据库
创建一个“人力资源管理系统.mdb”空数据库,如图2.15所示。
图2.15 新创建的空数据库
2.5.2 创建表
根据实例介绍,系统共需要7张表,用途分别如表2.3所示。
第2章 人力资源管理系统 表2.3 系统表及其用途
表名
组织机构编码表 职员基本信息表 个人所得税表 当月工资表 工资发放历史表 职员奖励表 职员惩罚表
表用途
用于保存企业组织机构的详细信息,包括机构间的层级编码等 用于保存企业员工的基本信息 用于保存个人所得税的税率数据 用于临时保存工资发放明细记录信息 用于保存所有月份工资发放的历史 用于保存员工的奖励情况 用于保存员工的惩罚情况
93 下面分别介绍本系统中7张表的结构。
“组织机构编码表”表的结构如表2.4所示。
表2.4 “组织机构编码表”表结构
字段名称 内部编号 类别 AbsIndex ItemIndex 级别 父节点 类别号 单位编号 单位名称 拼音编码 单位地址 单位电话号码 开户银行 帐号 开户全称
字段类型 自动编号 文本 数字 数字 数字 文本 文本 文本 文本 文本 文本 文本 文本 文本 文本
字段大小 长整型 30 整型 整型 整型 10 20 10 30 10 30 11 19 14 20
允许为空 是 是 是 是 是 是 是 是 否 是 是 是 是 是 是
备注
默认值:0 默认值:0 默认值:0 关键字段
“职员基本信息表”表的结构如表2.5所示。
表2.5 “职员基本信息表”表结构
字段名称 内部编号 职员编号 姓名 姓名简码
字段类型 自动编号 文本 文本 文本
字段大小 长整型 30 10 10
允许为空 是 否 否 是
备注 关键字段
94 Access数据库开发经典案例解析 续表
字段名称 性别 出生日期 年龄 籍贯 民族 文化程度 毕业学校 健康状况 婚姻状况 身份证号码 家庭电话 办公电话 手机 电子邮件地址 职工帐号 单位编号 备注
字段类型 文本 日期/时间 数字 文本 文本 文本 文本 文本 文本 文本 文本 文本 文本 文本 文本 文本 文本
字段大小 4 整型 50 20 50 100 50 10 18 50 50 30 50 50 20 100
允许为空 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是
备注
格式 / 输入掩码:短日期 默认值:=Date( ) 默认值:0
“个人所得税表”表的结构如表2.6所示。
表2.6 “个人所得税表”表结构
字段名称 编号 级数 不计税工资 工资下限 工资上限 个人所得税率 速算扣除数
字段类型 文本 文本 数字 数字 数字 数字 数字
字段大小 10 2 单精度型 单精度型 单精度型 单精度型 单精度型
允许为空 否 否 是 是 是 是 是
备注 关键字段
默认值:0 默认值:0 默认值:0 默认值:0 默认值:0
“当月工资表”和“工资发放历史表”表的结构如表2.7所示。
表2.7 “当月工资表”和“工资发放历史表”表结构
字段名称 日期
字段类型 日期/时间
字段大小
允许为空 是
备注
格式 / 输入掩码:短日期 默认值:=Date()
第2章 人力资源管理系统 续表
字段名称 职员编号 姓名 基本工资 浮动工资 合同补 粮副补 房补 临时补 职务工资 工龄工资 考核工资 奖金 应发金额合计 房租 水电费 请假扣除 考勤扣除 罚款 住房公积金 医疗保险 养老保险 失业保险 生育保险 工伤保险 应扣金额合计 工资合计 个人所得税 实发金额 发放否 月份
字段类型 文本 文本 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 数字 是/否 文本
字段大小 30 10 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 双精度型 10
允许为空 否 否 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是 是
备注 关键字段 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0 默认值:0
95 “职员奖励表”表的结构如表2.8所示。
表2.8 “职员奖励表”表结构
字段名称 序号 职员编号
字段类型 自动编号 文本
字段大小 长整型 12
允许为空
是 是
备注 关键字段
96 Access数据库开发经典案例解析 续表
字段名称 奖励类型 奖励金额 是否计入工资 奖励原因 部门意见 奖励日期
字段类型 文本 数字 是/否 文本 文本 日期/时间
字段大小 12 整型 20 20
允许为空 是 是 是 是 是 是
备注 默认值:0 默认值:0 默认值为:是/否
格式 / 输入掩码:短日期 默认值:=Date( ) “职员惩罚表”表的结构如表2.9所示。
表2.9 “职员惩罚表”表结构
字段名称 序号 职员编号 惩罚类型 惩罚金额 是否计入工资 惩罚原因 部门意见 惩罚日期
字段类型 自动编号 文本 文本 数字 是/否 文本 文本 日期/时间
字段大小 长整型 12 12 整型 20 20
允许为空 是 是 是 是 是 是 是 是
备注 关键字段 默认值:0 默认值:0 默认值为:是/否
格式 / 输入掩码:短日期 默认值:=Date()
请读者参考第1章创建表的方法创建以上7张表,结果如图2.16所示。
图2.16 创建“人力资源管理系统”所用表
创建“人力资源管理系统”所用的表完成以后,按第1章所述的创建表与表之间关系
第2章 人力资源管理系统 97 的方法完成该7张表之间的关系,完成结果如图2.17所示。
图2.17 “人力资源管理系统”所用表之间的关系
表的创建为完成系统模块功能奠定了基础,本例程中共有9个功能模块,下面简单的介绍一下各个模块的创建过程,以供读者参考。
2.5.3 实现机构设置及编码功能
机构设置及编码功能是通过窗体模块完成,创建完成后的【机构设置窗体】窗体运行结果如图2.18所示。
图2.18 【机构设置窗体】窗体运行结果
总公司下属可能有多级子公司,子公司下又设置有各种部门,因此机构编制管理必须可以灵活地定义这些层次和属性,同时对应机构的编码应可以根据所从属的上级机构自动
98 Access数据库开发经典案例解析 生成。对于大型企业、集团公司等用户,组织机构往往非常复杂,所以该窗体的实现功能是用于设置企业的组织机构。具体实现步骤如下:
(1) 打开窗体的设计视图,在窗体中添加5个按钮、3个文本框控件和1个目录树(TreeView控件)。在添加TreeView控件时应注意,该控件并未在控件工具箱中列出,需要在系统菜单中加入该菜单。具体步骤如下:
首先,选择【插入】|【ActiveX控件】命令,系统会弹出【插入ActiveX控件】对话框,如图2.19所示。
图2.19 【插入ActiveX控件】对话框
然后,在【请选择ActiveX控件】列表框内选择Microsoft TreeView Control,version 6.0选项,最后单击【确定】按钮,在窗体中将会出现一个TreeView控件,用鼠标调节其大小及位置,然后保存即可。
(2) 对窗体中的各个控件属性值进行修改。
对各个控件的标题属性的设置如图2.18中所示。把3个文本框的“名称”属性分别设置为:txt0,txt1和txt2;把5个按钮的“名称”属性设置为:cmdAddFirst,cmdAddCurrent,cmdAddSub,cmdRevise和cmdDel。调整各个控件的大小及位置,结果如图2.20所示。
图2.20 【机构设置窗体】窗体控件
(3) 通过针对各控件进行编程,以实现该窗体的设计功能。本窗体编程的主要困难在于如何自如的将【组织机构编码表】表中的“机构编码”信息使用TreeView控件来分级显
第2章 人力资源管理系统 99 示,另一困难是如何将数据按照所在节点不同保存到【组织机构编码表】表中有关TreeView控件的方法、属性和事件,请参阅下面的小知识。
小知识 社会保险的定义与缴纳
TreeView常用属性包括Nodes等属性,常用方法包括Add等方法,常用事件是NodeClick事件。
Nodes属性返回对 TreeView 控件的 Node 对象集合的引用,可以使用标准的集合方法(例如 Add 和 Remove 方法)操作 Node 对象。可以按其索引或存储在 Key 属性中的惟一键来访问集合中的每个元素。
Add 方法在 TreeView 控件的 Nodes 集合中添加一个 Node 对象。其语法是object.Add(relative, relationship, key, text),其语法意义解释如下: ? Object 对象表达式,其值是“应用于”列表中的一个对象。 ? Relative 已存在的 Node 对象的索引号或键值。新节点与已存在的节点
间的关系,可在下一个参数 relationship 中找到。
? Relationship 指定的 Node 对象的相对位置,如设置值中所述。 ? Key 惟一的字符串,可用于用 Item 方法检索 Node。 ? Text 在 Node 中出现的字符串。
这其中,relationship 的设置值如下: ? tvwFirst或0 第一级的节点。该 Node 和在 relative 中被命名的节
点位于同一层,并位于所有同层节点之前。 ? tvwLast或1 最后的节点。该 Node 和在 relative 中被命名的节点
位于同一层,并位于所有同层节点之后。任何连续地添加的节点可能位于最后添加的节点之后。 ? tvwNext或2(默认值) 下一个节点。该 Node 位于relative中被命
名的节点之后。 ? tvwPrevious或3 前一个节点。该Node位于relative中被命名的节
点之前。 ? tvwChild或4 子节点。该 Node 成为relative中被命名的节点的子
节点。
注意如果在 relative 中没有被命名的Node对象,则新节点被放在节点顶层的最后位置。
NodeClick 事件在一个 Node 对象被单击时,便发生这个事件。语法是Private Sub object_NodeClick(ByVal node As Node)。在单击节点对象之外的 TreeView 控件的任何部位的,发生标准的Click事件。当单击某个特定的 Node 对象时,发生NodeClick事件;NodeClick 事件也返回对特定的 Node 对象的引用,在继续进行下一步操作之前,这个引用可使这个 Node 对象可用。同时请注意NodeClick 事件发生在标准Click事件之前。
下面来实现本窗体的设计功能。当单击【添加为当前级别】按钮时,在当前节点的同一级别下添加同级节点,其实现代码如下。
100 Access数据库开发经典案例解析 '定义本窗体的中用到所有变量 Option Compare Database Dim i As Integer Dim J As Integer Dim str As String Dim strkey As String Dim nodx As Node
Dim cn As ADODB.Connection
Dim Rs(5) As New ADODB.Recordset Dim cunzai As Boolean Dim ilevel As Integer Dim strparent As String Dim var As Variant Dim k As Integer
Dim itemp As Integer
首先,在cmdAddCurrent_Click( )中要判断一下将要添加的节点是否已经存在,如果存在,则设置变量cunzai=TRUE,通过判断cunzai以决定是否执行添加命令。另外,当两个文本框txt0和txt1的输入内容任一为空时,也没有必要将此数据添入表或者TreeView控件中,此时cunzai=TRUE。
'判断节点是否存在 cunzai = False
If IsNull(Me.txt0) Then cunzai = True
ElseIf IsNull(Me.txt1) Then cunzai = True Else
i = 1
'检查新输入的节点名称是否存在
Do While i <= TreeView1.Nodes.count
If Me.txt0 = TreeView1.Nodes(i).Text Then cunzai = True
i = TreeView1.Nodes.count End If i = i + 1 Loop End If
如果表中还没有要添加的数据段,那么就可以执行添加命令将数据添入。由于要将数据添加到被选中节点的同级别节点上,所以需要找到被选中的节点。如果表内无数据行,则将新节点添加到根节点上;否则,将新节点添加到被选中节点之后。对TreeView控件的添加就此结束,接下来要将新节点内容添加到表中。具体代码如下。
'如果节点不存在
If cunzai = False Then
For i = 1 To TreeView1.Nodes.count
If TreeView1.Nodes(i).Selected Then '被选中的节点是哪一个 J = i d If Next i
'尚无数据节点 If J = 0 Then
Set nodx = Me.TreeView1.Nodes.Add(, , Me.txt0, Me.txt0) Me.txt2 = Me.txt1 'the first level '向表中添加一行数据。
Set cn = CurrentProject.Connection
Rs(1).Open \组织机构编码表\_adLockOptimistic,adCmdTable Rs(1).AddNew
Rs(1)(\级别\ Rs(1)(\父节点\
Rs(1).Fields(7) = Me.txt2 Rs(1).Fields(8) = Me.txt0 Rs(1).Update Rs(1).Close Else
strkey = Me.TreeView1.Nodes(J).Key
Set nodx = Me.TreeView1.Nodes.Add(strkey,
第2章 人力资源管理系统 _ tvwNext, Me.txt0, Me.txt0)
Me.TreeView1.Nodes(J).Expanded = True str = \组织机构编码表\
Rs(1).Open str, CurrentProject.Connection, _adOpenKeyset, adLockOptimistic '寻找同级别节点
Rs(1).MoveFirst
Do While Not (Rs(1).EOF)
If Rs(1)(\单位名称\ strparent = Rs(1)(\父节点\ ilevel = Rs(1)(\级别\ Rs(1).MoveLast End If
Rs(1).MoveNext Loop
Rs(1).Close '寻找父级别节点
str = \单位编号 from 组织机构编码表 where _单位名称= '\
Rs(1).Open str, CurrentProject.Connection, _adOpenKeyset, adLockOptimistic
If Rs(1).RecordCount <> 0 Then Rs(1).MoveFirst
var = Rs(1)(\单位编号\ End If
Rs(1).Close
'向表中添加一行数据
Me.txt2 = var & Me.txt1
Set cn = CurrentProject.Connection
Rs(1).Open \组织机构编码表\adLockOptimistic, adCmdTable Rs(1).AddNew
Rs(1)(\级别\
Rs(1)(\父节点\ Rs(1)(\单位编号\ Rs(1)(\单位名称\ Rs(1).Update Rs(1).Close End If
Me.TreeView1.Refresh End If J = 0
Set Rs(1) = Nothing End Sub
101
处理新节点应添加的位置的思路:首先在表中寻找其同级节点,通过同级节点找到父节点段。将父节点的编号与新节点编号合成,形成合成编号,合成代码是Me.txt2 = var & Me.txt1。新节点的另一些字段则直接拷贝自同级节点,例如语句:Rs(1)(\级别\。
对于其他按钮的处理与cmdAddCurrent相似。这里就不再分别详述了,下面给出响应这些按钮事件的代码。
响应cmdAddFirst按钮事件的代码如下。
Private Sub cmdAddFirst_Click() '判断是否已有该内容 cunzai = False
If IsNull(Me.txt0) Then cunzai = True
ElseIf IsNull(Me.txt1) Then cunzai = True Else
i = 1
'检查新输入的节点名称是否存在
Do While i <= TreeView1.Nodes.count
If Me.txt0 = TreeView1.Nodes(i).Text Then cunzai = True
i = TreeView1.Nodes.count End If i = i + 1 Loop End If
If cunzai = False Then
102 Access数据库开发经典案例解析 For i = 1 To TreeView1.Nodes.count
If TreeView1.Nodes(i).Selected Then '被选中的节点是哪一个 J = i
End If Next i '尚无数据节点 If J = 0 Then
Set nodx = Me.TreeView1.Nodes.Add(, , Me.txt0, Me.txt0) Else
str = Me.TreeView1.Nodes(1).Key
Set nodx = Me.TreeView1.Nodes.Add(str, _ tvwFirst, Me.txt0, Me.txt0)
Me.TreeView1.Nodes(J).Expanded = True End If
Me.txt2 = Me.txt1 '对于第一级节点,应该如下进行添加
Set cn = CurrentProject.Connection
Rs(1).Open \组织机构编码表\ adLockOptimistic, adCmdTable Rs(1).AddNew
Rs(1)(\级别\ Rs(1)(\父节点\
Rs(1).Fields(7) = Me.txt2 Rs(1).Fields(8) = Me.txt0 Rs(1).Update Rs(1).Close
Me.TreeView1.Refresh End If J = 0
Set Rs(1) = Nothing End Sub
响应cmdAddSub命令的代码如下。 Private Sub cmdAddSub_Click() '判断表中是否已经包含该数据 cunzai = False
If IsNull(Me.txt0) Then cunzai = True
ElseIf IsNull(Me.txt1) Then cunzai = True Else
i = 1
'检查新输入的节点名称是否存在
Do While i <= TreeView1.Nodes.count
If Me.txt0 = TreeView1.Nodes(i).Text Then cunzai = True
i = TreeView1.Nodes.count End If i = i + 1 Loop End If
'如果没有包含,则添加为子节点 If cunzai = False Then
For i = 1 To TreeView1.Nodes.count
If TreeView1.Nodes(i).Selected Then J = i End If Next i '尚无数据节点 If J = 0 Then
Set nodx = Me.TreeView1.Nodes.Add(, , Me.txt0, Me.txt0) Else
strkey = Me.TreeView1.Nodes(J).Key
Set nodx = Me.TreeView1.Nodes.Add(strkey, tvwChild, _ Me.txt0, Me.txt0)
Me.TreeView1.Nodes(J).Expanded = True str = \组织机构编码表\
Rs(1).Open str, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic '搜寻父节点
Rs(1).MoveFirst
Do While Not (Rs(1).EOF)
If Rs(1)(\单位名称\ strparent = strkey ilevel = Rs(1)(\级别\ var = Rs(1)(\单位编号\
第2章 人力资源管理系统 Rs(1).MoveLast End If
Rs(1).MoveNext Loop
Rs(1).Close '将新节点内容加入表中
Me.txt2 = var & Me.txt1
Set cn = CurrentProject.Connection
Rs(1).Open \组织机构编码表\adLockOptimistic, adCmdTable Rs(1).AddNew
Rs(1)(\级别\ Rs(1)(\父节点\ Rs(1)(\单位编号\ Rs(1)(\单位名称\ Rs(1).Update Rs(1).Close End If
Me.TreeView1.Refresh End If J = 0
Set Rs(1) = Nothing End Sub
103
响应cmdDel按钮的代码如下。在使用删除功能时,系统将首先判断被选中的节点是否有子节点,如果有子节点,系统将中止删除,直到用户先将相应子节点删除为止。删除与添加是相逆的过程,添加使用的是TreeView的Add方法和Recordset的AddNew方法,删除使用的是TreeView的Remove方法和Recordset的Delete方法。
Private Sub cmdDel_Click() '检查是否有子节点,0为无
If Me.TreeView1.SelectedItem.Children = 0 Then For i = 1 To TreeView1.Nodes.count
If TreeView1.Nodes(i).Selected Then J = i End If Next i
If J <> 0 Then
strkey = Me.TreeView1.Nodes(J).Key '删除选定的节点
TreeView1.Nodes.Remove TreeView1.SelectedItem.Index '删除当前记录
str = \组织机构编码表\
Rs(1).Open str, CurrentProject.Connection,_ adOpenKeyset, adLockOptimistic Rs(1).MoveFirst
Do While Not (Rs(1).EOF)
If Rs(1)(\单位名称\'删除当前节点
Rs(1).Delete adAffectCurrent
If (Rs(1).EOF) Then Exit Sub Else
Rs(1).MoveLast End If End If
Rs(1).MoveNext Loop
Rs(1).Close End If End If
Set Rs(1) = Nothing End Sub
下面是响应cmdRevise命令的代码。与删除功能类似,也需要先检查是否有子节点;否则各节点之间的默认关系将发生改变。
Private Sub cmdRevise_Click()
If Me.TreeView1.SelectedItem.Children = 0 Then cunzai = False
If IsNull(Me.txt0) Then cunzai = True
104 Access数据库开发经典案例解析 ElseIf IsNull(Me.txt1) Then cunzai = True Else
i = 1
'检查新输入的节点名称是否存在
Do While i <= TreeView1.Nodes.count
If Me.txt0 = TreeView1.Nodes(i).Text Then cunzai = True
i = TreeView1.Nodes.count End If
i = i + 1 Loop End If
'如果节点名称不存在
If cunzai = False Then
For i = 1 To TreeView1.Nodes.count
If TreeView1.Nodes(i).Selected Then J = i End If Next i If J <> 0 Then
strkey = Me.TreeView1.Nodes(J).Key
Set nodx = Me.TreeView1.Nodes.Add(strkey, tvwNext,_ Me.txt0, Me.txt0)
Me.TreeView1.Nodes.Remove strkey
Me.TreeView1.Nodes(J).Expanded = True '添加当前节点
str = \组织机构编码表\
Rs(1).Open str, CurrentProject.Connection,_ adOpenKeyset, adLockOptimistic '寻找同级别节点 Rs(1).MoveFirst Do While Not (Rs(1).EOF) If Rs(1)(\单位名称\ strparent = Rs(1)(\父节点\ ilevel = Rs(1)(\级别\ Rs(1).MoveLast End If Rs(1).MoveNext Loop Rs(1).Close '寻找父节点 str = \单位编号 from 组织机构编码表 where 单位名称= '\& strparent & \
Rs(1).Open str, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic If Rs(1).RecordCount <> 0 Then Rs(1).MoveFirst var = Rs(1)(\单位编号\ End If Rs(1).Close '将节点添入表中 Me.txt2 = var & Me.txt1 Set cn = CurrentProject.Connection Rs(1).Open \组织机构编码表\adLockOptimistic, adCmdTable Rs(1).AddNew Rs(1)(\级别\ Rs(1)(\父节点\ Rs(1)(\单位编号\ Rs(1)(\单位名称\ Rs(1).Update Rs(1).Close '删除当前记录 str = \组织机构编码表\ Rs(1).Open str, CurrentProject.Connection,_ adOpenKeyset, adLockOptimistic Rs(1).MoveFirst Do While Not (Rs(1).EOF) If Rs(1)(\单位名称\ Rs(1).Delete adAffectCurrent Rs(1).MoveLast End If Rs(1).MoveNext Loop Rs(1).Close
第2章 人力资源管理系统 End If Me.TreeView1.Refresh End If J = 0 End If
Set Rs(1) = Nothing End Sub
105
下面是处理载入窗体的代码,包括规定显示格式等。对于TreeView中各节点的显示,系统的做法是先列出级别最高的节点,从根节点一直列到级别最低的节点。
Private Sub Form_Load() '在兄弟节点和父节点之间显示线
Me.TreeView1.LineStyle = tvwTreeLines itemp = 0
'对每一级别的节点依次显示 For i = 1 To 5
str = \组织机构编码表 where 级别= \ Rs(i).Open str, CurrentProject.Connection,_ adOpenKeyset, adLockOptimistic If Rs(i).RecordCount = 0 Then Rs(i).Close Exit Sub End If
Rs(i).MoveFirst If i = 1 Then 'search
Do While Not (Rs(1).EOF) itemp = itemp + 1
Set nodx = Me.TreeView1.Nodes.Add(, , Rs(1)(\单位名称\ Rs(1)(\单位名称\
TreeView1.Nodes(itemp).Expanded = True '展开所有节点 Rs(1).MoveNext Loop Else
Do While Not (Rs(i).EOF) itemp = itemp + 1 str = Rs(i)(\父节点\
Set nodx = Me.TreeView1.Nodes.Add(str, tvwChild,_ Rs(i)(\单位名称\单位名称\ TreeView1.Nodes(itemp).Expanded = True '展开所有节点 Rs(i).MoveNext Loop End If
Rs(i).Close Next i
Me.TreeView1.Refresh Set Rs(1) = Nothing End Sub
下面是处理TreeView的NodeClick事件的代码。当选中TreeView中的某一个节点时,在窗体右侧相应文本框显示节点信息。
Private Sub TreeView1_NodeClick(ByVal Node As Object) For i = 1 To TreeView1.Nodes.count If TreeView1.Nodes(i).Selected Then J = i '被选中的节点是哪一个 End If Next i
If J <> 0 Then '有数据节点
Me.txt0 = Me.TreeView1.Nodes(J).Key str = \组织机构编码表\
Rs(1).Open str, CurrentProject.Connection,_ adOpenKeyset, adLockOptimistic Rs(1).MoveFirst
Do While Not (Rs(1).EOF)
If Rs(1)(\单位名称\ Me.txt2 = Rs(1)(\单位编号\ Me.txt1 = Me.txt2 End If
Rs(1).MoveNext Loop
Me.TreeView1.Refresh Rs(1).Close
第2章 人力资源管理系统 111
图2.30 【职员基本信息查询】窗体控件
(4) 修改“职员基本信息查询”查询表的查询条件。实现“姓名编码”、“姓名”、“性别”、“民族”和“籍贯”5个条件的交叉查询和模糊查询功能。修改的方法是打开“职员基本信息查询”查询表的SQL设计视图,把其Where后的条件语句修改成如下代码即可:
SELECT 职员基本信息表.姓名, 职员基本信息表.性别, 职员基本信息表.民族, 职员基本信息表.籍贯, 职员基本信息表.出生日期, 职员基本信息表.办公电话, 职员基本信息表.婚姻状况, 职员基本信息表.单位编号, 职员基本信息表.文化程度, 职员基本信息表.姓名简码 FROM 职员基本信息表
WHERE ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And ((职员基本信息表.性别)=Forms!职员基本信息查询!ComboGender) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Forms!职员基本信息查询!TxtName Is Null) And (Forms!职员基本信息查询!ComboGender Is Null) And (Forms!职员基本信息查询!ComboNation Is Null) And (Forms!职员基本信息查询!ComboNationality Is Null) And (Forms!职员基本信息查询!TxtNameId Is Null))
Or ((Forms!职员基本信息查询!TxtName Is Null) And ((职员基本信息表.性别)=Forms!职员基本信息查询!ComboGender) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And (Forms!职员基本信息查询!ComboGender Is Null) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And ((职员基本信息表.性
别)=Forms!职员基本信息查询!ComboGender) And (Forms!职员基本信息查询!ComboNation Is Null) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And ((职员基本信息表.性别)=Forms!职员基本信息查询!ComboGender) And ((职员基本信息表.民族)=Forms!职员基本信息查
询!ComboNation) And (Forms!职员基本信息查询!ComboNationality Is Null) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And ((职员基本信息表.性别)=Forms!职员基本信息查询!ComboGender) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Forms!职员基本信息查询!TxtNameId Is Null))
Or ((Forms!职员基本信息查询!TxtName Is Null) And (Forms!职员基本信息查询!ComboGender Is Null) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Forms!职员基本信息查询!TxtName Is Null) And ((职员基本信息表.性别)=Forms!职员基本信息查询!ComboGender) And (Forms!职员基本信息查询!ComboNation Is Null) And ((职员基本信息表.籍
贯)=Forms!职员基本信息查询!ComboNationality) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Forms!职员基本信息查询!TxtName Is Null) And ((职员基本信息表.性别)=Forms!职员基本信息查询!ComboGender) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And (Forms!职员基本信息查询!ComboNationality is null) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Forms!职员基本信息查询!TxtName Is Null) And ((职员基本信息表.性别)=Forms!职员基本信息查询!ComboGender) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Forms!职员基本信息查询!TxtNameId is null))
112 Access数据库开发经典案例解析 Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And (Forms!职员基本信息查询!ComboGender is Null) And (Forms!职员基本信息查询!ComboNation is Null) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And (Forms!职员基本信息查询!ComboGender is Null) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And (Forms!职员基本信息查询!ComboNationality is Null) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And (Forms!职员基本信息查询!ComboGender is Null) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Forms!职员基本信息查询!TxtNameId is Null))
Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And ((职员基本信息表.性
别)=Forms!职员基本信息查询!ComboGender) And (Forms!职员基本信息查询!ComboNation is Null) And (Forms!职员基本信息查询!ComboNationality is Null) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And ((职员基本信息表.性
别)=Forms!职员基本信息查询!ComboGender) And (Forms!职员基本信息查询!ComboNation is Null) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Forms!职员基本信息查询!TxtNameId is Null))
Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And ((职员基本信息表.性别)=Forms!职员基本信息查询!ComboGender) And ((职员基本信息表.民族)=Forms!职员基本信息查
询!ComboNation) And (Forms!职员基本信息查询!ComboNationality is Null) And (Forms!职员基本信息查询!TxtNameId is Null))
Or ((Forms!职员基本信息查询!TxtName is Null) And (Forms!职员基本信息查询!ComboGender is Null) And (Forms!职员基本信息查询!ComboNation is Null) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Forms!职员基本信息查询!TxtName is Null) And (Forms!职员基本信息查询!ComboGender is Null) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And (Forms!职员基本信息查询!ComboNationality is Null) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Forms!职员基本信息查询!TxtName is Null) And (Forms!职员基本信息查询!ComboGender is Null) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Forms!职员基本信息查询!TxtNameId is Null))
Or ((Forms!职员基本信息查询!TxtName is Null) And ((职员基本信息表.性别)=Forms!职员基本信息查询!ComboGender) And (Forms!职员基本信息查询!ComboNation is Null) And (Forms!职员基本信息查询!ComboNationality is Null) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Forms!职员基本信息查询!TxtName is Null) And ((职员基本信息表.性别)=Forms!职员基本信息查询!ComboGender) And (Forms!职员基本信息查询!ComboNation is Null) And ((职员基本信息表.籍
贯)=Forms!职员基本信息查询!ComboNationality) And (Forms!职员基本信息查询!TxtNameId is Null)) Or ((Forms!职员基本信息查询!TxtName is Null) And ((职员基本信息表.性别)=Forms!职员基本信息查询!ComboGender) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And (Forms!职员基本信息查询!ComboNationality is Null) And (Forms!职员基本信息查询!TxtNameId is Null)) Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And (Forms!职员基本信息查询!ComboGender is Null) And (Forms!职员基本信息查询!ComboNation is Null) And (Forms!职员基本信息查询!ComboNationality is Null) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And (Forms!职员基本信息查询!ComboGender is Null) And (Forms!职员基本信息查询!ComboNation is Null) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Forms!职员基本信息查询!TxtNameId is Null))
Or ((Instr(职员基本信息表.姓名,Forms!职员基本信息查询!TxtName)>0) And ((职员基本信息表.性
别)=Forms!职员基本信息查询!ComboGender) And (Forms!职员基本信息查询!ComboNation Is Null) And (Forms!职员基本信息查询!ComboNationality Is Null) And (Forms!职员基本信息查询!TxtNameId Is Null))
Or ((Forms!职员基本信息查询!TxtName is Null) And (Forms!职员基本信息查询!ComboGender is Null) And (Forms!职员基本信息查询!ComboNation is Null) And (Forms!职员基本信息查询!ComboNationality is Null) And (Instr(职员基本信息表.姓名简码,Forms!职员基本信息查询!TxtNameId)>0))
Or ((Forms!职员基本信息查询!TxtName is Null) And (Forms!职员基本信息查询!ComboGender is Null) And (Forms!职员基本信息查询!ComboNation is Null) And ((职员基本信息表.籍贯)=Forms!职员基本信息查询!ComboNationality) And (Forms!职员基本信息查询!TxtNameId is Null))
Or ((Forms!职员基本信息查询!TxtName is Null) And (Forms!职员基本信息查询!ComboGender is Null) And ((职员基本信息表.民族)=Forms!职员基本信息查询!ComboNation) And (Forms!职员基本信息查询!ComboNationality is Null) And (Forms!职员基本信息查询!TxtNameId is Null));
至此,【职员基本信息查询】窗体已经创建完成。
2.5.7 实现当月工资管理功能
当月工资管理功能是通过窗体模块完成的,创建完成后的【当月工资管理】窗体运行
第2章 人力资源管理系统 113 结果如图2.31所示。
图2.31 【当月工资管理】窗体运行结果
从图2.31中可以看到该窗体中有【导入工资历史】、【计算当月工资】、【工资发放】和【结束任务】按钮。
在【倒入月份】文本框内输入待导入工资记录的“月份”,然后单击【导入工资历史】按钮,系统自动打开从“工资发放历史”表中导入“月份”字段为【导入月份】文本框内值的所有记录,如果没有该记录,则添加新记录并把各项工资明细都设置为0,如图2.32所示。
图2.32 导入200407月份的工资历史结果
114 Access数据库开发经典案例解析 在【当月工资管理】窗体内的所有文本框控件内输入或修改职员的工资明细以后,单击【计算当月工资】按钮,系统程序会自动计算【应发金额合计】、【应扣金额合计】等字段的值,把计算的结果以消息框的形式输出,让用户先检查一下,然后确定要不要发放,如图2.33所示。
图2.33 计算当月工资的结果
在图2.33中单击【确定】按钮时,系统将把计算的结果保存到“当月工资表”表中,并且显示于【当月工资管理】子窗体中,然后在该子窗体中选择某职员记录,单击【工资发放历史】按钮,系统程序将弹出【是否发放】提示对话框,如图2.34所示。
单击图2.34中的【是】按钮,系统程序首先判断该职员的工资是否已经计算,如果没有计算就弹出【是否计算】提示对话框,如图2.35所示。
图2.34 【是否发放】提示对话框 图2.35 【是否计算】提示对话框
单击图2.35中的【是】按钮,系统将进行职员当月工资合计计算,计算的结果如图2.33所示。然后系统将把该职员的工资记录保存到“工资发放历史表”表中,并把“当月工资表”表的当前职员工资记录删除,最后弹出【提示确认】提示对话框提示“职员工资已经发放成功”,如图2.36所示。
第2章 人力资源管理系统 115
图2.36 提示工资发放成功
上面已经对【当月工资管理】窗体的基本功能作了简单的介绍,下面是创建该窗体的具体步骤及过程。
(1) 打开窗体的设计向导,基于【当月工资表】表所有字段创建【当月工资管理】,窗体,结果如图2.37所示。
图2.37 创建【当月工资管理】窗体
(2) 删除每个文本框控件的“控件来源”,即把【属性】窗口的【数据】选项卡内的“控件来源”属性都设置为空。然后,对各个文本框的“Tab键索引”属性进行设置,最后,调整各控件的大小及位置,并在窗体中添加一个矩形控件,把所有文本框都包括在里面。
(3) 在主窗体中基于“当月工资表”表中“姓名”、“日期”、“应发金额合计”、“应扣金额合计”、“工资合计”、“个人所得税”、“实发金额和发放否”,字段创建
116 Access数据库开发经典案例解析 【当月工资管理】子窗体。另外把子窗体内的所有文本框的“是否锁定”属性设置成“是”,并把子窗体的“名称”属性设置为:MonthPayFrm。
(4) 在主窗体中添加4个命令按钮控件,“标题”属性分别设置为:“导入工资历史”、“计算当月工资”、“工资发放”和“结束任务”;“名称”属性分别设置为:“CmdInputHstry”、“CmdCaculate”、“CmdPay”和“CmdExit”,调整各个控件的大小及位置,结果如图2.38所示。
图2.38 【当月工资管理】窗体控件
(5) 完成【当月工资管理】窗体的各项功能,首先声明全局变量,如下所示。
Option Compare Database Option Explicit
Dim Rs As ADODB.Recordset Dim Rs1 As ADODB.Recordset Dim Rs2 As ADODB.Recordset Dim StrTemp As String Dim str As String
Dim iTemp, jTemp As Integer Dim Stemp(5) As Single
(6) 若用户在子窗体中选择某一职员记录,系统将把该职员各项工资明细显示于主窗体中对应的文本框控件内,实现的方法是在右侧子窗体中的“成为当前”事件中添加如下代码。
Private Sub Form_Current()
On Error GoTo Err_Form_Current Dim Rs As ADODB.Recordset Dim StrTemp As String Dim str As String Dim iTemp As Integer
Set Rs = New ADODB.Recordset
StrTemp = \当月工资表\
Rs.Open StrTemp, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic If Rs.RecordCount < 1 Then Exit Sub
第2章 人力资源管理系统 End If
Rs.MoveFirst
For iTemp = 0 To Rs.RecordCount - 1
If Rs(\职员编号\职员编号] Then
Forms![当月工资管理]![职员编号] = Rs(\职员编号\ Forms![当月工资管理]![姓名] = Rs(\姓名\
Forms![当月工资管理]![基本工资] = Rs(\基本工资\ Forms![当月工资管理]![浮动工资] = Rs(\浮动工资\ Forms![当月工资管理]![合同补] = Rs(\合同补\ Forms![当月工资管理]![粮副补] = Rs(\粮副补\ Forms![当月工资管理]![房补] = Rs(\房补\ Forms![当月工资管理]![临时补] = Rs(\临时补\ Forms![当月工资管理]![职务工资] = Rs(\职务工资\ Forms![当月工资管理]![工龄工资] = Rs(\工龄工资\ Forms![当月工资管理]![考核工资] = Rs(\考核工资\ Forms![当月工资管理]![奖金] = Rs(\奖金\ Forms![当月工资管理]![房租] = Rs(\房租\ Forms![当月工资管理]![水电费] = Rs(\水电费\ Forms![当月工资管理]![请假扣除] = Rs(\请假扣除\ Forms![当月工资管理]![考勤扣除] = Rs(\考勤扣除\ Forms![当月工资管理]![倒入月份] = Rs(\月份\ Forms![当月工资管理]![罚款] = Rs(\罚款\
Forms![当月工资管理]![住房公积金] = Rs(\住房公积金\ Forms![当月工资管理]![医疗保险] = Rs(\医疗保险\ Forms![当月工资管理]![养老保险] = Rs(\养老保险\ Forms![当月工资管理]![失业保险] = Rs(\失业保险\ Forms![当月工资管理]![生育保险] = Rs(\生育保险\ Forms![当月工资管理]![工伤保险] = Rs(\工伤保险\ Exit Sub Else
Rs.MoveNext End If Next iTemp
Set Rs = Nothing Exit_Form_Current: Exit Sub
Err_Form_Current: Set Rs = Nothing
MsgBox Err.Description Resume Exit_Form_Current End Sub
117
(7) 在打开【当月工资管理】窗体,如果“当月工资表”表中的记录为空,系统将根据“职员基本信息表”表来创建一个空的工资表,实现的方法是在该窗体的“加载”事件中添加如下代码。
Private Sub Form_Load()
On Error GoTo Err_Form_Load Set Rs = New ADODB.Recordset
StrTemp = \当月工资表\
Rs.Open StrTemp, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic Set Rs1 = New ADODB.Recordset
StrTemp = \职员基本信息表\
Rs1.Open StrTemp, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic If Rs.RecordCount < 1 Then Rs1.MoveFirst
For iTemp = 0 To Rs1.RecordCount - 1 Rs.AddNew
Rs(\职员编号\职员编号\ Rs(\姓名\姓名\ Rs(\日期\
Rs(\应发金额合计\ Rs(\应扣金额合计\ Rs(\工资合计\ Rs(\个人所得税\ Rs(\实发金额\ Rs(\发放否\ Rs.Update Rs1.MoveNext Next iTemp Else
Exit Sub
118 End If
'释放数据集空间 Set Rs = Nothing Set Rs1 = Nothing Exit_Form_Load: Exit Sub Err_Form_Load:
Set Rs = Nothing
MsgBox Err.Description Resume Exit_Form_Load End Sub
Access数据库开发经典案例解析
(8) 完成【导入工资历史】按钮的功能,实现的方法是在【导入工资历史】按钮的“单击”事件里添加如下代码。
Private Sub CmdInputHstry_Click()
On Error GoTo Err_CmdInputHstry_Click Dim cunzai As Boolean '打开“工资发放历史表”表
Set Rs = New ADODB.Recordset
StrTemp = \工资发放历史表\
Rs.Open StrTemp, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic '打开“职员基本信息表”表
Set Rs1 = New ADODB.Recordset
StrTemp = \职员基本信息表\
Rs1.Open StrTemp, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic '打开“当月工资表”表
Set Rs2 = New ADODB.Recordset
StrTemp = \当月工资表\
Rs2.Open StrTemp, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic If IsNull(Me![ 导入月份]) Then
MsgBox \请输入导入工资历史的“月份”!\输入月份\ Me![ 导入月份].SetFocus Else
If Rs2.RecordCount >= 1 Then Rs2.MoveFirst
For iTemp = 0 To Rs2.RecordCount - 1 Rs2.Delete 1 Rs2.Update Rs2.MoveNext Next iTemp End If
Rs1.MoveFirst
For iTemp = 0 To Rs1.RecordCount - 1 If Rs.RecordCount < 1 Then Exit Sub Else
cunzai = False Rs.MoveFirst
For jTemp = 0 To Rs.RecordCount - 1
If Rs1(\职员编号\职员编号\ cunzai = True
If Rs(\月份\月份]) Then Rs2.AddNew
Rs2(\姓名\姓名\
Rs2(\职员编号\职员编号\ Rs2(\月份\月份\
Rs2(\基本工资\基本工资\ Rs2(\浮动工资\浮动工资\ Rs2(\合同补\合同补\ Rs2(\粮副补\粮副补\ Rs2(\房补\房补\ Rs2(\临时补\临时补\ Rs2(\职务工资\职务工资\ Rs2(\工龄工资\工龄工资\ Rs2(\考核工资\考核工资\ Rs2(\奖金\奖金\ Rs2(\房租\房租\ Rs2(\水电费\水电费\ Rs2(\请假扣除\请假扣除\ Rs2(\考勤扣除\考勤扣除\ Rs2(\罚款\罚款\
第2章 人力资源管理系统 Rs2(\住房公积金\住房公积金\ Rs2(\医疗保险\医疗保险\ Rs2(\养老保险\养老保险\ Rs2(\失业保险\失业保险\ Rs2(\生育保险\生育保险\ Rs2(\工伤保险\工伤保险\ Rs2(\应扣金额合计\ Rs2(\应发金额合计\ Rs2(\工资合计\ Rs2(\个人所得税\ Rs2(\实发金额\
Rs2(\发放否\ Rs2.Update End If
Rs.MoveNext Else
Rs.MoveNext End If Next jTemp End If
If cunzai = False Then Rs2.AddNew
Rs2(\职员编号\职员编号\ Rs2(\姓名\姓名\ Rs2(\日期\
Rs2(\应发金额合计\ Rs2(\应扣金额合计\ Rs2(\工资合计\ Rs2(\个人所得税\ Rs2(\实发金额\ Rs2(\发放否\ Rs2.Update End If
Rs1.MoveNext Next iTemp End If
Me![MonthPayFrm].Requery Set Rs = Nothing Set Rs1 = Nothing Set Rs2 = Nothing
Exit_CmdInputHstry_Click: Exit Sub
Err_CmdInputHstry_Click: Set Rs = Nothing
MsgBox Err.Description
Resume Exit_CmdInputHstry_Click End Sub
119
(9) 完成【计算当月工资】按钮的功能,实现的方法是在【计算当月工资】按钮的“单击”事件里添加如下代码。
Private Sub CmdCaculate_Click()
On Error GoTo Err_CmdCaculate_Click Set Rs = New ADODB.Recordset
StrTemp = \当月工资表\
Rs.Open StrTemp, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic '计算工资合计
Stemp(0) = CSng(Me![房租]) + CSng(Me![水电费]) _ + CSng(Me![请假扣除]) + CSng(Me![考勤扣除]) _ + CSng(Me![罚款]) + CSng(Me![住房公积金]) _ + CSng(Me![医疗保险]) _
+ CSng(Me![养老保险]) + CSng(Me![失业保险]) _ + CSng(Me![生育保险]) + CSng(Me![工伤保险])
Stemp(1) = CSng(Me![基本工资]) + CSng(Me![浮动工资]) _
+ CSng(Me![合同补]) + CSng(Me![粮副补]) + CSng(Me![房补]) _ + CSng(Me![临时补]) + CSng(Me![职务工资]) _
+ CSng(Me![考核工资]) + CSng(Me![工龄工资]) + CSng(Me![奖金]) Stemp(2) = Stemp(1) - Stemp(0) Stemp(3) = GTaxFunction(Stemp(2)) Stemp(4) = Stemp(2) - Stemp(3)
MsgBox \工资统计结果如下:\& \应扣金额合计:\
& Chr(10) & Chr(13) & \应发金额合计:\& Chr(13) & \工资合计:\
120 Access数据库开发经典案例解析 & Chr(13) & \个人所得税:\
& Chr(10) & Chr(13) & \实发金额:\& Stemp(4), vbInformation, \提示确认\ Rs.MoveFirst
For iTemp = 0 To Rs.RecordCount - 1
If Rs(\职员编号\职员编号] Then Rs(\月份\当前月份]) Rs(\基本工资\基本工资]) Rs(\浮动工资\浮动工资]) Rs(\合同补\合同补]) Rs(\粮副补\粮副补]) Rs(\房补\房补]) Rs(\临时补\临时补]) Rs(\职务工资\职务工资]) Rs(\工龄工资\工龄工资]) Rs(\考核工资\考核工资]) Rs(\奖金\奖金]) Rs(\房租\房租]) Rs(\水电费\水电费]) Rs(\请假扣除\请假扣除]) Rs(\考勤扣除\考勤扣除]) Rs(\罚款\罚款])
Rs(\住房公积金\住房公积金]) Rs(\医疗保险\医疗保险]) Rs(\养老保险\养老保险]) Rs(\失业保险\失业保险]) Rs(\生育保险\生育保险]) Rs(\工伤保险\工伤保险]) Rs(\应扣金额合计\ Rs(\应发金额合计\ Rs(\工资合计\ Rs(\个人所得税\ Rs(\实发金额\ Rs.Update Exit For Else
Rs.MoveNext End If Next iTemp
Me![MonthPayFrm].Requery Set Rs = Nothing
Exit_CmdCaculate_Click: Exit Sub
Err_CmdCaculate_Click: Set Rs = Nothing
MsgBox Err.Description
Resume Exit_CmdCaculate_Click End Sub
(10) 完成【工资发放】按钮的功能,实现的方法是在【工资发放】按钮的“单击”事件里添加如下代码。
Private Sub CmdPay_Click()
On Error GoTo Err_CmdPay_Click '打开“当月工资表”表
Set Rs1 = New ADODB.Recordset
StrTemp = \当月工资表\
Rs1.Open StrTemp, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic '输出计算工资合计的结果
If MsgBox(\是否发放?\提示确认\ If Me![MonthPayFrm]![实发金额] = 0 Then
If MsgBox(\该职员的工资还没有计算,是否计算?\ vbYesNo, \是否计算\ CmdCaculate_Click Else
Exit Sub End If End If
'打开“工资发放历史表”表
Set Rs = New ADODB.Recordset
StrTemp = \工资发放历史表\
Rs.Open StrTemp, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic '把计算的结果及原始数据保存
第2章 人力资源管理系统 Rs.AddNew
Rs(\姓名\姓名])
Rs(\职员编号\职员编号]) Rs(\月份\当前月份]) Rs(\基本工资\基本工资]) Rs(\浮动工资\浮动工资]) Rs(\合同补\合同补]) Rs(\粮副补\粮副补]) Rs(\房补\房补]) Rs(\临时补\临时补])
Rs(\职务工资\职务工资]) Rs(\工龄工资\工龄工资]) Rs(\考核工资\考核工资]) Rs(\奖金\奖金]) Rs(\房租\房租]) Rs(\水电费\水电费])
Rs(\请假扣除\请假扣除]) Rs(\考勤扣除\考勤扣除]) Rs(\罚款\罚款])
Rs(\住房公积金\住房公积金]) Rs(\医疗保险\医疗保险]) Rs(\养老保险\养老保险]) Rs(\失业保险\失业保险]) Rs(\生育保险\生育保险]) Rs(\工伤保险\工伤保险])
Rs(\应扣金额合计\应扣金额合计] Rs(\应发金额合计\应发金额合计] Rs(\工资合计\工资合计] Rs(\个人所得税\个人所得税] Rs(\实发金额\实发金额] Rs(\发放否\ Rs.Update
Rs1.MoveFirst
'删除已经发放的职员当月工资记录
For iTemp = 0 To Rs1.RecordCount - 1
If Rs1(\职员编号\职员编号] Then Rs1.Delete 1 Rs1.Update Exit For Else
Rs1.MoveNext End If Next iTemp
Me![MonthPayFrm].Requery '输出工资发放成功信息
MsgBox \工资发放成功,并保存到工资发放历史表中\提示确认\ Else
'输出工资发放失败信息
MsgBox \工资没有发放成功!\提示确认\ End If
Me![MonthPayFrm].Requery '释放数据集空间 Set Rs = Nothing Set Rs1 = Nothing Exit_CmdPay_Click: Exit Sub
Err_CmdPay_Click: Set Rs = Nothing
MsgBox Err.Description Resume Exit_CmdPay_Click End Sub
121
在上面的代码中用到了GTaxFunction( ) 自定义函数,这个自定义函数是在标准模块里定义的,具体实现代码如下。
Option Compare Database Option Explicit
'定义一个全局变量用户暂时保存“工资发放历史表”表中的值 Public VarSalary(25) As Variant '定义GTaxFunction( )函数
Function GTaxFunction(GS As Single) As Single '定义“不计税工资”变量GSalary Dim GSalary As Single '定义
Dim GRatio As Single
122 Access数据库开发经典案例解析 '定义“速算扣除数”变量GRDNum Dim GRDNum As Single '定义“级数”变量GGrade Dim GGrade As Integer
GSalary = GS - 800
Select Case GSalary Case GSalary <= 500 GGrade = 1
GSalary = GSalary GRatio = 0.05 GRDNum = 0 Case 500 To 2000 GGrade = 2
GSalary = GSalary - 500 GRatio = 0.1 GRDNum = 25 Case 2000 To 5000 GGrade = 3
GSalary = GSalary - 2000 GRatio = 0.15 GRDNum = 125 Case 5000 To 20000 GGrade = 4
GSalary = GSalary - 5000 GRatio = 0.2 GRDNum = 375
Case 20000 To 40000 GGrade = 5
GSalary = GSalary - 20000 GRatio = 0.25 GRDNum = 1375 Case 40000 To 60000 GGrade = 6
GSalary = GSalary - 40000 GRatio = 0.3 GRDNum = 3375 Case 60000 To 80000 GGrade = 7
GSalary = GSalary - 60000 GRatio = 0.35 GRDNum = 6375
Case 80000 To 100000 GGrade = 8
GSalary = GSalary - 80000 GRatio = 0.4 GRDNum = 10375 Case Else
GGrade = 9
GSalary = GSalary - 100000 GRatio = 0.45 GRDNum = 15875 End Select
GTaxFunction = GRDNum + GSalary * GRatio End Function
(11) 完成【结束任务】按钮的功能,单击该按钮时,系统将退出该窗体,具体实现方法是在【结束任务】按钮的“单击”事件中添加如下代码。
Private Sub CmdExit_Click()
On Error GoTo Err_CmdExit_Click DoCmd.Close
Exit_CmdExit_Click: Exit Sub
Err_CmdExit_Click: Set Rs = Nothing
MsgBox Err.Description Resume Exit_CmdExit_Click End Sub
至此,【当月工资管理】窗体已经创建完成。
第2章 人力资源管理系统 123 2.5.8 实现个人所得税功能
个人所得税功能是通过窗体模块完成,创建完成后的【个人所得税】窗体运行结果如图2.39所示。
图2.39 【个人所得税】窗体运行结果
该窗体实现的功能是:当输入“不计税工资”字段值后,光标移走后,系统程序会自动计算“级数”、“工资下限”等字段的值,系统程序还会把所计算的结果保存到“个人所得税表”表里并把所有的结果显示在【个人所得税】窗体中。该窗体的创建步骤如下。
(1) 打开窗体的设计视图,在主窗体内基于“个人所得税表”表所有的字段【个人所得税】。另外,在窗体中添加2个按钮控件。
(2) 把【个人所得税】子窗体的“名称”属性设置为:PTaxChildFrm;把该窗体中2个按钮的标题属性分别设置为:“删除记录”和“刷新记录”;把“名称”属性分别设置为:CmdDelete和CmdUpdate。另外,为了防止在子窗体中输入数据而对其进行非法的修改,把除“序号”和“不计税工资”字段以外所有的字段对应的文本框的“是否锁定”属性设置为“是”。然后调整各个控件的大小及位置,结果如图2.40所示。
图2.40 【个人所得税】窗体控件
(3) 在输入“不计税工资”字段值后光标移后系统程序计算“级数”、“工资下限”等字段的值并把所计算的结果显示在子窗体中并保存到“个人所得税表”表里的功能。
实现的方法是在【不计税工资】文本框的“失去焦点”事件中添加如下代码。
Private Sub 不计税工资_LostFocus()
124 Access数据库开发经典案例解析 '定义用于存放“不计税工资”变量 Dim GBJSSalary As Single '把“不计税工资”初始化
GBJSSalary = Me![不计税工资] - 800 '使用Select Case语句 Select Case GBJSSalary Case GBJSSalary <= 500 Me![级数] = 1 Me![工资下限] = 0 Me![工资上限] = 500
'调用GTaxFunction()函数
Me![个人所得税率] = GTaxFunction(GBJSSalary + 800) Me![速算扣除数] = 0 Case 500 To 2000 Me![级数] = 2
Me![工资下限] = 500 Me![工资上限] = 2000
Me![个人所得税率] = GTaxFunction(GBJSSalary + 800) Me![速算扣除数] = 25 Case 2000 To 5000 Me![级数] = 3
Me![工资下限] = 2000 Me![工资上限] = 5000
Me![个人所得税率] = GTaxFunction(GBJSSalary + 800) Me![速算扣除数] = 125 Case 5000 To 20000 Me![级数] = 4
Me![工资下限] = 5000 Me![工资上限] = 20000
Me![个人所得税率] = GTaxFunction(GBJSSalary + 800) Me![速算扣除数] = 375 Case 20000 To 40000 Me![级数] = 5
Me![工资下限] = 20000 Me![工资上限] = 40000
Me![个人所得税率] = GTaxFunction(GBJSSalary + 800) Me![速算扣除数] = 1375 Case 40000 To 60000 Me![级数] = 6
Me![工资下限] = 40000 Me![工资上限] = 60000
Me![个人所得税率] = GTaxFunction(GBJSSalary + 800) Me![速算扣除数] = 3375 Case 60000 To 80000 Me![级数] = 7
Me![工资下限] = 60000 Me![工资上限] = 80000
Me![个人所得税率] = GTaxFunction(GBJSSalary + 800) Me![速算扣除数] = 6375 Case 80000 To 100000 Me![级数] = 8
Me![工资下限] = 80000 Me![工资上限] = 100000
Me![个人所得税率] = GTaxFunction(GBJSSalary + 800) Me![速算扣除数] = 10375 Case Else
Me![级数] = 9
Me![工资下限] = 100000 Me![工资上限] = 0
Me![个人所得税率] = GTaxFunction(GBJSSalary + 800) Me![速算扣除数] = 15875 End Select End Sub
另外,为了实现“删除记录”和“刷新记录”功能,分别在【删除记录】和【刷新记录】按钮的“单击”事件过程中添加如下代码。
Dim Rs As ADODB.Recordset Dim StrTemp As String '刷新记录
Private Sub CmdUpdate_Click() '打开“个人所得税表”表
Set Rs = New ADODB.Recordset
StrTemp = \个人所得税表\
Rs.Open StrTemp, CurrentProject.Connection,_
第2章 人力资源管理系统 adOpenKeyset, adLockOptimistic '刷新“个人所得税表”表 Rs.Update
PTaxChildFrm.Requery '释放数据集空间 Set Rs = Nothing End Sub '删除记录
Private Sub CmdDelete_Click()
On Error GoTo Err_CmdDelete_Click '打开“个人所得税表”表
Set Rs = New ADODB.Recordset
StrTemp = \个人所得税表\
Rs.Open StrTemp, CurrentProject.Connection,_ adOpenKeyset, adLockOptimistic '删除记录 Rs.Delete 1
Set Rs = Nothing
MsgBox \当前记录已经成功删除!\提示\PTaxChildFrm.Requery Exit_CmdDelete_Click: Exit Sub
Err_CmdDelete_Click: Set Rs = Nothing
MsgBox Err.Description
Resume Exit_Command5_Click End Sub
125
至此,【个人所得税】窗体已经创建完成。
2.5.9 实现工资发放历史查询功能
工资发放历史查询功能是通过窗体模块完成,创建完成后的【工资发放历史】窗体运行结果如图2.41所示。
图2.41 【工资发放历史】窗体运行结果
该窗体的实现功能是:在“姓名”所在列中双击,可以把该行的记录导入到【当月工资管理】窗体中相对应的方框内以供再次发放工资,以免再次输入不用修改的内容,这个功能就是前面提到的“导入工资历史”功能,而且,这个窗体还可以实现“工资发放历史”的交叉查询和模糊,并把查询的结果显示于该窗体的子窗体中。具体创建过程如下。
(1) 基于【工资发放历史表】表所有的字段创建【工资发放历史】子窗体。另外,在主窗体中添加2个文本框控件和2个按钮控件。
(2) 把所有的文本框的“是否锁定”属性设置为“是”;把2个文本框控件的“标题”属性分别设置为:“月份”和“职员姓名”并把 “名称”属性分别设置为:TxtMonth和
正在阅读:
人力资源管理系统03-29
浅析新课改背景下教师基本素质07-06
APAP4基本语法参考04-09
医学生预备党员2020思想汇报03-16
萨尔茨堡圣维吉尔酒店(Hotel St. Virgil Salzburg)05-13
促进科技成果转化法贯彻实施情况调查报告12-12
漂流瓶历险记作文600字07-11
在市委党校秋季主体班结业典礼上的讲话11-17
公司周年庆典贺词12-13
0-7岁宝宝右脑开发的16种小游戏06-01
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 管理系统
- 人力资源
- 最新传输线务员题库
- 搓管机在砂层和黏土中的咬合桩施工技术
- orcad原理图中常见DRC错误的取缔方法
- 建筑工程索赔策略与技巧论文
- 实验 5.2 跑马灯实验 - 图文
- cpa财务成本管理 - 公式汇总
- 关于印发防城区乡镇卫生院院长绩效考核办法
- 2013年安徽事业单位考试申论范文—文化发展要始终以人民为中心
- 最新《力学》漆安慎(第二版)答案11章
- 《大学语文》课后练习
- 王梦奎文章写作十二题
- 济南市信访工作责任追究办法
- 自考本科毕业论文答辩经典开场白与常见问题的应对方法
- 湖南省省以上投资土地开发整理项目工程监理单位管理指导意见(湘
- midas Gen-平板网架的分析设计 - 图文
- EN-7625智能露点仪
- 北京市综合管理类公务员非领导职务设置管理办法(网络).doc
- 江苏省农村信用社公开选聘高级管理人员办法
- 2015-2022年中国绿色建筑行业市场分析及投资机遇研究报告 - 图文
- 前鼻音和后鼻音的区别技巧