企业工资管理系统精品课件.pptx
本章主要介绍如何使用VFP建立企业工资管理系统。内容包括功能设计、数据库和表设计,自定义函数、多种方式显示数据、表单之间的数据传递、数据缓冲、菜单和工具栏协调等。,第9章.企业工资管理系统,9.1系统功能设计,功能模块图,运行salary.exe,完成系统登录,用户名:Admin,密码:sysadmin,打开系统主表单,如下图:包含菜单、工具栏、状态栏。,9.1.1系统管理模块,系统管理功能下面的系统设置用于录入公司名称、个税起征点。,.系统设置,信息设置-所得税率:设置税率、起征点,录入工资可以计算个人所得税额。,9.1.2信息设置模块,用于设置学历、职务、民族、政治面貌,这些信息在员工信息设置、惩罚、奖励记录管理时作为选项。,信息设置.基础信息,员工管理-部门信息:只支持一级部门,可以在表格中查看属于该部门的员工信息。,9.1.3员工管理,该表单可以完成浏览、新增、修改、删除员工信息操作,单击显示钮可以改变表格中显示方式。,员工管理.员工信息,在员工信息表单中双击员工图标可以调出本表单。,.员工信息设定,工资管理-工资统计发放:“统计”钮用于统计员工工资,系统日期是10号前统计上个月工资,28号以后统计本月工资。,9.1.4工资管理,录入经手人后单击“发放”可完成工资发放的记录,选中打印工资条后可打印工资条。,工资管理.工资统计发放.工资条,可按照员工编号、姓名、部门、工资月份查询工资发放记录,结果可打印。,工资管理.工资发放查询,企业工资管理系统包括部门信息、员工信息、系统管理等操作,使用的表较多,以下分模块说明。,9.2数据库设计,系统管理主要包括系统设置、用户管理、系统登录和修改密码等功能,主要涉及2个表:系统设置表(SysInfo)和用户信息表(Users)。,9.2.1系统管理,1.系统设置表,系统设置表(SysInfo),用户信息表(Users),2.用户信息表,信息设置模块中包括学历名称、职务名称、民族名称、和政治面貌名称、个人所得税率等。,9.2.2信息设置,1.学历名称,2.职务名称,3.民族名称,4.政治面貌表,5.所得税率表,员工管理模块数据表主要有个人信息和工资信息、部门信息表。,9.2.3员工管理,1.部门信息,2.员工信息-1/2,.员工信息-2/2,3.员工工资,工资管理包括工资统计发放和发放查询,涉及数据表为:工资记录表。该表用来保存员工工资统计的发放情况。,9.2.4工资管理,.工资记录表-1/2,.工资记录表-2/2,企业工资管理系统中的可视类有:MyCmd、MyMove、MyControl、MyAdmin和MoreAdmin,9.3设计可视类,创建企业工资管理系统项目的步骤:文件-新建-项目-新建文件-文件名:salary,保存位置:个人文件夹-保存。创建企业工资管理系统数据库的步骤:项目管理器-数据-数据库-新建-新建数据库-文件名:salary,保存位置:个人文件夹DATA-保存;创建企业工资管理系统数据表的步骤:选择salary下面的表-新建-新建表-确认文件名和保存位置后,依次编辑保存表结构信息,9.3.1创建项目与数据库,步骤:项目管理器/类库/新建/类名:MyCmd,派生于:CommandButton,存储于:MyTools/确定/在打开的类设计器编辑按钮的属性。属性:Caption=按钮FontName=楷体_GB2312FontSize=16ForeColor=RGB(0,0,0)Height=30Width=60,9.3.2创建MyCmd类,MyCmd.MouseMove过程:LPARAMETERS nButton, nShift,;nXCoord, nYCoord*如果按钮可用IF THIS.Enabled = .T. *使用自定义鼠标指针 This.MousePointer = 99 *指定自定义鼠标指针 This.MouseIcon = hHand.curENDIF,在项目管理器中建立左图所示的类MyMove,基于:Container。为该类添加四个MyCmd控件对象。操作方法:点表单控件中“查看类”/添加/找开类库MyTools/在控件工具栏上找到MyCmd,拖画到界面。设置对象名分别为CmdTop、CmdPre、CmdNxt、CmdBtm,修改对应的Captiont和ToolTipText的值如“首记录”和“到第一条记录”、“上记录”和“到上一条记录”、“下记录”和“到下一条记录”、“末记录”和“到最后一条记录”。添加事件过程如下:,9.3.3创建MyMove类,GO TOP&到首记录THISFORM.REFRESH&刷新表单,.CmdTop.Click,*如果到了数据表首部IF BOF() .OR. RECNO() = 1 MessageBox(已到首记录,48,人力资源管理系统)ELSE*如果数据指针不位于数据表首部 SKIP-1ENDIF*刷新表单THISFORM.REFRESH,.CmdPre.Click,*如果记录指针位于数据表末尾IF EOF() or RecNO() = RecCount() MessageBox(已到末记录,48,人力资源管理系统)*如果记录指针不位于数据表末尾ELSE*记录指针下移 SKIPENDIF*刷新表单THISFORM.REFRESH,.CmdNxt.Click,GO BOTTOM &到数据表末尾THISFORM.REFRESH&刷新表单,.CmdBtm.Click,*如果数据表为空或者只有一条记录IF BOF() .AND. EOF() .OR. RECCOUNT()=1 THIS.Cmdtop.ENABLED=.F. THIS.Cmdpre.ENABLED=.F. THIS.Cmdnxt.ENABLED=.F. THIS.Cmdbtm.ENABLED=.F. ReturnENDIF*如果在记录指针在数据表的末尾IF RECNO()=RECCOUNT() .OR. EOF()THIS.Cmdtop.ENABLED=.T.THIS.Cmdpre.ENABLED=.T.THIS.Cmdnxt.ENABLED=.F.THIS.Cmdbtm.ENABLED=.F.RETURNENDIF,.MyMove.Refresh,*如果记录指针在数据表的首部IF RECNO()=1 .OR. BOF()THIS.Cmdtop.ENABLED=.F.THIS.Cmdpre.ENABLED=.F.THIS.Cmdnxt.ENABLED=.T.THIS.Cmdbtm.ENABLED=.T.RETURNENDIF*如果记录指针不在数据表的首部*也不在尾部THIS.Cmdtop.ENABLED=.T.THIS.Cmdpre.ENABLED=.T.THIS.Cmdnxt.ENABLED=.T.THIS.Cmdbtm.ENABLED=.T.,类名:MyAdmin 基类:Container存储:MyTools步骤:在该类的设计器窗口内添加7个MyCmd类对象。对象名依次为:CmdNew/CmdModify/CmdDel/CmdSer/CmdSave/CmdCcl/CmdExit。Caption、ToolTipText属性值参照下图自行定义。该类中只添加“退出”钮的Click过程,其他为空。*CmdExit.ClickLOCAL YNYN=MESSAGEBOX(确定退出,4+32,本系统)IF YN=6THISFORM.RELEASEENDIF,9.3.4创建MyAdmin类,类名:MoreAdmin 基类:Container存储:MyTools步骤:在该类的设计器窗口内添加7个MyCmd类对象。对象名依次为:CmdNew/CmdModify/CmdDel/CmdSer/CmdSave/CmdCcl/CmdExit。Caption、ToolTipText属性值参照左图自行定义。该类中只添加“退出”钮的Click过程,其他为空。*CmdExit.ClickLOCAL YNYN=MESSAGEBOX(确定退出,4+32,本系统)IF YN=6THISFORM.RELEASEENDIF,9.3.5创建MoreAdmin类,类名:MyControl基类:Container类库:MyTools创建步骤:向该类中添加5个MyCmd对象,对象名:CmdNew,CmdModify,CmdDelete,CmdRefresh,CmdExit,分别设置其Caption,ToolTipText属性值“新增、增加新记录”、“修改、修改当前记录”、“删除、删除当前记录”、“刷新、刷新显示”、“退出、退出当前表单”,9.3.6创建MyControl类,企业工资管理系统需要自定义的函数包括:AutoInc字符串数自动增1DateToString日期转换为YYYY/MM/DD形式的串EnCode将给定的串与数值异或后返回ITaxComp计算个人所得税,9.4创建通用函数,*“AutoInc”函数* 作用:使“000000XX”形式的编号自动加1* 接收“0000XX”形式的字符串作为参数* 字符串长度限制为10,9.4.1AutoInc,FUNCTION autoinc(nCode)*获取字符串长度nLen=Len(nCode)*将字符型转换为数值型,即获取非0部分的数值nCode = VAL(nCode)*非0部分数字加1nCode = nCode + 1*转换为字符型nCode = ALLTRIM(STR(nCode),AutoInc.prg-1/2,*获取转换后的字符串的长度nLength = LEN(nCode)*在数字之前加上前置“0”nZero=000000000000nCode = SUBSTR(nZero,1,nLen-nLength) + nCode*返回结果RETURN nCodeENDFUNC,AutoInc.prg-2/2,*“DateToString”函数* 将日期型数据转换为字符串* 接收日期型变量作为参数,9.4.2DateToString,*“DateToString”函数* 将日期型数据转换为字符串* 接收日期型变量作为参数FUNCTION DateToString(dDate)*默认返回空字符串sDate = *如果参数非空而且为日期型IF .NOT. EMPTY(dDate) .AND. VARTYPE(dDate) = D*分别获取其年、月、日字段nYear = YEAR(dDate)nMonth = MONTH(dDate),DateToString.prg-1/2,nDay = DAY(dDate)*组合数据sDate = ALLTRIM(STR(nYear)+/+ALLTRIM(STR(nMonth)+/+ALLTRIM(STR(nDay)sDate = +sDate +ENDIF*返回值RETURN sDateENDFUNC,DateToString.prg-22,*函数Encode*作用:对输入的指定的字符串进行编码*参数:sStr:要编码或者解码的字符串* nCode:编码或者解码时使用的密钥,9.4.3Encode,FUNCTION ENCODE(sStr,nCode)*声明需要使用的本地变量LOCAL sTmpStr,cTempChr,i*sTempStr:用来保存昨时的编码或者解码后的字符串*cTempChr:用来保存编码或者解码后的字符*i:循环计数*对变量赋初值sTempStr = cTempChr = ,Encode.prg-1/2,*如果未指定密钥IF nCode = 0nCode = 237ENDIF*对字符串的每个字符进行编码FOR i = 1 TO LEN(ALLTRIM(sStr)cTempChr = BITXOR(ASC(SUBSTR(sStr,i,1),nCode)sTempStr = sTempStr+ CHR(cTempChr)ENDFOR*返回编码后的结果RETURN sTempStrENDFUNC,Encode.prg-2/2,*“ITaxComp”函数*功能:根据个人所得税率表和系统信息表计算个个人所得税额*参数:nNum,月收入总额* nBeg,个人所得税起征点,如果该参数为-1则使用“SysInfo”表的设置*返回值:个人所得税额,9.4.4ITaxComp,在调试程序时,应该先在表taxRate中录入如下数据。,.个人所得税率表初始数据,*“ITaxComp”函数*功能:根据个人所得税率表和系统信息表计算个* 个人所得税额*参数:nNum,月收入总额* nBeg,个人所得税起征点,如果该参数为-1* 则使用“SysInfo”表的设置*返回值:个人所得税额FUNCTION ITaxComp(nNum, nBeg)*如果不指定个人所得税起征点IF nBeg = -1*获取免税工资noTax = 0,ITaxComp.prg-1/4,*如果表“SysInfo”没有打开IF !Used(SysInfo)*打开表USE SysInfoSELECT SysInfo*获取个税起征点noTax = SysInfo.个税起征点USEENDIF*减去不用计税部分nNum = nNum - noTaxELSE,ITaxComp.prg-2/4,nNum = nNum - nBegENDIF*如果工资未到起征点IF nNum 0RETURN 0ENDIF*如果没有打开“个人所得税率”表IF !Used(TaxRate)USE TaxRateENDIF*查找工资级别,ITaxComp.prg-3/4,SELECT TaxRateLOCATE FOR nNum 工资下限 .AND. nNum = 工资上限IF FOUND()*如果找到,计算税收ITaxNum = nNum * 所得税率 * 0.01 - 速算扣除数ELSE*如果未找到,为-1ITaxNum = -1ENDIFRETURN ITaxNum &返回值ENDFUNC,ITaxComp.prg-4/4,作用:信息设置模块用来设置系统中部分数据项的可选项,确保数据的有效性和规范性。功能划分:信息设置模块包括基础信息设置和所得税率查看两个功能。表单组成:基础信息设置、输入新值、所得税率查看。,9.5信息设置模块,基础信息设置主要设置学历、职务、民族和政治面貌。表单名:BasicInfo在表单中添加一个页框控件PageInfo,设置PageCount=4TabStretch=0-多重行TabStyle=0-两端每个页面添加1个文本框、1个列表框、1个MyControl对象,精确定位。,9.5.1创建基础信息设置表单,数据环境如右图所示其中除personel表之外,其他表设置如下属性:Exclusive=.T.,.数据环境,*接收表单参数PARAMETERS nPage*如果没有接收到表单参数IF VARTYPE(nPage) = L*激活第1个选项卡sPage = 1ELSE*如果参数过大 IF nPage THISFORM.MainCon.InfoPage.PAGECOUNTsPage = 1,.添加代码.表单basicInfo.Init-1/2,ELSE*激活指定的选项卡sPage = nPageENDIFENDIF*激活选项卡THISFORM.MainCon.InfoPage.ACTIVEPAGE = sPage*刷新表单THISFORM.REFRESH,.表单basicInfo.Init-2/2,SELECT AcademySET FILTER TO &清除可能存在的过滤条件THIS.DataList.CLEAR &清除列表*循环在列表框中添加列表项SCANTHIS.DataList.ADDITEM(学历)ENDSCAN*选中第1项IF THIS.DataList.LISTCOUNT 0THIS.DataList.SELECTED(1) = .T.ENDIFTHISFORM.REFRESH &刷新表单,.学历设置页面AcademyPage.Init,IF .NOT. EMPTY(THIS.VALUE)THIS.PARENT.CmdGrp.CmdModify.ClickENDIF,DataList.DblClick,*调用“输入新值”表单获取学历名称sStr = DO FORM Forms/InputNew WITH sStr TO NewValue*如果没有返回学历名称IF EMPTY(ALLTRIM(NewValue)RETURNENDIF*检查要新增的学历名称是否已经存在SELECT AcademyCOUNT FOR 学历 = NewValue TO RecNum,CmdNew.Click-1/2,IF RecNum 0MESSAGEBOX(学历名称已经存在, 48, 企业工资管理系统)RETURNENDIF*更新记录INSERT INTO Academy VALUES(NewValue)*更新列表框THIS.PARENT.PARENT.DataList.ADDITEM(NewValue)*刷新记录THIS.PARENT.REFRESH,CmdNew.Click-2/2,*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.LISTCOUNT 1MESSAGEBOX(没有可以修改的项, 48, 企业工资管理系统)THIS.PARENT.CmdNew.SETFOCUSRETURNENDIF*检查列表框中是否有列表项被选中bSel = .F.nSel = -1sStr = ,CmdModify.Click-1/4,*循环找出被选择的列表项FOR nCnt = 1 TO THIS.PARENT.PARENT.DataList.LISTCOUNT *如果被选中了 IF THIS.PARENT.PARENT.DataList.SELECTED(nCnt) *标识被选中,保存其索引值 bSel = .T. nSel = nCnt sStr = THIS.PARENT.PARENT.DataList.LIST(nCnt) EXIT ENDIFENDFOR,CmdModify.Click-2/4,*如果没有选中的列表项弹出对话框IF bSel = .F.MESSAGEBOX(请选择要修改的列表项, 48, 企业工资管理系统)THIS.PARENT.PARENT.DataList.SETFOCUSRETURNENDIF*如果选择了列表项IF bSel = .T. *调用“输入新值”对话框输入新的值 DO FORM FORMS/InputNew WITH sStr TO newValue *如果输入了新的值,CmdModify.Click-3/4,IF .NOT. EMPTY(newValue) .AND. .NOT. newValue = sStr *检查要修改的学历名称是否已经存在SELECT AcademyCOUNT FOR 学历 = NewValue TO RecNumIF RecNum 1*更新记录UPDATE Academy SET 学历 = newValue WHERE 学历 = sStr*更新列表项THIS.PARENT.PARENT.DataList.LIST(nSel) = newValueENDIF ENDIFENDIF,CmdModify.Click-4/4,*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.LISTCOUNT 1MESSAGEBOX(没有可以删除的项, 48, 企业工资管理系统)THIS.PARENT.CmdNew.SETFOCUSRETURNENDIF*初始值bSel = .F.nSel = -1,CmdDelete.Click-1/5,*检查列表框中是否有列表项被选中FOR nCnt = 1 TO THIS.PARENT.PARENT.DataList.LISTCOUNTIF THIS.PARENT.PARENT.DataList.SELECTED(nCnt)bSel = .T.nSel = nCnt*退出循环EXITENDIFENDFOR,CmdDelete.Click-2/5,*如果没有选中的列表项弹出对话框IF bSel = .F.MESSAGEBOX(请选择要删除的列表项, 48, 企业工资管理系统)THIS.PARENT.PARENT.DataList.SETFOCUSRETURNENDIF*如果选中ItemName = THIS.PARENT.PARENT.DataList.LIST(nSel),CmdDelete.Click-3/5,*检测是否有员工的学历为该项rNum = -1SELECT PersonnelCOUNT FOR 学历 = ItemName TO rNumIF rNum 0MESSAGEBOX(有员工使用该选项, 48, 企业工资管理系统)RETURNENDIF,CmdDelete.Click-4/5,*确认对话框YN = MESSAGEBOX(是否要删除列表项+ CHR(13) + ItemName, 4+32 ,企业工资管理系统)IF YN = 6*删除记录DELETE FROM Academy WHERE 学历 = ItemNameSELECT AcademyPACK*刷新显示THIS.PARENT.PARENT.DataList.REMOVEITEM(nSel)ENDIF,CmdDelete.Click-5/5,THIS.PARENT.PARENT.INIT,CmdRefresh.Click,SELECT DutySET FILTER TOTHIS.DataList.CLEARSCANTHIS.DataList.ADDITEM(职务名称)ENDSCANIF THIS.DataList.LISTCOUNT 1THIS.DataList.SELECTED(1) = .T.ENDIF,.职务设置页面DutyPage.Init,IF .NOT. EMPTY(THIS.VALUE)THIS.PARENT.CmdGrp.CmdModify.ClickENDIF,DataList.DblClick,*调用“输入新值”表单获取职务名称sStr = DO FORM FORMS/InputNew WITH sStr TO NewValue*如果没有返回职务名称IF EMPTY(ALLTRIM(NewValue)RETURNENDIF*检查要新增的学历名称是否已经存在SELECT DutyCOUNT FOR 职务名称 = NewValue TO RecNum,CmdNew.Click-1/2,IF RecNum 0MESSAGEBOX(职务名称已经存在, 48, 企业工资管理系统)RETURNENDIF*添加记录INSERT INTO Duty VALUES(NewValue)*列表框中添加项THIS.PARENT.PARENT.DataList.ADDITEM(NewValue)*刷新记录THIS.PARENT.REFRESH,CmdNew.Click-2/2,*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.LISTCOUNT 1MESSAGEBOX(没有可以修改的项, 48, 企业工资管理系统)THIS.PARENT.cmdnew.SETFOCUSRETURNENDIF*检查列表框中是否有列表项被选中bSel = .F.nSel = 0sStr = ,CmdModify.Click-1/4,FOR nCnt = 1 TO THIS.PARENT.PARENT.DataList.LISTCOUNTIF THIS.PARENT.PARENT.DataList.SELECTED(nCnt)bSel = .T.nSel = nCntENDIFENDFORsStr = THIS.PARENT.PARENT.DataList.LIST(nSel),CmdModify.Click-2/4,IF bSel = .F. &如果没有选中的列表项弹出对话框 MESSAGEBOX(请选择要修改的列表项, 48, 企业工资管理系统) THIS.PARENT.PARENT.DataList.SETFOCUS RETURNENDIFIF bSel = .T. &如果选中了列表项DO FORM Forms/InputNew WITH sStr TO NewValueIF .NOT. EMPTY(NewValue) .AND. .NOT. NewValue = sStr*检查要修改的职务名称是否已经存在SELECT DutyCOUNT FOR 职务名称 = NewValue TO RecNum,CmdModify.Click-3/4,IF RecNum 0MESSAGEBOX(职务名称已经存在, 48, 企业工资管理系统) RETURNELSE UPDATE Duty SET 职务名称 = NewValue WHERE 职务名称 = sStr THIS.PARENT.PARENT.DataList.LIST(nSel) = NewValueENDIFENDIFENDIF,CmdModify.Click-4/4,*检查列表框是否为空IF THIS.Parent.Parent.DataList.Listcount 1MESSAGEBOX(没有可以删除的项, 48, 企业工资管理系统)THIS.Parent.cmdnew.setfocusRETURNENDIF*初始值bSel = .F.nSel = -1ItemName = ,CmdDelete.Click-1/5,*检查列表框中是否有列表项被选中FOR nCnt = 1 TO THIS.PARENT.PARENT.DataList.LISTCOUNTIF THIS.PARENT.PARENT.DataList.SELECTED(nCnt)bSel = .T.nSel = nCnt*退出循环EXITENDIFENDFOR,CmdDelete.Click-2/5,*如果没有选中的列表项弹出对话框IF bSel = .F.MESSAGEBOX(请选择要删除的列表项, 48, 企业工资管理系统)THIS.PARENT.PARENT.DataList.SETFOCUSRETURNENDIF*如果选中ItemName = ALLTRIM(THIS.PARENT.PARENT.DataList.LIST(nSel)*检测是否有员工的职务为该项rNum = -1,CmdDelete.Click-3/5,SELECT PersonnelCOUNT FOR 职务 = ItemName TO rNumIF rNum 0MESSAGEBOX(有员工使用该选项, 48, 企业工资管理系统)RETURNENDIF*确认对话框YN = MESSAGEBOX(是否要删除列表项+ CHR(13) + ItemName, 4+32 ,企业工资管理系统),CmdDelete.Click-4/5,IF YN = 6*删除记录DELETE FROM Duty WHERE ALLTRIM(职务名称) = ItemNameSELECT DutyPACK*刷新显示THIS.PARENT.PARENT.DataList.REMOVEITEM(nSel)ENDIF,CmdDelete.Click-5/5,THIS.PARENT.PARENT.INIT,CmdRefresh.Click,SELECT PeopleSET FILTER TOTHIS.DataList.ClearSCANTHIS.DataList.additem(民族)ENDSCANIF THIS.DataList.LISTCOUNT 1THIS.DataList.SELECTED(1) = .T.ENDIF,.民族设置PeoplePage.Init,IF .NOT. EMPTY(THIS.VALUE)THIS.PARENT.CmdGrp.CmdModify.ClickENDIF,DataList.DblClick,*调用“输入新值”表单获取民族名称sStr = DO FORM FORMS/InputNew WITH sStr TO NewValue*如果没有返回民族名称IF EMPTY(ALLTRIM(NewValue)RETURNENDIF*检查要新增的名称是否已经存在SELECT PeopleCOUNT FOR 民族 = NewValue TO RecNum,CmdNew.Click-1/2,IF RecNum 0MESSAGEBOX(民族名称已经存在, 48, 企业工资管理系统)RETURNENDIF*添加记录INSERT INTO People VALUES(NewValue)*列表框中添加选项THIS.PARENT.PARENT.DataList.ADDITEM(NewValue)*刷新显示THIS.PARENT.REFRESH,CmdNew.Click-2/2,*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.LISTCOUNT 1MESSAGEBOX(没有可以修改的项, 48, 企业工资管理系统)THIS.PARENT.CmdNew.SETFOCUSRETURNENDIF*检查列表框中是否有列表项被选中bSel = .F.sStr = nSel = 0,CmdModify.Click-1/4,FOR nCnt = 1 TO THIS.PARENT.PARENT.DataList.LISTCOUNTIF THIS.PARENT.PARENT.DataList.SELECTED(nCnt)bSel = .T.sStr = THIS.PARENT.PARENT.DataList.LIST(nCnt)nSel = nCntExitENDIFENDFOR,CmdModify.Click-2/4,*如果没有选中的列表项弹出对话框IF bSel = .F.MESSAGEBOX(请选择要修改的列表项, 48, 企业工资管理系统)THIS.PARENT.PARENT.DataList.SETFOCUSRETURNENDIF*如果选中了列表项IF bSel = .T.DO FORM Forms/InputNew WITH sStr TO NewValueIF .NOT. EMPTY(NewValue) .AND. .NOT. NewValue = sStr,CmdModify.Click-3/4,*检查要修改的民族名称是否已经存在SELECT PeopleCOUNT FOR 民族 = NewValue TO RecNumIF RecNum 0MESSAGEBOX(民族名称已经存在, 48, 企业工资管理系统) RETURNELSEUPDATE People SET 民族 = NewValue WHERE 民族 = sStrTHIS.PARENT.PARENT.DataList.LIST(nSel) = NewValueENDIF ENDIFENDIF,CmdModify.Click-4/4,*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.LISTCOUNT 1MESSAGEBOX(没有可以删除的项, 48, 企业工资管理系统)THIS.PARENT.cmdnew.SETFOCUSRETURNENDIF*初始值bSel = .F.nSel = -1,CmdDelete.Click-1/5,*检查列表框中是否有列表项被选中FOR nCnt = 1 TO THIS.PARENT.PARENT.DataList.LISTCOUNTIF THIS.PARENT.PARENT.DataList.SELECTED(nCnt)bSel = .T.nSel = nCnt*退出循环EXITENDIFENDFOR,CmdDelete.Click-2/5,*如果没有选中的列表项弹出对话框IF bSel = .F.MESSAGEBOX(请选择要删除的列表项, 48, 企业工资管理系统)THIS.PARENT.PARENT.DataList.SETFOCUSRETURNENDIF*如果选中ItemName = THIS.PARENT.PARENT.DataList.LIST(nSel)*检测是否有员工的职务为该项rNum = -1SELECT PersonnelCOUNT FOR 民族 = ItemName TO rNum,CmdDelete.Click-3/5,IF rNum 0MESSAGEBOX(有员工使用该选项, 48, 企业工资管理系统)RETURNENDIF*确认对话框YN = MESSAGEBOX(是否要删除列表项+ CHR(13) + ItemName, 4+32 ,企业工资管理系统),CmdDelete.Click-4/5,IF YN = 6*删除记录DELETE FROM People WHERE 民族 = ItemNameSELECT PeoplePACK*刷新显示THIS.PARENT.PARENT.DataList.REMOVEITEM(nSel)THISFORM.REFRESHENDIF,CmdDelete.Click-5/5,THIS.PARENT.PARENT.INIT,CmdRefresh.Click,SELECT PoliticalSET FILTER TOTHIS.DataList.clearSCANTHIS.DataList.additem(政治面貌)ENDSCANIF THIS.DataList.LISTCOUNT 1THIS.DataList.SELECTED(1) = .T.ENDIF,.政治面貌PoliticalPage.Init,IF .NOT. EMPTY(THIS.VALUE)THIS.PARENT.CmdGrp.CmdModify.ClickENDIF,DataList.DblClick,*调用“输入新值”表单获取职务名称sStr = DO FORM FORMS/InputNew WITH sStr TO NewValue*如果没有返回政治面貌名称IF EMPTY(ALLTRIM(NewValue)RETURNENDIF*检查要新增的名称是否已经存在SELECT PersonnelCOUNT FOR 政治面貌 = NewValue TO RecNum,CmdNew.Click-1/2,IF RecNum 0MESSAGEBOX(政治面貌名称已经存在, 48, 企业工资管理系统)RETURNENDIF*添加记录INSERT INTO Political VALUES(NewValue)*列表框中添加选项THIS.PARENT.PARENT.DataList.ADDITEM(NewValue)*刷新显示THIS.PARENT.REFRESH,CmdNew.Click-2/2,*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.LISTCOUNT 1MESSAGEBOX(没有可以修改的项, 48, 企业工资管理系统)THIS.PARENT.CmdNew.SETFOCUSRETURNENDIF*检查列表框中是否有列表项被选中bSel = .F.sStr = nSel = 0,CmdModify.Click-1/4,FOR nCnt = 1 TO THIS.PARENT.PARENT.DataList.LISTCOUNTIF THIS.PARENT.PARENT.DataList.SELECTED(nCnt)bSel = .T.nSel = nCntEXITENDIFENDFORsStr = THIS.PARENT.PARENT.DataList.LIST(nSel),CmdM