1、本章主要介绍如何使用VFP建立企业工资管理系统。内容包括功能设计、数据库和表设计,自定义函数、多种方式显示数据、表单之间的数据传递、数据缓冲、菜单和工具栏协调等。第第9章章.企业工资管理系统企业工资管理系统9.1系统功能设计系统功能设计企业工资管理系统信息管理信息管理信息管理信息管理基础信息设置个人所得税率员工信息管理部门信息管理工资统计发放发放记录查询系统登录用户管理修改密码关于系统系统设置功能模块图运行salary.exe,完成系统登录,用户名:Admin,密码:sysadmin,打开系统主表单,如下图:包含菜单、工具栏、状态栏。9.1.1系统管理模块系统管理模块系统管理功能下面的系统设置
2、用于录入公司名称、个税起征点。.系统设置系统设置信息设置-所得税率:设置税率、起征点,录入工资可以计算个人所得税额。9.1.2信息设置模块信息设置模块用于设置学历、职务、民族、政治面貌,这些信息在员工信息设置、惩罚、奖励记录管理时作为选项。信息设置信息设置.基础信息基础信息 员工管理-部门信息:只支持一级部门,可以在表格中查看属于该部门的员工信息。9.1.3员工管理员工管理该表单可以完成浏览、新增、修改、删除员工信息操作,单击显示钮可以改变表格中显示方式。员工管理员工管理.员工信息员工信息在员工信息表单中双击员工图标可以调出本表单。.员工信息设定员工信息设定工资管理-工资统计发放:“统计”钮用
3、于统计员工工资,系统日期是10号前统计上个月工资,28号以后统计本月工资。9.1.4工资管理工资管理 录入经手人后单击“发放”可完成工资发放的记录,选中打印工资条后可打印工资条。工资管理工资管理.工资统计发放工资统计发放.工资条工资条可按照员工编号、姓名、部门、工资月份查询工资发放记录,结果可打印。工资管理工资管理.工资发放查询工资发放查询企业工资管理系统包括部门信息、员工信息、系统管理等操作,使用的表较多,以下分模块说明。9.2数据库设计数据库设计系统管理主要包括系统设置、用户管理、系统登录和修改密码等功能,主要涉及2个表:系统设置表(SysInfo)和用户信息表(Users)。9.2.1系
4、统管理系统管理1.系统设置表系统设置表字段名类型宽度 可否为空 说明个税起征点 整型4否普通索引公司名称字符型 40否普通索引系统设置表(SysInfo)用户信息表(Users)2.用户信息表用户信息表字段名类型宽度 可否为空说明用户名字符20否普通索引密码字符20否普通索引姓名字符20否权限整型4否默认值1信息设置模块中包括学历名称、职务名称、民族名称、和政治面貌名称、个人所得税率等。9.2.2信息设置信息设置1.学历名称学历名称学历名称表(学历名称表(Academy)字段名字段名类型类型 宽度宽度可否为空可否为空说明说明学历C20否主索引字段2.职务名称职务名称职务名称表(职务名称表(Du
5、ty)字段名字段名类型类型 宽度宽度可否为空可否为空说明说明职务名称C20否主索引字段3.民族名称民族名称民族名称表(民族名称表(People)字段名字段名类型类型 宽度宽度可否为空可否为空说明说明民族C20否主索引字段4.政治面貌表政治面貌表政治面貌表(政治面貌表(Political)字段名字段名类型类型 宽度宽度可否为空可否为空说明说明政治面貌C20否主索引字段5.所得税率表所得税率表所得税率表(所得税率表(TaxRate)字段名字段名类型类型宽度宽度可否为空可否为空说明说明编号整数4否主索引级数数值2否候选索引工资下限浮动 10,1工资上限浮动 10,1所得税率浮动 10,1速算扣除数
6、浮动 10,1员工管理模块数据表主要有个人信息和工资信息、部门信息表。9.2.3员工管理员工管理1.部门信息部门信息部门信息表(部门信息表(department)字段名字段名类型类型 宽度宽度可否为空可否为空说明说明部门编号C2否主索引字段部门名称C20否2.员工信息员工信息-1/2员工信息表(员工信息表(Personnel)字段名字段名类型类型 宽度宽度可否为空可否为空说明说明员工编号C4否主索引字段姓名C30否性别C2否默认值:男婚否C4否默认值:未婚生日C8部门N2否普通索引职务C20民族C40政治面貌C20学历C20 .员工信息员工信息-2/2员工信息表(员工信息表(Personnel
7、)-续上页续上页字段名字段名类型类型 宽度宽度可否为空可否为空说明说明毕业学校C40电话C11掩码:99999999999入职日期D8合同期限D8通讯地址C60邮政编码C6掩码:999999身份证号C18掩码 :999999999999999999备注M4密码C20否3.员工工资员工工资员工信息表(员工信息表(Personnel)字段名字段名类型类型 宽度宽度可否为空可否为空说明说明员工编号字符4否主索引字段基本工资浮动6,1默认值:0.0岗位工资浮动6,1默认值:0.0浮动工资浮动6,1默认值:0.0奖金浮动6,1默认值:0.0交通补贴浮动6,1默认值:0.0住房补贴浮动6,1默认值:0.0
8、伙食补贴浮动6,1默认值:0.0失业保险浮动6,1默认值:0.0医疗保险浮动6,1默认值:0.0养老保险浮动6,1默认值:0.0公积金浮动6,1默认值:0.0工资管理包括工资统计发放和发放查询,涉及数据表为:工资记录表。该表用来保存员工工资统计的发放情况。9.2.4工资管理工资管理.工资记录表工资记录表-1/2工资记录表(工资记录表(POList)字段名字段名类型类型 宽度宽度可否为空可否为空说明说明结算编号字符6否主索引员工编号字符4否普通索引工资月份字符6否普通索引基本工资浮动6,1岗位工资浮动6,1浮动工资浮动6,1奖金浮动6,1交通补贴浮动6,1住房补贴浮动6,1伙食补贴浮动6,1失业
9、保险浮动6,1医疗保险浮动6,1.工资记录表工资记录表-2/2工资记录表(工资记录表(POList)-续上页续上页字段名字段名类型类型 宽度宽度可否为空可否为空说明说明养老保险浮动6,1公积金浮动6,1奖励金额浮动6,1惩罚金额浮动6,1工资总额浮动6,1应交金额浮动6,1应缴税额浮动6,1所得税额浮动6,1实发金额浮动6,1结算状态字符默认值:否结算日期日期经手人字符企业工资管理系统中的可视类有:MyCmd、MyMove、MyControl、MyAdmin和MoreAdmin9.3设计可视类设计可视类创建企业工资管理系统项目的步骤创建企业工资管理系统项目的步骤:文件-新建-项目-新建文件-文
10、件名:salary,保存位置:个人文件夹-保存。创建企业工资管理系统数据库的步骤创建企业工资管理系统数据库的步骤:项目管理器-数据-数据库-新建-新建数据库-文件名:salary,保存位置:个人文件夹DATA-保存;创建企业工资管理系统数据表的步骤创建企业工资管理系统数据表的步骤:选择salary下面的表-新建-新建表-确认文件名和保存位置后,依次编辑保存表结构信息9.3.1创建项目与数据库创建项目与数据库 步骤步骤:项目管理器/类库/新建/类名:MyCmd,派生于:CommandButton,存储于:MyTools/确定/在打开的类设计器编辑按钮的属性。属性属性:Caption=按钮Font
11、Name=楷体_GB2312FontSize=16ForeColor=RGB(0,0,0)Height=30Width=609.3.2创建创建MyCmd类类MyCmd.MouseMoveMyCmd.MouseMove过程过程:LPARAMETERS nButton, nShift,;nXCoord, nYCoord*如果按钮可用IF THIS.Enabled = .T. *使用自定义鼠标指针 This.MousePointer = 99 *指定自定义鼠标指针 This.MouseIcon = hHand.curENDIF在项目管理器中建立左图所示的类MyMove,基于:Container。为该
12、类添加四个MyCmd控件对象。操作方法操作方法:点表单控件中“查看类”/添加/找开类库MyTools/在控件工具栏上找到MyCmd,拖画到界面。设置对象名分别为CmdTop、CmdPre、CmdNxt、CmdBtm,修改对应的Captiont和ToolTipText的值如“首记录”和“到第一条记录”、“上记录”和“到上一条记录”、“下记录”和“到下一条记录”、“末记录”和“到最后一条记录”。添加事件过程如下:9.3.3创建创建MyMove类类GO TOP&到首记录THISFORM.REFRESH&刷新表单.CmdTop.Click*如果到了数据表首部IF BOF() .OR. RECNO()
13、= 1 MessageBox(已到首记录,48,人力资源管理系统)ELSE*如果数据指针不位于数据表首部 SKIP-1ENDIF*刷新表单THISFORM.REFRESH.CmdPre.Click*如果记录指针位于数据表末尾IF EOF() or RecNO() = RecCount() MessageBox(已到末记录,48,人力资源管理系统)*如果记录指针不位于数据表末尾ELSE*记录指针下移 SKIPENDIF*刷新表单THISFORM.REFRESH.CmdNxt.ClickGO BOTTOM &到数据表末尾THISFORM.REFRESH&刷新表单.CmdBtm.Click*如果数据
14、表为空或者只有一条记录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.RETU
15、RNENDIF.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存储
16、:MyTools步骤步骤:在该类的设计器窗口内添加7个MyCmd类对象。对象名依次为:CmdNew/CmdModify/CmdDel/CmdSer/CmdSave/CmdCcl/CmdExit。Caption、ToolTipText属性值参照下图自行定义。该类中只添加“退出”钮的Click过程,其他为空。* *CmdExit.ClickCmdExit.ClickLOCAL YNYN=MESSAGEBOX(确定退出,4+32,本系统)IF YN=6THISFORM.RELEASEENDIF9.3.4创建创建MyAdmin类类类名:MoreAdmin 基类:Container存储:MyTools步
17、骤步骤:在该类的设计器窗口内添加7个MyCmd类对象。对象名依次为:CmdNew/CmdModify/CmdDel/CmdSer/CmdSave/CmdCcl/CmdExit。Caption、ToolTipText属性值参照左图自行定义。该类中只添加“退出”钮的Click过程,其他为空。* *CmdExit.ClickCmdExit.ClickLOCAL YNYN=MESSAGEBOX(确定退出,4+32,本系统)IF YN=6THISFORM.RELEASEENDIF9.3.5创建创建MoreAdmin类类类名:MyControl基类:Container类库:MyTools创建步骤创建步骤:
18、向该类中添加5个MyCmd对象,对象名:CmdNew,CmdModify,CmdDelete,CmdRefresh,CmdExit,分别设置其Caption,ToolTipText属性值“新增、增加新记录”、“修改、修改当前记录”、“删除、删除当前记录”、“刷新、刷新显示”、“退出、退出当前表单”9.3.6创建创建MyControl类类企业工资管理系统需要自定义的函数包括:AutoInc字符串数自动增1DateToString日期转换为YYYY/MM/DD形式的串EnCode将给定的串与数值异或后返回ITaxComp计算个人所得税9.4创建通用函数创建通用函数*“AutoInc”函数* 作用:
19、使“000000XX”形式的编号自动加1* 接收“0000XX”形式的字符串作为参数* 字符串长度限制为109.4.1AutoIncFUNCTION 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 = SU
20、BSTR(nZero,1,nLen-nLength) + nCode*返回结果RETURN nCodeENDFUNCAutoInc.prg-2/2*“DateToString”函数* 将日期型数据转换为字符串* 接收日期型变量作为参数9.4.2DateToString*“DateToString”函数* 将日期型数据转换为字符串* 接收日期型变量作为参数FUNCTION DateToString(dDate)*默认返回空字符串sDate = *如果参数非空而且为日期型IF .NOT. EMPTY(dDate) .AND. VARTYPE(dDate) = D*分别获取其年、月、日字段nYear
21、 = YEAR(dDate)nMonth = MONTH(dDate)DateToString.prg-1/2nDay = DAY(dDate)*组合数据sDate = ALLTRIM(STR(nYear)+/+ALLTRIM(STR(nMonth)+/+ALLTRIM(STR(nDay)sDate = +sDate +ENDIF*返回值RETURN sDateENDFUNCDateToString.prg-22*函数Encode*作用:对输入的指定的字符串进行编码*参数:sStr:要编码或者解码的字符串* nCode:编码或者解码时使用的密钥9.4.3EncodeFUNCTION ENCOD
22、E(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
23、(cTempChr)ENDFOR*返回编码后的结果RETURN sTempStrENDFUNCEncode.prg-2/2*“ITaxComp”函数*功能:根据个人所得税率表和系统信息表计算个个人所得税额*参数:nNum,月收入总额* nBeg,个人所得税起征点,如果该参数为-1则使用“SysInfo”表的设置*返回值:个人所得税额9.4.4ITaxComp在调试程序时,应该先在表taxRate中录入如下数据。.个人所得税率表初始数据个人所得税率表初始数据*“ITaxComp”函数*功能:根据个人所得税率表和系统信息表计算个* 个人所得税额*参数:nNum,月收入总额* nBeg,个人所得税起
24、征点,如果该参数为-1* 则使用“SysInfo”表的设置*返回值:个人所得税额FUNCTION ITaxComp(nNum, nBeg)*如果不指定个人所得税起征点IF nBeg = -1*获取免税工资noTax = 0ITaxComp.prg-1/4*如果表“SysInfo”没有打开IF !Used(SysInfo)*打开表USE SysInfoSELECT SysInfo*获取个税起征点noTax = SysInfo.个税起征点USEENDIF*减去不用计税部分nNum = nNum - noTaxELSEITaxComp.prg-2/4nNum = nNum - nBegENDIF*如
25、果工资未到起征点IF nNum 工资下限 .AND. nNum THISFORM.MainCon.InfoPage.PAGECOUNTsPage = 1.添加代码添加代码.表单表单basicInfo.Init-1/2ELSE*激活指定的选项卡sPage = nPageENDIFENDIF*激活选项卡THISFORM.MainCon.InfoPage.ACTIVEPAGE = sPage*刷新表单THISFORM.REFRESH.表单表单basicInfo.Init-2/2SELECT AcademySET FILTER TO &清除可能存在的过滤条件THIS.DataList.CLEAR &清
26、除列表*循环在列表框中添加列表项SCANTHIS.DataList.ADDITEM(学历)ENDSCAN*选中第1项IF THIS.DataList.LISTCOUNT 0THIS.DataList.SELECTED(1) = .T.ENDIFTHISFORM.REFRESH &刷新表单.学历设置页面学历设置页面AcademyPage.InitIF .NOT. EMPTY(THIS.VALUE)THIS.PARENT.CmdGrp.CmdModify.ClickENDIFDataList.DblClick*调用“输入新值”表单获取学历名称sStr = DO FORM Forms/InputNe
27、w WITH sStr TO NewValue*如果没有返回学历名称IF EMPTY(ALLTRIM(NewValue)RETURNENDIF*检查要新增的学历名称是否已经存在SELECT AcademyCOUNT FOR 学历 = NewValue TO RecNumCmdNew.Click-1/2IF RecNum 0MESSAGEBOX(学历名称已经存在, 48, 企业工资管理系统)RETURNENDIF*更新记录INSERT INTO Academy VALUES(NewValue)*更新列表框THIS.PARENT.PARENT.DataList.ADDITEM(NewValue)*
28、刷新记录THIS.PARENT.REFRESHCmdNew.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
29、 THIS.PARENT.PARENT.DataList.SELECTED(nCnt) *标识被选中,保存其索引值 bSel = .T. nSel = nCnt sStr = THIS.PARENT.PARENT.DataList.LIST(nCnt) EXIT ENDIFENDFORCmdModify.Click-2/4*如果没有选中的列表项弹出对话框IF bSel = .F.MESSAGEBOX(请选择要修改的列表项, 48, 企业工资管理系统)THIS.PARENT.PARENT.DataList.SETFOCUSRETURNENDIF*如果选择了列表项IF bSel = .T. *调用
30、“输入新值”对话框输入新的值 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.DataL
31、ist.LIST(nSel) = newValueENDIF ENDIFENDIFCmdModify.Click-4/4*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.LISTCOUNT 0MESSAGEBOX(有员工使用该选项, 48, 企业工资管理系统)RETURNENDIFCmdDelete.Click-4/5*确认对话框YN = MESSAGEBOX(是否要删除列表项+ CHR(13) + ItemName, 4+32 ,企业工资管理系统)IF YN = 6*删除记录DELETE FROM Academy WHERE 学历 = ItemNameSELE
32、CT AcademyPACK*刷新显示THIS.PARENT.PARENT.DataList.REMOVEITEM(nSel)ENDIFCmdDelete.Click-5/5THIS.PARENT.PARENT.INITCmdRefresh.ClickSELECT DutySET FILTER TOTHIS.DataList.CLEARSCANTHIS.DataList.ADDITEM(职务名称)ENDSCANIF THIS.DataList.LISTCOUNT 1THIS.DataList.SELECTED(1) = .T.ENDIF.职务设置页面职务设置页面DutyPage.InitIF
33、.NOT. EMPTY(THIS.VALUE)THIS.PARENT.CmdGrp.CmdModify.ClickENDIFDataList.DblClick*调用“输入新值”表单获取职务名称sStr = DO FORM FORMS/InputNew WITH sStr TO NewValue*如果没有返回职务名称IF EMPTY(ALLTRIM(NewValue)RETURNENDIF*检查要新增的学历名称是否已经存在SELECT DutyCOUNT FOR 职务名称 = NewValue TO RecNumCmdNew.Click-1/2IF RecNum 0MESSAGEBOX(职务名称
34、已经存在, 48, 企业工资管理系统)RETURNENDIF*添加记录INSERT INTO Duty VALUES(NewValue)*列表框中添加项THIS.PARENT.PARENT.DataList.ADDITEM(NewValue)*刷新记录THIS.PARENT.REFRESHCmdNew.Click-2/2*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.LISTCOUNT 0MESSAGEBOX(职务名称已经存在, 48, 企业工资管理系统) RETURNELSE UPDATE Duty SET 职务名称 = NewValue WHERE 职务名
35、称 = sStr THIS.PARENT.PARENT.DataList.LIST(nSel) = NewValueENDIFENDIFENDIFCmdModify.Click-4/4*检查列表框是否为空IF THIS.Parent.Parent.DataList.Listcount 0MESSAGEBOX(有员工使用该选项, 48, 企业工资管理系统)RETURNENDIF*确认对话框YN = MESSAGEBOX(是否要删除列表项+ CHR(13) + ItemName, 4+32 ,企业工资管理系统)CmdDelete.Click-4/5IF YN = 6*删除记录DELETE FROM
36、 Duty WHERE ALLTRIM(职务名称) = ItemNameSELECT DutyPACK*刷新显示THIS.PARENT.PARENT.DataList.REMOVEITEM(nSel)ENDIFCmdDelete.Click-5/5THIS.PARENT.PARENT.INITCmdRefresh.ClickSELECT PeopleSET FILTER TOTHIS.DataList.ClearSCANTHIS.DataList.additem(民族)ENDSCANIF THIS.DataList.LISTCOUNT 1THIS.DataList.SELECTED(1) =
37、.T.ENDIF.民族设置民族设置PeoplePage.InitIF .NOT. EMPTY(THIS.VALUE)THIS.PARENT.CmdGrp.CmdModify.ClickENDIFDataList.DblClick*调用“输入新值”表单获取民族名称sStr = DO FORM FORMS/InputNew WITH sStr TO NewValue*如果没有返回民族名称IF EMPTY(ALLTRIM(NewValue)RETURNENDIF*检查要新增的名称是否已经存在SELECT PeopleCOUNT FOR 民族 = NewValue TO RecNumCmdNew.Cl
38、ick-1/2IF RecNum 0MESSAGEBOX(民族名称已经存在, 48, 企业工资管理系统)RETURNENDIF*添加记录INSERT INTO People VALUES(NewValue)*列表框中添加选项THIS.PARENT.PARENT.DataList.ADDITEM(NewValue)*刷新显示THIS.PARENT.REFRESHCmdNew.Click-2/2*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.LISTCOUNT 0MESSAGEBOX(民族名称已经存在, 48, 企业工资管理系统) RETURNELSEUPDATE
39、 People SET 民族 = NewValue WHERE 民族 = sStrTHIS.PARENT.PARENT.DataList.LIST(nSel) = NewValueENDIF ENDIFENDIFCmdModify.Click-4/4*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.LISTCOUNT 0MESSAGEBOX(有员工使用该选项, 48, 企业工资管理系统)RETURNENDIF*确认对话框YN = MESSAGEBOX(是否要删除列表项+ CHR(13) + ItemName, 4+32 ,企业工资管理系统)CmdDelete.C
40、lick-4/5IF YN = 6*删除记录DELETE FROM People WHERE 民族 = ItemNameSELECT PeoplePACK*刷新显示THIS.PARENT.PARENT.DataList.REMOVEITEM(nSel)THISFORM.REFRESHENDIFCmdDelete.Click-5/5THIS.PARENT.PARENT.INITCmdRefresh.ClickSELECT PoliticalSET FILTER TOTHIS.DataList.clearSCANTHIS.DataList.additem(政治面貌)ENDSCANIF THIS.D
41、ataList.LISTCOUNT 1THIS.DataList.SELECTED(1) = .T.ENDIF.政治面貌政治面貌PoliticalPage.InitIF .NOT. EMPTY(THIS.VALUE)THIS.PARENT.CmdGrp.CmdModify.ClickENDIFDataList.DblClick*调用“输入新值”表单获取职务名称sStr = DO FORM FORMS/InputNew WITH sStr TO NewValue*如果没有返回政治面貌名称IF EMPTY(ALLTRIM(NewValue)RETURNENDIF*检查要新增的名称是否已经存在SEL
42、ECT PersonnelCOUNT FOR 政治面貌 = NewValue TO RecNumCmdNew.Click-1/2IF RecNum 0MESSAGEBOX(政治面貌名称已经存在, 48, 企业工资管理系统)RETURNENDIF*添加记录INSERT INTO Political VALUES(NewValue)*列表框中添加选项THIS.PARENT.PARENT.DataList.ADDITEM(NewValue)*刷新显示THIS.PARENT.REFRESHCmdNew.Click-2/2*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.
43、LISTCOUNT 0MESSAGEBOX(政治面貌已经存在, 48, 企业工资管理系统)RETURNELSEUPDATE Political SET 政治面貌 = NewValue WHERE 政治面貌 = sStrTHIS.PARENT.PARENT.DataList.LIST(nCnt) = NewValueENDIFENDIFENDIFCmdModify.Click-4/4*检查列表框是否为空IF THIS.PARENT.PARENT.DataList.LISTCOUNT 0MESSAGEBOX(有员工使用该选项, 48, 企业工资管理系统)RETURNENDIF*确认对话框YN =
44、MESSAGEBOX(是否要删除列表项+ CHR(13) + ItemName, 4+32 ,企业工资管理系统)CmdDelete.Click-4/5IF YN = 6*删除记录DELETE FROM Political WHERE 政治面貌 = ItemNameSELECT PoliticalPACK*刷新显示THIS.PARENT.PARENT.DataList.REMOVEITEM(nSel)THISFORM.REFRESHENDIFCmdDelete.Click-5/5THIS.PARENT.PARENT.INITCmdRefresh.Click表单名:InputNew添加1个文本框,
45、2个MyCmd类,属性其他表单。事件过程如下:9.5.2创建创建“输入新值输入新值”表单表单*获取表单参数PARAMETERS cString*判断参数类型*如果没有接收到参数IF VARType(cString) = L*显示空字符串sString = ELSE*显示接收到的字符串sString = cStringENDIF*显示字符串THISFORM.tValue.Value = sStringInputNew.InitRETURN THISFORM.gValueInputNew.Unload*保存用户输入的值THISFORM.gValue = ALLTRIM(THISFORM.tValu
46、e.Value)*退出表单返回值THISFORM.releaseCmdOk.ClickTHISFORM.RELEASECmdExit.Click表单名:ITRate,将表TaxRate和SysInfo添加到数据环境中。在表单中添加1个容器控件:MainCon,在该容器中加入1个标签和2个容器控件,其中一个容器控件中加入5个标签和1个列表控件,另一个容器控件加入2个标签、2个文本框和2个按钮。9.5.3创建个人所得税率表单创建个人所得税率表单.列表框控件的设置列表框控件的设置*获取表单中的值iIncome = THIS.PARENT.txt工资.VALUEiBeg = THIS.PARENT.t
47、xt起征点.VALUE*如果个税起征点小于0IF iBeg 0MESSAGEBOX(个税起征点错误, 48, 企业工资管理系统)THISFORM.txt起征点.VALUE = 0THISFORM.txt起征点.SETFOCUSRETURNENDIF.计算钮事件过程代码计算钮事件过程代码CmdComp.Click-1/4*如果收入小于0IF iIncome 0MESSAGEBOX(该部门尚员工,不能删除, 48, 企业工资管理系统)RETURNENDIF*清除过滤条件SET FILTER TOCmdDelete.Click-1/3*确认对话框YN=MESSAGEBOX(确定删除,4+32,企业工
48、资管理系统)*如果确认IF YN=6SELECT Department*逻辑删除DELETE FOR 部门编号 = dNoTHISFORM.MainCon.GridCon.Grid1.RECORDSOURCE = CmdDelete.Click-2/3*物理删除PACKTHISFORM.MainCon.GridCon.Grid1.RECORDSOURCE = Personnel*检查是否表空THISFORM.CheckEmpty*刷新表单THISFORM.REFRESHENDIFCmdDelete.Click-3/3*部门名称不能为空IF EMPTY(ALLTRIM(THISFORM.Main
49、Con.DepCon.txt部门名称.Value)MESSAGEBOX(部门名称能为空,48,企业工资管理系统)THISFORM.txt部门名称.SetFocusRETURNENDIF*如果数据有效,确认对话框YN=MESSAGEBOX(确定保存,4+32,企业工资管理系统)*如果确认CmdSave.Click-1/2IF YN=6*保存记录SELECT DepartmentIF(TABLEUPDATE(.F.)=.F.) MESSAGEBOX(保存记录失败,48,企业工资管理系统)RETURNENDIF*表单进入浏览状态THISFORM.FormMode = browseTHISFORM.S
50、etModeTHISFORM.RefreshENDIFCmdSave.Click-2/2*确认对话框YN=MESSAGEBOX(确定取消,4+32,企业工资管理系统)*如果确认IF YN=6*取消修改SELECT DepartmentTABLEREVERT(.F.)*-如果表单处理于新增状态CmdCcl.Click-1/2IF THISFORM.FormMode = new*-如果原来的记录指针位置有效IF THISFORM.OldRecord 1GO THISFORM.OldRecordENDIFENDIF*表单进入浏览状态THISFORM.FormMode = browseTHISFORM