




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目4----人力资源管理系统项目来源:湖南科创信息技术股份有限公司随着市场竞争的日趋剧烈,人才已成为实现公司自身战略目的的一个非常关键的因素。公司中人心向背和员工对工作的投入限度在很大限度上决定了该公司的兴衰与成败。如何能保持本公司对员工的工作责任感,激励他们的工作热情,减少人才的流失,已成为困扰公司主管和人力资源经理的一个日益锋利的问题,可以说公司管理从主线上来讲就是对人的管理。现在“公平、公正、合理”的公司管理原则已为不少公司所采纳。但是要实现“公平、公正、合理”绝非易事,它不是仅靠规章制度和政策就可以解决的。通过建立透明、相容、一致、易查和全面的人力资源信息系统,将与人相关的信息统一地管理起来,才有也许为“公平、公正、合理”原则的实现,以及公司在运作和劳资纠纷等方面的风险规避等建立一套科学的保障体系。本章将向读者全面剖析人力资源管理的内容,由此得出人力资源管理系统需求分析和数据建模,并最终演示如何运用VisualBasic.NET完毕系统的制作。1人力资源管理的任务与作用1.1人力资源管理的任务人力资源管理工作的重要任务有:进行人力资源规划和分析贯彻平等就业机会原则聘任员工从事人力资源开发拟定报酬和福利解决员工与劳资关系人力资源规划和分析涉及几方面的任务。在进行人力资源规划的过程中,经理人员将预计未来影响劳动力供求的有关因素。人力资源分析规定具有各种相关的信息资料、通信系统和评价系统,它们是从事协调人力资源工作所不可或缺的部分。政府在遵从平等就业机会法规方面的规定,无疑将对所有其别人力资源管理工作产生重大影响。例如,公司在进行战略性人力资源规划时,为贯彻在雇佣少数种族成员和妇女方面的赞助性行为的规定,就必须为雇佣各种各样的雇员留有充足的余地。此外在招聘选拔和培训人员时,所有经理人员都必须遵守平等就业机会法规的规定。聘任员工指选择适合标准规定的相应数量的人员,来填补公司的岗位空缺。职务分析是聘任工作的基础。根据职务分析所得结论,就可以准备工作说明书和职务规定细则,这两项都是在招聘中所需使用的材料。在人员选拔过程中,应特别注意选择最符合规定的员工来填补公司的岗位空缺。员工培训与人力资源开发工作涉及想新雇员介绍公司的各种情况、对现有员工进行职业技能培训、鼓励和帮助员工在多方面提高和发展等内容。在职务不断演化和改变的环境下,为了适应技术的变化,公司就必须对员工进行培训和再培训。此外,为迎接未来的挑战,还必须鼓励各级负责人、管理者和所有员工不断有所发展和提高。为此公司一般制定了员工职业发展计划,这种计划的目的,是为那些在公司内寻求自我发展的员工设计出发展的途径,并安排为此所需要的有关活动。为了提高员工的工作成效,公司还应对员工的工作表现进行考核,以拟定员工的本职工作究竟做的怎么样。报酬就是通过薪金、奖励和福利等方式来报答为公司工作的员工。公司必须认真设计和不断完善基本工资和薪酬制度。除了工薪以外,越来越多的公司好指定了某些奖励计划,例如利润分享和工作奖励等。但是另一方面,快速增长的福利费用,特别是扶摇直上的医疗的保健费用,仍将继续是一个值得思考和认真对待的重大问题。假如员工和公司双方都想联手共创繁荣,那么管理着和员工就必须卓有成效地解决双方的关系。不管员工是否由工会来代表,公司都必须重视与员工健康、人身安全和财物保障有关的各项工作。为促成公司与员工的良好关系,公司还必须保障员工的各种权利。此外为了使员工如同管理者那样准确地了解公司对员工的盼望。公司还必须制定、传达和不断更新人力资源政策和规则。在有工会的公司中,公司还应重视和解决好资方和工会的关系。1.2人力资源管理系统的作用人力资源管理系统是以先进的软件和高速、大容量的硬件为基础的,新的人力资源管理模式,通过集中式的信息库、自动解决信息、员工自助服务、外协以及服务共享,达成减少成本、提高效率、改善员工服务模式的目的。它通过与公司现有的网络技术相联系,保证人力资源与日新月异的技术环境同步发展。一般来说,可以分为四个部分来理解人力资源管理系统。管理人员角色和目的的改变传统的人力资源管理中,管理人员的绝大部分精力将花费在繁琐的平常行政事务解决上,而作为公司管理层的参谋角色应当做的征询和策略制定的工作相对缺少。通过人力资源管理系统管理人员将决大部分精力放在管理层提供征询、建议上,而在行政事务上的工作可以由电子化系统完毕,只需占用HR人员很少的精力和时间。提供更好的服务人力资源管理系统可以迅速、有效地收集各种信息,加强内部的信息沟通。各种用户可以直接从系统中获得自己所需要的各种信息,并根据相关信息做出决策和相应的行动方案。3.减少成本人力资源管理系统通过减少人力资源管理工作的操作成本、减少员工流动率、减少通讯费用等途径达成减少公司运作成本的目的。4.革新管理理念人力资源管理系统的最终目的是达成革新公司的管理理念而不仅仅是改善管理方式、优化人力资源管理。先进技术应用与人力资源管理时,并不仅仅是为了将现有的人力资源工作做的更好,更重要的是,做些对于公司来讲更有效率的事情,成为管理层的决策支持者,为决策提供信息和解决方案。2功能分析与系统流程图由于篇幅有限,本实例具体介绍如图1所示的功能开发过程,并简化其中各功能所包含的属性,其他功能读者完全可以参照这些功能的开发方法实现。人力资源管理系统人力资源管理系统图1具体介绍的功能模块历史工资历史工资奖励记录历史工资处罚记录当月工资管理修改明细并计算从历史导入导入到历史图2系统流程图3数据库设计一个基本的人力资源管理系统数据库中涉及多张数据表,分别存放相应子功能的数据信息,其中组织机构编码表和职工基本信息表是起关键作用的表,用于存放基础的数据信息。其他涉及组织机构信息和职工信息的数据表,都只记录机构或职工的编号,根据作为外键的编号字段和组织机构编码表或职工基本信息表相相应。因此这2张表和其他数据表间的关系是1:N的关系。本程序共需8张表,用途分别如表1所示。表1系统数据表及其用途数据表名称数据表用途用户清单保存系统使用者的信息职工基本信息表用于保存公司组织机构的具体信息,涉及机构间的层次编码等组织机构编码表用于保存公司员工的基本信息月工资登记表用于保存、计算当月的员工工资个人所得税表用于保存个人所得税的税率数据工资发放历史表用于保存所有月份工资发放的历史职工奖励表用于保存员工的奖励情况职工处罚表用于保存员工的处罚情况以下为数据表之间的关系图图3数据表关系图3.1创建数据库打开SQLServer公司管理器,新建一个数据库,将其命名为hrmbook。后面几小节我们将列出几个重点的数据表的建库脚本。3.2创建“组织机构编码表”CREATETABLE[dbo].[组织机构编码表]( [内部编号][int]IDENTITY(1,1)NOTNULL, [类别][varchar](100)NULL, [AbsIndex][int]NULL, [ItemIndex][int]NULL, [ItemLevel][int]NULL, [ParentIndex][int]NULL, [类别号][char](10)NULL, [单位编号][varchar](20)NOTNULLPRIMARYKEY, [单位名称][varchar](100)NULL, [拼音编码][varchar](50)NULL, [单位地址][varchar](100)NULL, [单位电话号码][varchar](50)NULL, [开户银行][varchar](100)NULL, [帐号][varchar](50)NULL, [开户全称][varchar](100)NULL)ON[PRIMARY]GO3.3创建“职工基本信息表”CREATETABLE[dbo].[职工基本信息表]( [内部编号][int]IDENTITY(1,1)NOTNULL, [职工编号][varchar](30)NOTNULLPRIMARYKEY, [姓名][varchar](20)NOTNULL, [姓名简码][varchar](10)NULL, [性别][varchar](2)NULL, [出生日期][int]NULL, [年龄][int]NULL, [籍贯][varchar](50)NULL, [民族][varchar](20)NULL, [文化限度][char](50)NULL, [毕业学校][char](100)NULL, [健康状况][varchar](50)NULL, [婚姻状况][varchar](10)NULL, [身份证号码][varchar](18)NULL, [家庭电话][varchar](50)NULL, [办公电话][varchar](50)NULL, [手机][varchar](50)NULL, [电子邮件地址][varchar](50)NULL, [职工账号][varchar](20)NULL, [单位编号][varchar](20)NULL, [备注][varchar](100)NULL)ON[PRIMARY]GO3.4创建其他数据表CREATETABLE[dbo].[用户清单]( [用户编号][char](6)NOTNULL, [部门][char](20)NOTNULL, [姓名][char](10)NOTNULL, [性别][char](2)NOTNULL, [密码][char](10)NULL)ON[PRIMARY]GOCREATETABLE[dbo].[月工资登记表]( [日期][int]NULL, [职工编号][varchar](30)NotNULLPRIMARYKEY, [基本工资][float]NULLDEFAULT(0), [浮动工资][decimal](26,2)NULLDEFAULT(0), [协议补][decimal](26,2)NULLDEFAULT(0), [粮副补][decimal](26,2)NULLDEFAULT(0), [房补][decimal](26,2)NULLDEFAULT(0), [临时补][decimal](26,2)NULLDEFAULT(0), [职务工资][decimal](26,2)NULLDEFAULT(0), [工龄工资][decimal](26,2)NULLDEFAULT(0), [考核工资][decimal](26,2)NULLDEFAULT(0), [奖金][decimal](26,2)NULLDEFAULT(0), [应发金额合计][decimal](26,2)NULLDEFAULT(0), [房租][decimal](26,2)NULLDEFAULT(0), [水电费][decimal](26,2)NULLDEFAULT(0), [请假扣除][decimal](26,2)NULLDEFAULT(0), [考勤扣除][decimal](26,2)NULLDEFAULT(0), [罚款][decimal](26,2)NULLDEFAULT(0), [住房公积金][decimal](26,2)NULLDEFAULT(0), [医疗保险][decimal](26,2)NULLDEFAULT(0), [养老保险][decimal](26,2)NULLDEFAULT(0), [失业保险][decimal](26,2)NULLDEFAULT(0), [生育保险][decimal](26,2)NULLDEFAULT(0), [工伤保险][decimal](26,2)NULLDEFAULT(0), [应扣金额合计][decimal](26,2)NULLDEFAULT(0), [工资合计][decimal](26,2)NULLDEFAULT(0), [个人所得税][decimal](26,2)NULLDEFAULT(0), [实发金额][decimal](26,2)NULLDEFAULT(0), [发放否][char](10)NULL, [月份][int]NULL)ON[PRIMARY]GOCREATETABLE[dbo].[个人所得税表]( [编号][int]NOTNULLPRIMARYKEY, [级数][char](2)NOTNULL, [不计税工资][decimal](26,2)NOTNULLDEFAULT(800), [工资下限][decimal](26,2)NOTNULLDEFAULT(0), [工资上限][decimal](26,2)NOTNULLDEFAULT(0), [个人所得税率][decimal](26,2)NOTNULLDEFAULT(0), [速算扣除数][decimal](26,2)NOTNULLDEFAULT(0), [备注][varchar](50)NULL)ON[PRIMARY]GOCREATETABLE[dbo].[工资发放历史表]( [日期][int]NULL, [职工编号][varchar](30)NULL, [基本工资][float]NULL, [浮动工资][decimal](26,2)NULL, [协议补][decimal](26,2)NULL, [粮副补][decimal](26,2)NULL, [房补][decimal](26,2)NULL, [临时补][decimal](26,2)NULL, [职务工资][decimal](26,2)NULL, [工龄工资][decimal](26,2)NULL, [考核工资][decimal](26,2)NULL, [奖金][decimal](26,2)NULL, [应发金额合计][decimal](26,2)NULL, [房租][decimal](26,2)NULL, [水电费][decimal](26,2)NULL, [请假扣除][decimal](26,2)NULL, [考勤扣除][decimal](26,2)NULL, [罚款][decimal](26,2)NULL, [住房公积金][decimal](26,2)NULL, [医疗保险][decimal](26,2)NULL, [养老保险][decimal](26,2)NULL, [失业保险][decimal](26,2)NULL, [生育保险][decimal](26,2)NULL, [工伤保险][decimal](26,2)NULL, [应扣金额合计][decimal](26,2)NULL, [工资合计][decimal](26,2)NULL, [个人所得税][decimal](26,2)NULL, [实发金额][decimal](26,2)NULL, [发放否][char](10)NULL, [月份][int]NULL)ON[PRIMARY]GOCREATETABLE[dbo].[职工奖励表]( [序号][int]IDENTITY(1,1)NOTNULLPRIMARYKEY, [职工编号][varchar](30)NOTNULL, [奖励类型][varchar](20)NULL, [奖励金额][float]NULLDEFAULT(0), [是否计入工资][char](10)NULLDEFAULT('否'), [奖励因素][varchar](50)NULL, [部门意见][varchar](100)NULL, [奖励日期][int]NULL)ON[PRIMARY]GOCREATETABLE[dbo].[职工处罚表]( [序号][int]IDENTITY(1,1)NOTNULLPRIMARYKEY, [职工编号][varchar](30)NOTNULL, [处罚类型][varchar](20)NULL, [处罚金额][float]NULLDEFAULT(0), [是否计入工资][char](10)NULLDEFAULT('否'), [处罚因素][varchar](50)NULL, [部门意见][varchar](100)NULL, [处罚日期][int]NULL)ON[PRIMARY]GO3.5创建外部关键字ALTERTABLE[dbo].[月工资登记表]ADD CONSTRAINT[FK_月工资登记表_职工基本信息表]FOREIGNKEY ( [职工编号] )REFERENCES[dbo].[职工基本信息表]( [职工编号] )GOALTERTABLE[dbo].[工资发放历史表]ADD CONSTRAINT[FK_工资发放历史表_职工基本信息表]FOREIGNKEY ( [职工编号] )REFERENCES[dbo].[职工基本信息表]( [职工编号] )GOALTERTABLE[dbo].[职工奖励表]ADD CONSTRAINT[FK_职工奖励表_职工基本信息表]FOREIGNKEY ( [职工编号] )REFERENCES[dbo].[职工基本信息表]( [职工编号] )GOALTERTABLE[dbo].[职工处罚表]ADD CONSTRAINT[FK_职工处罚表_职工基本信息表]FOREIGNKEY ( [职工编号] )REFERENCES[dbo].[职工基本信息表]( [职工编号] )GO3.6创建存储过程系统使用了四个存储过程,分别实现从历史导入工资明细、计算当月工资和工资发放的功能。这些存储过程都在“当月工资管理”模块中使用,可以通过以下的脚本代码创建。ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[sf_空数据置0]')andOBJECTPROPERTY(id,N'IsProcedure')=1)dropprocedure[dbo].[sf_空数据置0]GOifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[sf_形成月工资登记表]')andOBJECTPROPERTY(id,N'IsProcedure')=1)dropprocedure[dbo].[sf_形成月工资登记表]GOifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[sf_当月工资记录]')andOBJECTPROPERTY(id,N'IsProcedure')=1)dropprocedure[dbo].[sf_当月工资记录]GOifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[sf_当月工资发放]')andOBJECTPROPERTY(id,N'IsProcedure')=1)dropprocedure[dbo].[sf_当月工资发放]GO-----------------------createproceduresf_空数据置0asbegintransaction update月工资登记表set基本工资=0where基本工资isnull update月工资登记表set职务工资=0where职务工资isnull update月工资登记表set工龄工资=0where工龄工资isnull update月工资登记表set考核工资=0where考核工资isnull update月工资登记表set奖金=0where奖金isnull update月工资登记表set应发金额合计=0where应发金额合计isnull update月工资登记表set房租=0where房租isnull update月工资登记表set水电费=0where水电费isnull update月工资登记表set请假扣除=0where请假扣除isnull update月工资登记表set罚款=0where罚款isnull update月工资登记表set考勤扣除=0where考勤扣除isnull update月工资登记表set住房公积金=0where住房公积金isnull update月工资登记表set医疗保险=0where医疗保险isnull update月工资登记表set养老保险=0where养老保险isnull update月工资登记表set应扣金额合计=0where应扣金额合计isnull update月工资登记表set失业保险=0where失业保险isnull update月工资登记表set个人所得税=0where个人所得税isnull update月工资登记表set工资合计=0where工资合计isnull update月工资登记表set实发金额=0where实发金额isnull update个人所得税表set个人所得税率=0where个人所得税率isnullcommitGO-------------------------------------createproceduresf_当月工资记录asbegintransaction declare@monthint select@month=日期from月工资登记表 --计算奖金 update月工资登记表set奖金= (selectsum(奖励金额)from职工奖励表asiwherei.是否计入工资='是'and i.奖励日期>@month*100andi.奖励日期<(@month+1)*100 groupbyi.职工编号havingi.职工编号=月工资登记表.职工编号) update月工资登记表set奖金=0where奖金isnull --计算处罚 update月工资登记表set罚款= (selectsum(处罚金额)from职工处罚表asiwherei.是否计入工资='是'and i.处罚日期>@month*100andi.处罚日期<(@month+1)*100 groupbyi.职工编号havingi.职工编号=月工资登记表.职工编号) update月工资登记表set罚款=0where罚款isnull --将空数据置0 execsf_空数据置0 --计算应发/应扣/工资合计 update月工资登记表 set应扣金额合计=房租+水电费+请假扣除+罚款+考勤扣除+住房公积金+医疗保险 +养老保险+失业保险 update月工资登记表 set应发金额合计=基本工资+浮动工资+协议补+粮副补+房补+临时补 +职务工资+工龄工资+考核工资+奖金 update月工资登记表 set工资合计=应发金额合计-应扣金额合计 --计算个人所得税 declare@gzhjnumeric(20,4),@zybhvarchar(20),@grsdsnumeric(20,4),@slfloat, @gzxxnumeric(20,4),@gzsxnumeric(20,4) declaremycurcursorforselect职工编号,工资合计from月工资登记表 openmycur fetchnextfrommycurinto@zybh,@gzhj WHILE(@@FETCH_STATUS=0) BEGIN --扣除不计税部分 select@gzhj=@gzhj-(selecttop1不计税工资from个人所得税表orderby级数) select@grsds=0 declaremycur1cursorforselect工资下限,工资上限,casewhen 个人所得税率>1then个人所得税率/100else个人所得税率end from个人所得税表where工资上限<=@gzhjorderby工资上限 openmycur1 fetchnextfrommycur1into@gzxx,@gzsx,@sl WHILE(@@FETCH_STATUS=0) BEGIN select@grsds=@grsds+(@gzsx-@gzxx)*@sl fetchnextfrommycur1into@gzxx,@gzsx,@sl END closemycur1 deallocatemycur1 select@sl=casewhen个人所得税率>1then个人所得税率/100else 个人所得税率end,@gzxx=工资下限from个人所得税表 where工资下限=@gzsx select@grsds=@grsds+(@gzhj-@gzxx)*@sl update月工资登记表set个人所得税=@grsdswherecurrentofmycur fetchnextfrommycurinto@zybh,@gzhj END closemycur deallocatemycur --计算实发工资 update月工资登记表set实发金额=工资合计-个人所得税commitGO-------------------------------------createproceduresf_形成月工资登记表@导入工资月份int,@记录工资月份intasbegintransaction deletefrom月工资登记表--删除已有数据 ifexists(select*from工资发放历史表where日期=@导入工资月份) begin --从历史倒入 insertinto月工资登记表 (日期,职工编号,基本工资,浮动工资,协议补,粮副补,房补,临时补, 职务工资,工龄工资,考核工资,奖金,应发金额合计,房租,水电费, 请假扣除,考勤扣除,罚款,住房公积金,医疗保险,养老保险,失业保险, 生育保险,工伤保险,应扣金额合计,工资合计,个人所得税,实发金额, 发放否,月份) select@记录工资月份,职工编号,基本工资,浮动工资,协议补,粮副补, 房补,临时补,职务工资,工龄工资,考核工资,奖金, 应发金额合计,房租,水电费,请假扣除,考勤扣除,罚款, 住房公积金,医疗保险,养老保险,失业保险,生育保险, 工伤保险,应扣金额合计,工资合计,个人所得税,实发金额, 发放否,月份 from工资发放历史表ashwhereh.日期=@导入工资月份 end --新的员工,历史没有记录,生成记录 insertinto月工资登记表 (职工编号,日期)select职工编号,@记录工资月份 from职工基本信息表ashwhereh.职工编号notin (select职工编号from月工资登记表) --将空数据置0 execsf_空数据置0 --自动计算工资 execsf_当月工资记录commitGO---------------------发放指定职工的工资createproceduresf_当月工资发放@职工编号char(10)asbegintransaction update月工资登记表set发放否='是'from月工资登记表 where职工编号=@职工编号 insertinto工资发放历史表 select*from月工资登记表 where职工编号=@职工编号 delete月工资登记表where职工编号=@职工编号commitGO4代码与界面设计本系统采用多文档窗体程序,每一功能相应一个子窗体。4.1程序运营结果本实例的运营结果如图4所示。选择主菜单中的各菜单项即可进入相应的功能。例如可以选择【薪资福利管理】|【当月工资管理】菜单命令,调出如图5所示的工资管理功能窗体,在其中输入各个工资项明细,单击【计算当月工资】按钮可以计算出工资;其中的工资项明细也可以通过【导入工资历史】按钮从历史数据中导入,从而减轻输入工作的强度;单击[工资发放]按钮,可以发放选定职工的工资,打印出工资条并将工资发放的记录放入历史。图4实例运营结果图5当月工资管理功能窗体4.2创建工程启动MicrosoftVisualStudio.NET2023,在主菜单中选择【文献】|【新建】|【项目】命令,弹出【新建项目】对话框没,在【项目类型】列表框中选择【VisualBasic项目】,然后在【模板】列表框中选择【Window应用程序】。在【名称】文本框中输入一个合适的方案文献名,选取要存放的位置,然后单击【拟定】按钮完毕新项目的创建。6.3创建系统主窗体运用系统默认生成的窗体作为主窗体,并将其相应的文献改名为“frmMain.vb”,为其添加主菜单控件以及StatusBar控件,布局如图6所示。图6系统主窗体(2)窗体的属性设立如表2所示。表2主窗体属性设立对象(控件)名属性取值(说明)frmMainNamefrmMainfrmMainText人力资源管理系统frmMainIsMdiContainerTrueStatusBarText人力资源管理系统(3)窗体的主菜单属性设立如表5所示。表3窗体主菜单属性设立菜单栏菜单项属性取值(说明)MenuItemDepText机构编制管理MenuItemDepManageText机构设立及编码MenuItemDepInfoText机构具体信息MenuItemPeopleText职工信息管理MenuItemDepPeopleManageText职工信息维护MenuItemPeopleQueryText职工信息查询MenuItemSalaryText薪资福利管理MenuItemPeopleSalaryManageText当月工资计算MenuItemTaxInfoText个人所得税率MenuItemPrizeText工资发放历史MenuItemPunishText职工奖励管理MenuItemSalaryhisText职工处罚管理(4)添加判断子窗体实例状态的函数GetInstanceState,此函数重要作用是用来实现单击主窗体的某菜单项,如【计算当月工资】只是出现一个计算当月工资窗体。PrivateFunctionGetInstanceState(ByValnameAsString)AsBoolean'获得frmMain窗体的子窗体的数量DimiAsInteger=Me.MdiChildren.Length'循环判断是否有名为name的子窗体实例Fori=0ToMe.MdiChildren.Length-1IfMe.MdiChildren(i).Name=nameThen'存在名为name的子窗体,是子窗体获得焦点并返回TrueMe.MdiChildren(i).Focus()ReturnTrueEndIfNext'不存在名为Name的子窗体FalseReturnFalseEndFunction(5)添加采单项MenuItemDepManage的Click事件响应函数。PrivateSubMenuItemDepManage_Click(ByValsenderAsObject,_ByValeAsSystem.EventArgs)HandlesMenuItemDepManage.Click'判断机构设立及编码窗体是是否已经创建IfGetInstanceState("frmDepManage")Then'机构设立及编码窗体已经创建并返回ExitSubEndIf'创建并显示商品资料维护窗体DimchildFrmAsfrmDepManage=NewfrmDepManagechildFrm.MdiParent=MechildFrm.Show()EndSub4.4创建数据访问模块由于各个窗体均需要对数据库进行访问,可以把对数据库的一些操作通过一个类来实现,这样可以使对数据库的访问更加简朴。选择【文献】|【添加新项】命令添加一个名为“DataBase.vb”的类文献。ImportsSystem.DataImportsSystem.Data.SqlClientImportsSystem.ComponentModelPublicClassDataBase'实现接口IDisposableImplementsIDisposable'数据库连接对象PrivateSqlConnAsSqlConnectionPublicSharedsConnAsString="PersistSecurityInfo=False;IntegratedSecurity=SSPI;database=hrmbook;server=localhost;ConnectTimeout=30"PublicSubDispose()ImplementsSystem.IDisposable.DisposeDispose(True)GC.SuppressFinalize(True)EndSubProtectedSubDispose(ByValdisposingAsBoolean)Ifdisposing<>TrueThenReturnEndIfIfSqlConnIsNothing=FalseThenSqlConn.Dispose()SqlConn=NothingEndIfEndSubPublicSubOpen()IfSqlConnIsNothing=TrueThen'建立数据库连接对象SqlConn=NewSqlConnection(Me.sConn)'打开数据库连接SqlConn.Open()EndIfEndSubPublicSubClose()'假如数据库连接对象不为空则关闭数据库连接IfSqlConnIsNothing=FalseThenSqlConn.Close()EndIfEndSubPublicFunctionRunSelectSQL(ByValsSQLStringAsSystem.String)AsDataViewMe.Open()DimSqlDSAsDataSet=NewDataSetDimSqlDAAsSqlDataAdapter=NewSqlDataAdapter(sSQLString,Me.SqlConn)SqlDA.Fill(SqlDS)ReturnSqlDS.Tables(0).DefaultViewEndFunctionPublicFunctionRunDelOrInsSQL(ByValsSQLStringAsSystem.String)Me.Open()DimSqlCommAsSqlCommand=NewSqlCommand(sSQLString,Me.SqlConn)SqlComm.ExecuteNonQuery()EndFunctionEndClass4.5实现机构设立及编码功能本节重要演示如何运用VisualBasic.NET实现机构设立及编码功能。机构设立的编码机构设立及编码功能重要用于实现设立机构的层级关系。新建一个窗体,将其Name属性设立为“frmDepManage”并为其添加如图7所示的控件。图7机构设立及编码窗体(2)部分控件的属性设立如表4所示。表4机构设立及编码窗体控件属性设立控件类型对象名属性取值(说明)FormfrmDepManageText机构设立及编码TreeViewtrvListDockLeftSplitterSplitter1DockLeftPanelpanelRightDockFillTextBoxtxbNameTextTextBoxtxbLKindCodeTextTextBoxtxbDepCodeTextTextBoxtxbDepCodeReadOnlyTrueButtonbtnModifyText修改ButtonbtnAddBasText增长为第一级ButtonbtnAddEqlText增长为本级别ButtonbtnAddSubText增长为子级别ButtonbtnSaveText保存修改ButtonbtnDelText删除为frmDepManage类添加如下两个私有变量。PrivatedvListAsDataView'编码位数PrivateiBitsAsInteger=12选择【文献】|【添加新项】命令添加一个名为“TreNodeData.vb”的类文献,并将“TreNodeData.vb”中的内容替换为以下内容。'TreeNodeData类是用来保存与某个TreeView节点(TreeNode)相关的数据PublicClassTreeNodeData'以下是TreeNodeData六个共有变量PublicAbsIndexAsStringPublicItemIndexAsStringPublicItemLevelAsStringPublicParentIndexAsStringPublicKindCodeAsStringPublicDepCodeAsString'TreeNodeData类的构造函数SubNew(ByValsAbsIndexAsString,_ByValsItemIndexAsString,_ByValsItemLevelAsString,_ByValsParentIndexAsString,_ByValsKindCodeAsString,_ByValsDepCodeAsString)AbsIndex=sAbsIndexItemIndex=sItemIndexItemLevel=sItemLevelParentIndex=sParentIndexKindCode=sKindCodeDepCode=sDepCodeEndSubEndClass为frmDepManage类添加私有函数InitTree。'InitTree是用递归方法初始化TreeView控件的节点PrivateSubInitTree(ByRefnodesAsTreeNodeCollection,_ByValsParentIndexAsString)TryDimtmpNodeAsTreeNodeDimabsIndexAsStringDimdvTempAsDataView=dvList.Table.DefaultView'选出数据源中ParentIndex为sParentIndex数据行DimdataRows()AsDataRow=_dvList.Table.Select("ParentIndex='"+sParentIndex+"'")'循环添加TreeNodeForEachdrAsDataRowIndataRows'获得节点所需数据tmpNode=NewTreeNodetmpNode.Text=dr("类别")'用TreeNode的Tag属性保存与此节点相关的数据tmpNode.Tag=CType(NewTreeNodeData(dr("AbsIndex"),_dr("ItemIndex"),dr("ItemLevel"),_dr("ParentIndex"),dr("类别号"),dr("单位编号")),Object)absIndex=dr("AbsIndex")'添加节点nodes.Add(tmpNode)'递归调用InitTree(nodes(nodes.Count-1).Nodes,absIndex)NextCatchexAsExceptionMessageBox.Show("初始化TreeView失败")EndTryEndSub为窗体frmDepManage的Load事件添加事件响应代码。PrivateSubfrmDepManage_Load(ByValsenderAsObject,_ByValeAsSystem.EventArgs)HandlesMyBase.LoadDimdbAsDataBase=NewDataBaseDimstrSQLAsStringstrSQL="select*from组织机构编码表orderbyabsIndex"dvList=db.RunSelectSQL(strSQL)db.Dispose()'初始化TreeView控件的各个节点InitTree(trvList.Nodes,"-1")EndSub为按钮btnModify的click事件添加事件响应代码。PrivateSubbtnModify_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnModify.Click'判断修改条件IftxbLKindCode.Text.Trim().Length=0_OrtxbDepCode.Text.Trim.Length=0ThenExitSubEndIf'获得当前选中的节点DimtmpNodeAsTreeNode=trvList.SelectedNode'对编码进行验证DimsTmpAsString=txbLKindCode.Text.TrimtmpNode=tmpNode.ParentWhiletmpNodeIsNothing=FalsesTmp=CType(tmpNode.Tag,TreeNodeData).KindCode.Trim+sTmptmpNode=tmpNode.ParentEndWhileIfsTmp.Trim.Length>iBitsThen'编码超长删除节点trvList.SelectedNode.Remove()MessageBox.Show("编码超长,已被删除!")Else'编码符合规定,修改相应节点trvList.SelectedNode.Text=txbName.Text.TrimCType(trvList.SelectedNode.Tag,TreeNodeData).KindCode=_txbLKindCode.Text.Trim()CType(trvList.SelectedNode.Tag,TreeNodeData).DepCode=_sTmpMe.txbDepCode.Text=sTmpEndIfEndSub为按钮btnAddBss的Click事件添加事件响应代码。PrivateSubbtnAddBas_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnAddBas.ClickIftxbLKindCode.Text.Trim().Length=0_OrtxbDepCode.Text.Trim.Length=0ThenExitSubEndIfDimtmpNodeAsTreeNodeIftxbLKindCode.Text.Trim.Length>iBitsThenMessageBox.Show("编码超长,已被删除!")ElsetmpNode=NewTreeNode(Me.txbName.Text.Trim)trvList.Nodes.Add(tmpNode)'设立新增节点的相关数据tmpNode.Tag=_CType(NewTreeNodeData("",tmpNode.Index.ToString,"0",_"-1",Me.txbLKindCode.Text.Trim,_Me.txbLKindCode.Text.Trim),Object)EndIfEndSub为按钮btnAddEql的Click事件添加事件响应代码。PrivateSubbtnAddEql_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnAddEql.ClickIftxbLKindCode.Text.Trim().Length=0_OrtxbDepCode.Text.Trim.Length=0ThenExitSubEndIfDimtmpNodeAsTreeNode=trvList.SelectedNodeDimsTmpAsString=txbLKindCode.Text.TrimtmpNode=tmpNode.ParentWhiletmpNodeIsNothing=FalsesTmp=CType(tmpNode.Tag,TreeNodeData).KindCode.Trim+sTmptmpNode=tmpNode.ParentEndWhileIfsTmp.Trim.Length>iBitsThenMessageBox.Show("编码超长,已被删除!")ElsetmpNode=NewTreeNode(Me.txbName.Text.Trim)trvList.SelectedNode.Parent.Nodes.Add(tmpNode)tmpNode.Tag=_CType(NewTreeNodeData("",tmpNode.Index.ToString,"",_"",Me.txbLKindCode.Text.Trim,sTmp),Object)EndIfEndSub为按钮btnAddSub的Click事件添加事件响应代码。PrivateSubbtnAddSub_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnAddSub.ClickIftxbLKindCode.Text.Trim().Length=0_OrtxbDepCode.Text.Trim.Length=0ThenExitSubEndIfDimtmpNodeAsTreeNode=trvList.SelectedNodeDimsTmpAsStringsTmp=CType(tmpNode.Tag,TreeNodeData).KindCode.TrimsTmp+=txbLKindCode.Text.TrimtmpNode=tmpNode.ParentWhiletmpNodeIsNothing=FalsesTmp=CType(tmpNode.Tag,TreeNodeData).KindCode.Trim+sTmptmpNode=tmpNode.ParentEndWhileIfsTmp.Trim.Length>iBitsThenMessageBox.Show("编码超长,已被删除!")ElsetmpNode=NewTreeNode(Me.txbName.Text.Trim)trvList.SelectedNode.Nodes.Add(tmpNode)tmpNode.Tag=_CType(NewTreeNodeData("",tmpNode.Index.ToString,"",_"",Me.txbLKindCode.Text.Trim,sTmp),Object)EndIfEndSub为frmDepManage类添加私有函数SaveTreeView。'SaveTreeView是用递归方法保存TreeView控件的节点'要注意nodes,result,absIndex三个参数都是Byref而不是ByValPrivateSubSaveTreeView(ByRefnodesAsTreeNodeCollection,_ByRefresultAsString,ByRefabsIndexAsInteger)'判断节点的Nodes集合是否为空Ifnodes.Count=0ThenReturnEndIfForEachtmpNodeAsTreeNodeInnodes'以下是要组合SQL语句result+="insertinto组织机构编码表(类别,单位名称,"result+="AbsIndex,ItemIndex,ItemLevel,"result+="ParentIndex,类别号,"result+="单位编号)values('"+tmpNode.Text+"','"result+=tmpNode.Text+"',"'AbsIndexabsIndex+=1'给treenode赋absIndexCType(tmpNode.Tag,TreeNodeData).AbsIndex=_absIndex.ToString.Trim()result+=absIndex.ToString.Trim+","'ItemIndexresult+=tmpNode.Index.ToString.Trim+","'ItemLevelIftmpNode.ParentIsNothingThenCType(tmpNode.Tag,TreeNodeData).ItemLevel="0"result+="0"Elseresult+=(CInt(CType(tmpNode.Parent.Tag,_TreeNodeData).ItemLevel)+1).ToString.Trim'给treenode赋ItemLevelCType(tmpNode.Tag,TreeNodeData).ItemLevel=_CInt(CType(tmpNode.Parent.Tag,_TreeNodeData).ItemLevel)+1EndIf'ParentIndexresult+=","IftmpNode.ParentIsNothingThenCType(tmpNode.Tag,TreeNodeData).ParentIndex="-1"result+="-1"Elseresult+=CType(tmpNode.Parent.Tag,_TreeNodeData).AbsIndex.Trim'给treenode赋ParentIndexCType(tmpNode.Tag,TreeNodeData).ParentIndex=_CType(tmpNode.Parent.Tag,TreeNodeData).AbsIndexEndIfresult+=",'"result+=CType(tmpNode.Tag,_TreeNodeData).KindCode.Trim+"','"result+=CType(tmpNode.Tag,_TreeNodeData).DepCode.Trim+"')"'递归调用SaveTreeView(tmpNode.Nodes,result,absIndex)NextEndSub为按钮btnSave的Click事件添加事件响应代码。PrivateSubbtnSave_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnSave.ClickDimresultAsString=""DimabsIndexAsInteger=-1DimdbAsDataBase=NewDataBase'执行保存TreeView的SQL语句DimstrSQLAsString="begintran"TrystrSQL+="select*intozzjgtempfrom组织机构编码表"strSQL+="go"strSQL+="deletefrom组织机构编码表"db.RunDelOrInsSQL(strSQL)SaveTreeView(Me.trvList.Nodes,result,absIndex)db.RunDelOrInsSQL(result)strSQL="update组织机构编码表set拼音编码=b.拼音编码,"strSQL+="单位地址=b.单位地址,单位电话号码=b.单位电话号码,"strSQL+="开户银行=b.开户银行,帐号=b.帐号,开户全称=b.开户全称"strSQL+="from组织机构编码表asa,zzjgtempasb"strSQL+="wherea.单位编号=b.单位编号"strSQL+="droptablezzjgtemp"strSQL+="commit"db.RunDelOrInsSQL(strSQL)CatchexAsExceptionMessageBox.Show("保存失败,编码反复或位数超长!")db.RunDelOrInsSQL("rollback")EndTrydb.Dispose()EndSub为按钮btnDel的Click事件添加事件响应代码。PrivateSubbtnDel_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnDel.ClickMe.trvList.SelectedNode.Remove()EndSub到此就完毕了机构设立及编码的功能。46实现机构具体信息功能前面建立了机构设立及编码功能,用于设立机构的层级关系,但该功能并没有实现结构其他信息的维护功能,如联系电话、地址等。通过机构具体功能,可以维护组织机构的其他信息。新建一个窗体,将其Name属性改为“frmDepInfo”,并为其添加如图8所示的控件。图8机构具体信息窗体部分控件的属性设立如表5所示。表5机构具体信息窗体控件属性设立控件类型对象名属性取值(说明)FromfrmDepInfoText机构具体信息DataGriddgdDepInfoDockFillDataGriddgdDepInfoCaptionVisiableFalseImageListImageList1Images请参考图ToolBarToolBar1Buttons请参考图ToolBarToolBar1ImagelistImagelist1从工具箱中拖动一个SalDatadapter
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 61196-1-102:2025 RLV EN Coaxial communication cables - Part 1-102: Electrical test methods - Test for insulation resistance of cable dielectric
- 【正版授权】 IEC 61225:2025 EN Nuclear power plants - Instrumentation,control and electrical power systems - Requirements for static uninterruptible DC and AC power supply systems
- 小学生心理健康直面青春期
- 健康素养课件模板下载
- 半导体技术课件第八
- 健康管理师招生课件
- 白慕大行业深度研究分析报告(2024-2030版)
- 新建氮化镓外延片项目可研报告-图文
- 中国仲丁灵行业市场调研及未来发展趋势预测报告
- 中国核磁共振成像行业市场调查研究及投资前景预测报告
- 2025年陕西延长石油招聘笔试备考题库(带答案详解)
- 初一英语时态专题复习(附答案)
- 2022年上高县教师进城考试笔试题库及答案解析
- 质量管理手册(隧道)(中交路桥建设有限公司)
- 黄大年式教学团队申报材料
- 出香港货物发票样板样本空白
- 医院免疫室标准化操作程序免疫室内质量控制操作指南(ELISA)人民医院检验科免疫SOP人民医院质量管理体系课件
- 柳州市柳东新区南庆安置区项目工程基坑支护方案
- 卵巢肿瘤ppt课件
- 发电可靠性考试真题及答案
- 工程塑料 第七章特种工程塑料
评论
0/150
提交评论