内容简介
本系统是一个面向中小型企业的工资管理系统,该系统在成功连编之后,可独立的在windows环境下操作,本模块共分为12个独立的模块,可以完成一些基本的工资管理操作,如基本的数据查找、修改、输入输出、打印以及数据统计的功能,可通过职工的基本信息表与工资表之间的联系来完成对职工工资的各种操作。
本系统包括项目的建立、数据库的建立、表的有关操作、数据库管理的操作、程序设计常用控件的使用、数据表的表单的程序设计、菜单的设计方法、SQL语言的使用等。
目 录
第一章. 工资管理系统需求分析与设计
1.系统功能需求简介
工资管理信息系统对企业加强工资管理有着极其重要的作用,就一般的企业来说,它的设计内容非常复杂,拥有工资计算功能,工资统计功能,报表输出功能,而且设计的模块也很多,如工资管理模块,工资统计模块,报表设计模块,打印输出模块,数据查询模块等等。
因此,针对该要求而言,确定了工资管理系统的设计方案。该工资管理系统的主要功能如图1所示:
图1系统功能模块组成
2、工资结构设置模块
该工资管理系统主要实现一些基本的数据管理,主要表单模块,由各种输入、输出、浏览、修改、统计、打印、查询、帮助及退出等功能组成。“工资管理查询系统”要求进行设计,并工资的工作流程,该系统包括12大模块:系统登录模块、系统主菜单模块、工资录入模块、工资记录修改模块、工资记录统计模块、工资记录查询模块、数据备份及初始化、工资浏览模块、工资记录打印、系统帮助、系统退出、系统时间模块组成。
系统登录模块的功能要求如下:
(1) 用户权限设置,不同级别的用设有有不同的权限密码。
(2) 综合初始系统设置。
数据录入模块功能要求如下:
(1) 职工信息的录入。
(2) 数据存储。
数据查询模块功能要求如下:
(1) 根据职工姓名查询职工的工资情况。
(2) 根据职工号查询职工的工资情况。
(3) 根据职工工作时间查询情况。
数据修改模块功能要求如下:
(1) 追加职工信息。
(2) 删除职工信息。
(3) 修改职工信息。(包括个人信息及集体更改)
(4) 自动计算职工工资信息。
报表浏览及打印模块功能要求如下:
(1) 打印工资信息。
(2) 打印工资条(个人信息)。
(3) 打印工资表(统计信息)。
员工信息包含以下内容:
(1) 职工号。
(2) 姓名。
(3) 日期。
数据备份及初始化功能要求如下:
- 上月工资的备份存储。
- 新信息存储初始化。
- 退出。
系统帮助模块功能要求如下:
- 显示系统时间。
- 提示系统基本信息(注释版权出处)。
系统退出模块功能要求如下:
(1)用户可直接退出系统。
3.目标系统要求
目标系统应该达到以下要求:
1、时间经济性。优化逻辑设计与物理设计,使系统运行效率高,反映速度快。
2、可靠性。能连续准确的处理业务,有较强的容错能力。
3、可理解性。用户容易理解和使用该系统。
4、可维护性和适应性。系统应易于修改、易于扩充、易于维护,能够适应业务不断发展变化的需要。
5、可用性。目标系统功能齐全,能够完全满足业务需求。
6、安全保密性。保证系统的物理安全、数据存储和存取的安全与保密、数据传输的安全与保密,做好使用人员的授权管理。
4.系统平台设计
选择微软平台作为主导,一方面考虑目前微软的飞速发展,越来越多的企业在规划内部网络时,将微软平台作为首选方案;另一方面从技术角度来讲,微软平台上的应用无论是在开发上,还是在软件的部署上都非常容易,而且性能优越。
操作系统:Windows xp/2000/98
开发工具与语言: Visual FoxPro 6.0中文版
第二章.工资管理系统信息概要设计
1.工资数据流程图
1).由需求分析可知,主导流程应用封面(设置受制权限)的表单进入系统菜单,再由各个表单模块做成系统菜单项。主要表单模块,由各种输入、输出、浏览、修改、统计、打印、查询、帮助及退出等功能。分别如图2.1、2.2所示
图2.1
进入系统 数据管理
图2.2
2.工资管理系统主要模块简介
2.1工资管理系统主要文件组成 (数据词典分析)
一般的工资管理系统主要功能包括:记录的录入、浏览、修改、统计、查找和打印等,下面为该系统主要功能模块。
1).表单功能模块
工资主控模块(调用表单gzgl.scx)
工资初始化及备份模块(调用表单gzinit.scx)
工资录入模块(调用表单gzlr.scx)
工资浏览模块(调用表单gzll.scx)
工资修改模块(调用表单gzmodi.scx)
工资统计模块(调用表单gzcount.scx)
工资查找模块(调用表单gzfind.scx)
工资打印模块(调用表单dayin.scx)
系统封面模块(调用表单fm.scx)
系统帮助模块(调用表单xthelp.scx)
系统时间模块(调用表单xttime.scx)
2).菜单与报表文件
系统功能菜单(xtcd.mnx)
工资表报表(gzb.frx)
工资条报表(gzt.frx)
3).数据库文件
数据库名称:gz.dbc
数据表名称:gzb.dbf
数据表名称:XXb.dbf
Gzb表结构如下图所示:
字段名称 | 字段类型 | 字段宽度 | 小数点 | 默认值 |
职工号 | C | 8 | 0 | |
职称 | C | 8 | 0 | |
姓名 | C | 8 | 0 | |
出勤情况 | L | |||
职务工资 | N | 7 | 2 | 0 |
旷工扣款 | N | 7 | 2 | 0 |
职务补贴 | N | 8 | 2 | 0 |
应发工资 | N | 8 | 2 | 0 |
养老保险 | N | 7 | 2 | 0 |
合计扣款 | N | 7 | 2 | 0 |
实发工资 | N | 8 | 2 | 0 |
所得税 | N | 7 | 2 | 0 |
实发现金 | N | 8 | 2 | 0 |
※其中合同%15与承包30%两字段在建立数据库表时写成其他形式。
XXB表结构如下图所示:
字段名称 | 字段类型 | 字段宽度 | 小数点 | 默认值 |
职工号 | C | 8 | 0 | |
职称 | C | 8 | 0 | |
姓名 | C | 8 | 0 | |
性别 | C | 2 | 0 | |
年龄 | N | 2 | 0 | |
学历 | C | 8 | 0 |
2.2功能模块菜单
工资管理系统的菜单功能如下图3所示:
3.项目与数据库的建立
3.1项目地建立
①在硬盘上建立一个目录C:\Documents and Settings\Administrator\桌面\vf作业ll\gzgl。
②启动VFP系统,在“项目管理器窗口”中,建立一个项目,项目的名称为“工资管理系统”,并保存到所建立的C:\Documents and Settings\Administrator\桌面\vf作业ll\gzgl
目录下。
图4新建的项目
3.2数据库及数据库表的建立
建立一个GZ数据库和一个GZB表如下图5、6所示:
图5建立数据库
图6数据库表的内容
再在GZ数据库下建立一个xxb表如下图5.1、6.1所示:
图5.1
图5.2
3.3数据表间关系的建立:
为gzb建立主索引和xxb建立候选索引
第三章.工资管理系统模块设计
1.系统主菜单设计
①在“项目管理器”窗口中,选择“其他”选项卡。
②在其“他选”项卡中选择“菜单”。
③单击新建按钮,屏幕出现“新建菜单对话框”。
④在“新建菜单对话框”中,单击“菜单”命令,系统进入“菜单设计器”窗口。
分别建立“主菜单”及“工资记录管理子菜单”,主菜单包括工资记录管理、编辑菜单、记录打印、系统帮助、退出,工资记录子菜单中项目包括数据库初始化及备份、工资记录录入、工资记录浏览、工资记录修改、工资记录统计、工资记录查询、退出系统。
⑤退出系统设计为过程:代码为
byebye=messagebox("真的要退出吗?",64+1,"提示信息")
if byebye=1
close all
clear events
quit
endif
⑥在“菜单级”中选择“菜单栏”,返回主菜单。
⑦重复⑤~⑦步,编辑其他子菜单
图7
这些子菜单分别是调用系统的内部分量完成相应功能,其具体操作如下:
选单项目内部命令(图8所示)
撤销 _MED_UNDO
重做 _MED_REDO
剪切 _MED_CUT
复制 _MED_COPY
粘贴 _MED_PASTE
清除 _MED_CLEAR
⑧输入上述菜单项所对应的系统菜单内部命令生成菜单,其他菜单项调用程序如下所示:(图7)所示:
记录打印菜单:
打印记录:do form dayin with s
记录浏览:do form gzll
系统帮助菜单:do form xttime
关于系统:do form xthelp
退出菜单:
退出系统:byebye=messagebox("真的要退出吗?",64+1,"提示信息")
if byebye=1
close all
clear events
quit
endif
系统帮助:do form xthelp
⑨设置顶层表单,保存菜单,菜单名为xtcd,扩展名.mnx,最后再生成.mpr文件。
⑩退出菜单设计器窗口,将会在“项目管理器”窗口中看到菜单文件,在对其行修改,直到运行无误为止。
图8
2.系统主控表单模块设计
主控表单用来调用系统菜单,用来控制整个系统的控制与管理。
2.1表单的执行屏幕
主控表单执行屏幕如图9所示。
2.2表单与控件属性设置:
Form表单的属性设置:
Caption=”工资管理系统”
showwindow=2-作为顶层表单( 指定该表单位顶层表单)
Windowstate=2-最大化(指定表单在运行使最大化)
Showtips=.T.(指定表单对象显示“工具提示”)
2.3事件代码
Form表单的laod事件代码:
Do xtcd.mpr with this,.t.
运行结果如下图所示:图9
3.数据库初始化及备份模块表单设计
3.1表单的执行与设计
下图为该表单的执行屏幕及设计屏幕,分别为:图10、图11
图10
3.2控件属性设置
Label1标签的属性设置。
Caption改为:“数据库初始化”
FontName改为:“华文行楷”
FontSize改为:26
Fontunderline改为:.T.—真
Shape1和Shape2的属性:
BackStyle改为:0—透明
SpecialEffect改为:0—3维
3.3事件代码
表单form1的activate事件代码
thisform.label1.caption="数据初始化"
thisform.label2.caption="使用说明"
thisform.label3.caption="使用本模块要注意,备份文件的时候一般要给出一个具体的文件名(不需扩展名);
名字由工资、年份、月份、日期组成,其意义为明确备份的日期及备份是那个月的工资."
thisform.label4.caption="当前数据库的信息"
thisform.label5.caption="当前数据库名称:"+dbf()+chr(13)+"当前日期"+dtoc(date())+;
chr(13)+"需要备份到:"+"工资"+ alltrim(str(year(date())))+"-"+;
alltrim(str(month(date())))+"-"+alltrim(str(day(date())))+".dbf"
thisform.label6.caption="备份数据库到下面文件中"
thisform.label7.caption="下面是初始化"+alltrim(str(month(date())))+;
"月份的工资表:"
thisform.text1.value="C:\Documents and Settings\Administrator\桌面\vf作业\gz\gzb"+alltrim(str(year(date())))+;
alltrim(str(month(date())))+"-"+alltrim(str(day(date())))+".dbf"
“备份”command1按钮的click事件代码:
ff=alltrim(thisform.text1.value)
copy to ff
“初始化”command2按钮的click 事件代码:
set path to
a="下面要进行初始化,将对原来的数据进行改变,所以一定要先进行备份,否则原来的数据将丢失。";
+chr(13)+"进行备份吗?"
inotice=messagebox(a,65,"提示信息")
if inotice=1
if file("temptemp.vfp")
delete file temptemp.vfp
endif
copy to temptemp.vfp
thisform.refresh
endif
Command3“退出”按钮的Click事件代码:
Thisform.Release
4.工资录入模块表单设计
4.1工资录入模块表单的执行与设计
工资录入模块是用来录入工资记录的,在具体操作时有些数据需要自动生成,参见代码。具体设计时各字段是通过数据环境拖拽到表单中的,再利用“布局”工具栏进行调整。表单的执行屏幕如图12、13所示:
图12
图13
4.2表单与控件的属性设置
Form1表单的属性:
Autocenter改为:.T.—真(运行时表单居中)
ShowWindow改为:1—在顶层表单中(使得该表单能够在顶层表单中运行)
Titlebar改为:0—关闭(使该表单的标题栏不可见)
Image1控件的属性:
Stretch改为:2—变比例填充
Label1控件的属性:
Caption改为:”工资录入模块”
FontName改为:”华文行楷”
FontSize改为:36
Shape1 控件的属性(“职工情况”的方框):
BackStyle改为:0—透明(背景透明,另外在选择时注意选择“格式”中的置后,以免使该控件遮盖其他控件)
SpecialEffect改为:0—3维(指明该控件是三维立体效果)
4.3事件代码
(1)文本框控件
“Txt应发工资”控件的事件。
Click和GotFocus(获得焦点事件)的代码:
with this.parent
this.value =.TXT职务工资.VALUE+.TXT书报费.VALUE+.TXT构成津贴.VALUE+.TXT合同15.VALUE+.TXT家属价格.VALUE+.TXT综合补贴.VALUE;
+.TXT出勤补.VALUE+.TXT岗位津贴.VALUE+.TXT洗理费.VALUE+.TXT交通补.VALUE+.TXT儿保费.VALUE;
+.TXT提租补贴.VALUE+.TXT外租房补.VALUE+.TXT未纳奖.VALUE+.TXT职务补贴.VALUE+.TXT补发工资.VALUE
endwith
“Txt合计扣款”控件的事件。
Click和GotFocus(获得焦点事件)的代码:
with this.parent
this.value=.txt养老保险.value+.txt扣会费.value+.txt公积金.value+.txt承包30.value
endwith
“txt所得税”控件的事件。
Click和GotFocus的代码:
if this.parent.txt实发工资.value>800
this.value=(this.parent.txt实发工资.value-800)*0.05
endif
thisform.refresh
“实发现金”控件的事件
Click和GotFocus(获得焦点事件)的代码:
with this.parent
this.value =.txt实发工资.value-.txt所得税.value-.txt其他扣款.value
endwith
thisform.refresh
该代码是在“txt实发现金”控件获得焦点时,自动计算实发现金的总数。
(2)命令按钮的控件
“第一个”命令按钮Command1的Click事件代码:
go top
thisform.refresh
“上一个”命令按钮Command2的Click事件代码:
skip-1
if bof()
go top
=messagebox("已经是第一个记录了!",64,"提示信息")
endif
thisform.refresh
“上一个”命令按钮Command3的Click事件代码:
skip+1
I f eof()
go bottom
=messagebox("已经是最后一个记录了!",64,"提示信息")
endif
thisform.refresh
“最后一个”命令按钮Command4的Click事件代码:
go bottom
thisform.refresh
“添加”命令按钮Command5和Click事件代码:
append blank
go bottom
thisform.refresh
“退出”命令按钮Command6的Click事件代码:
thisform.release
5.工资查找模块表单设计
5.1设计第一页
Form1表单的load事件
public getzgh1,getxm1,getrq1,s
getzgh1=''
getxm1=""
text1控件的interactivechange事件代码:
set exact off
GETzgh1=ALLTRIM(thisform.pageframe1.page1.TEXT1.VALUE)
GETxm1=ALLTRIM(thisform.pageframe1.page1.TEXT2.VALUE)
GETrq1=thisform.pageframe1.page1.TEXT3.VALUE
s=''
if len(getzgh1)>0
s=s+'职工号=GETZGH1'
endif
if len(getxm1)>0
s=s+'.and.'+'姓名=GETXM1'
endif
do while left(s,5)='.and.'.OR.LEFT(S,5)='.AND.'
s=subst(s,6)
enddo
IF LEN(ALLTRIM(S))=0
SET FILTER TO
ELSE
set filter to &s
ENDIF
GO TOP
THISFORM.PAGEFRAME1.PAGE1.REFRESH
THISFORM.PAGEFRAME1.PAGE2.REFRESH
添加页框控件,以工资表作为数据源其执行及设计表单屏幕如下图14、15所示:
图14
Text2控件的interactivechange事件代码:
set filter to 在职称=this.parent.text2.value
thisform.refresh
Text3控件的interactivechange事件代码:
set filter to 姓名=alltrim(this.parent.text3.value)
thisform.refresh
“查看详细内容”命令按钮command1的click事件
thisform.pageframe1.page2.setfocus
thisform.refresh
“打印”命令按钮command2的click事件
do form dayin with s
“退出”命令按钮command2的click事件
Thisform.release
图15第一页执行屏幕
5.2设计第二页
以上是查询表单的第一页的控件,下面对页框第二页进行编辑,表单的执行屏幕如图17所示,表单的设计屏幕如图16所示。
在该页中,有三个标签控件,其标题为职工号、日期、姓名,坑害有三个文本框控件txt职工号、txt日期、txt姓名,其ForeColor属性值为(0,0,255),即前景为蓝色。
“返回上页”命令按钮Command1的Click事件代码为:
thisform.pageframe1.page1.setfocus
thisform.pageframe1.page1.refresh
“打印”命令按钮Command2和”退出”命令按钮Command3的Click事件和页框第一页相
图16
图16.1添加数据源屏幕
图17第二页执行屏幕
第二页设计屏幕
6.工资浏览模块表单设计
6.1表单的执行与设计
6.2属性与事件代码
表单form的load事件代码如下:
public getzgh1,getxm1,getrq1,s
getzgh=''
getxm1=''
图18记录浏览执行屏幕
记录浏览设计屏幕
Text1,text2,text3控件的interactivechange事件代码:
set exact off
GETzgh1=ALLTRIM(thisform.TEXT1.VALUE)
GETxm1=ALLTRIM(thisform.TEXT2.VALUE)
s=''
if len(getzgh1)>0
s=s+'职工号=GETZGH1'
endif
if len(getxm1)>0
s=s+'.and.'+'姓名=GETXM1'
endif
do while left(s,5)='.and.'.OR.LEFT(S,5)='.AND.'
s=subst(s,6)
enddo
IF LEN(ALLTRIM(S))=0
SET FILTER TO
ELSE
set filter to &s
ENDIF
GO TOP
THISFORM.REFRESH
THISFORM.REFRESH
7.修改记录模块表单设计
插入一个为页框数4的个页框控件,对各个页框设计
7.1设计第一页
(表单执行如图19)所示
图19第一页执行屏幕
Text1,text2,text3控件的interactivechange事件代码:
set exact off
GETzgh1=ALLTRIM(thisform.pageframe1.page1.TEXT1.VALUE)
GETxm1=ALLTRIM(thisform.pageframe1.page1.TEXT2.VALUE)
s=''
if len(getzgh1)>0
s=s+'职工号=GETZGH1'
endif
if len(getxm1)>0
s=s+'.and.'+'姓名=GETXM1'
endif
if left(s,5)='.and.'.OR.LEFT(S,5)='.AND.'
s=subst(s,6)
endif
IF LEN(ALLTRIM(S))=0
SET FILTER TO
ELSE
set filter to &s
ENDIF
GO TOP
THISFORM.PAGEFRAME1.PAGE2.CAPTION=姓名+"的详细内容"
THISFORM.PAGEFRAME1.PAGE1.REFRESH
THISFORM.PAGEFRAME1.PAGE2.REFRESH
“查找记录”command1按钮的click事件代码:
if not empty(thisform.pageframe1.page1.text4.value)
n=val(alltrim(thisform.pageframe1.page1.text4.value))
go n
thisform.pageframe1.page2.setfocus
thisform.pageframe1.page2.caption=姓名+" 的记录内容"
thisform.refresh
else
set exact off
GETzgh1=ALLTRIM(thisform.pageframe1.page1.TEXT1.VALUE)
GETxm1=ALLTRIM(thisform.pageframe1.page1.TEXT2.VALUE)
s=''
if len(getzgh1)>0
s=s+'职工号=GETZGH1'
endif
if len(getxm1)>0
s=s+'.and.'+'姓名=GETXM1'
endif
if left(s,5)='.and.'.OR.LEFT(S,5)='.AND.'
s=subst(s,6)
endif
IF LEN(ALLTRIM(S))=0
SET FILTER TO
ELSE
set filter to &s
ENDIF
GO TOP
endif
THISFORM.PAGEFRAME1.PAGE2.CAPTION=姓名+"的详细内容"
THISFORM.PAGEFRAME1.PAGE1.REFRESH
THISFORM.PAGEFRAME1.PAGE2.REFRESH
“删除记录”command2按钮的click事件代码:
INOTICE=MESSAGEBOX("确定删除指定的记录吗?",65,"重要提示")
IF INOTICE=1
DELETE RECORD RECNO()
ANOTICE=MESSAGEBOX("确定物理删除指定的记录吗?"+CHR(13)+"一经删除,不能恢复!!!",65,"重要提示")
IF ANOTICE=1
use
use gzb
PACK
use
thisform.release
ENDIF
THISFORM.REFRESH
ENDIF
“恢复删除”command3按钮的click事件代码:
INOTICE=MESSAGEBOX("恢复所有逻辑删除的记录吗?",65,"提示信息")
IF INOTICE=1
RECALL ALL
ENDIF
“打印记录”command3按钮的click事件代码:
DO FORM DAYIN WITH S
“退出”command3按钮的click事件代码:
THISFORM.RELEASE
7.2设计第二页
7.2.1表单的执行与设计
表单设计所需控件如图20所示,以gzb为数据源表,执行结果如图21所示
图20
图21(修改单个记录执行屏幕)
7.2.2事件代码
“自动计算”command1按钮的click事件代码:
With This.Parent
.Txt应发工资.Value=.Txt职务工资.Value同15.Value;+.Txt职务补贴.Value
.Txt合计扣款.Value=.Txt养老保险.Value
.Txt实发工资.Value=.Txt应发工资.Value-.Txt合计扣款.Value
If This.Parent.Txt实发工资.Value>800 &&果工资高于800则有所得税,费率为m 5%
.Txt所得税.Value= (This.Parent.Txt实发工资.Value-800)*0.05
EndIf
.Txt实发现金.Value=.Txt实发工资.Value-.Txt所得税.Value
EndWith
“返回上页”command2按钮的click事件代码:
THISFORM.PAGEFRAME1.PAGE1.SETFOCUS
THISFORM.PAGEFRAME1.PAGE1.REFRESH
Command3, command4的代码与上页相同。
7.3设计第三页
7.3.1表单的设计与执行
第三页是用来实现批量修改满足条件的记录,可以对指定的多个记录进行修改。表单的设计屏幕如图22所示:
图22批量修改满足条件的记录
7.3.2事件代码
“确认修改”command1按钮的click事件代码:
A=MESSAGEBOX("确定更改指定的项目吗?",65,"提示信息")
IF A=1 &&选择确定按钮时执行
replace all 职务工资 WITH 职务工资+THIS.PARENT.TEXT4.VALUE
replace all 应发工资 WITH 应发工资+THIS.PARENT.TEXT4.VALUEreplace all 实发工资 WITH 实发工资+THIS.PARENT.TEXT4.VALUE
replace all 应发工资 WITH 应发工资+THIS.PARENT.TEXT5.VALUE
replace all 实发工资 WITH 实发工资+THIS.PARENT.TEXT5.VALUE
replace all 应发工资 WITH 应发工资+THIS.PARENT.TEXT6.VALUE
replace all 实发工资 WITH 实发工资+THIS.PARENT.TEXT6.VALUE
replace all 所得税 with iif(实发工资-800>0,(实发工资-800)*0.05 ,0)
replace all 实发现金 with 实发工资- 所得税
THIS.PARENT.TEXT4.VALUE=0
THIS.PARENT.TEXT5.VALUE=0
THIS.PARENT.TEXT6.VALUE=0
THISFORM.REFRESH
ENDIF
图23批量修改满足条件的记录设计
“自动计算”命令按钮的click事件代码如第二页及第四页代码相同
7.4.设计第四页
7.4.1表单的执行与设计
第四个页面主要是实现浏览时修改,设计与执行屏幕如下24、25所示
7.4.2控件属性与事件代码
Rowsource改为 gzb.职工号,姓名 rowsourcetype改为-字段 columncount改为2
List1列表框的click事件代码:
THISFORM.PAGEFRAME1.PAGE4.LABEL1.CAPTION=ALLTRIM(姓名)+"的记录内容"
THISFORM.REFRESH
图24浏览时修改设计模块
图25浏览式修改记录模块执行屏幕
Spinner1的属性和事件代码:
Spinnerhighvalue=12
Spinnerlowvalue=1
Keyboardhighvalue=12
Keyboardlowvalue=1
Increment=1
Spinner1的gotfocus事件代码:
PUBLIC X,XM
XM=姓名
X=THIS.VALUE
Spinner1的upclick事件代码:
LOCATE ALL FOR MONTH(日期)=THIS.VALUE .AND. 姓名=XM
*?THIS.VALUE,X,XM
IF FOUND()
THISFORM.REFRESH
ELSE
=MESSAGEBOX("该记录没找到!",64,"提示信息")
THIS.VALUE=X
THISFORM.REFRESH
ENDIF
Spinner1的downclick事件代码:
*XM=姓名
*X=THIS.VALUE
IF FOUND()
THISFORM.REFRESH
ELSE
=MESSAGEBOX("该记录没找到!",64,"提示信息")
LOCATE ALL FOR MONTH(日期)=THIS.VALUE .AND. 姓名=XM
THIS.VALUE=X
THISFORM.REFRESH
ENDIF
8.统计模块表单设计
8.1表单设计与实现
表单的设计与执行模块设计分别如下图26,27
图26数据统计表单的设计屏幕
图27执行模块
8.2事件代码
“开始统计”command1按钮的click事件代码:
SET talk off
SET FILTER TO
COUNT TO XYZ
SUM TO A1,A15,A16,A17,A181,A22,A23,
THISFORM.TXT职务工资.VALUE=A1
THISFORM.TXT职务补贴.VALUE=A15
THISFORM.TXT补发工资.VALUE=A16
THISFORM.TXT应发工资.VALUE=A17
THISFORM.TXT养老保险.VALUE=A18
THISFORM.TXT合计扣款.VALUE=A22
THISFORM.TXT实发工资.VALUE=A23
THISFORM.TXT实发现金.VALUE=A26
THISFORM.TEXT7.VALUE=XYZ
THISFORM.REFRESH
9.打印模块表单设计
本表单用来实现对记录的打印,共有两种打印形式:打印工资条和打印工资表。
9.1表单执行与设计
表单的设计与执行模块如下图28所示
图28打印模块执行图
9.2事件代码
表单form1的init事件代码:
parameters tj
public tiaojian
tiaojian=tj
选项按钮组optiongroup1 的click事件代码:
if thisform.optiongroup1.value=3
thisform.optiongroup2.value=2
thisform.optiongroup2.refresh
endif
“打印”command1按钮的click事件代码:
xyz=recno()
do case
case thisform.optiongroup1.value=1
if thisform.optiongroup2.value=1
report form gzt.frx for recno()=xyz to printer noconsole
else
report form gzb.frx for recno()=xyz to printer noconsole
endif
case thisform.optiongroup1.value=2
if thisform.optiongroup2.value=1
report form gzt.frx for &tiaojian to printer noconsole
else
report form gzb.frx for &tiaojian to printer noconsole
endif
case thisform.optiongroup1.value=3
if thisform.optiongroup2.value=1
report form gzt.frx to printer noconsole
else
report form gzt.frx to printer noconsole
endif
endcase
“退出”command2按钮的click事件代码:
thisform.release
label2的init事件代码:
thisform.label2.caption='说明:'+chr(13)+;
'选择你所需要的打印方式,然后选择打印按钮即可,如果希望推出则选择退出按钮'
10.系统封面模块表单设计
10.1表单的执行与设计
表单的执行屏幕如图29所示 图29
当执行密码错误时执行结果为图30,当密码输入正确是执行结果如图31所示
图30密码错误时提示信息
图31密码正确时进入系统
10.2属性与事件代码
封面表单form属性
Autocebter改为:.T.—真(运行时居中)
Showtips改为:.T.—真
Showwindow改为2—作为顶层表单
Titlebar改为0—关闭
表单form1的laod事件代码:
public username(2)
username(1)="朱佩"
username(2)="allen"
timer1控件的属性
interval改为500
timer1控件的事件代码:
THISFORM.LABEL3.CAPTION='日期: '+ALLTRIM(STR(YEAR(DATE())))+'年'+ALLTRIM(STR(MONTH(DATE())))+'月'+ALLTRIM(STR(DAY(DATE())))+'日'+CHR(13)+'时间: '+TIME()
Combol组合框控件的属性
Rowsource改为:username(表单laod事件定义的数组)
Rowsourcetype改为5—数组(定义数据源) tabindex改为1
Text1控件属性:passwordchar改为*
Command1的属性:tooltiptext改为:”密码输入正确时可进入系统”
Combol组合框空间的单击事件代码:
THISFORM.TEXT1.SETFOCUS
“登录系统”命令按钮command1的click事件代码:
STORE '' TO MYUSER,P1,P2,P3
MYUSER=THISFORM.COMBO1.VALUE
P1=ALLTRIM(THISFORM.TEXT1.VALUE)
P2=LEFT(ALLTRIM(TIME()),2)+SUBSTR(ALLTRIM(TIME()),4,2)
P3=ALLTRIM(STR(YEAR(DATE())))
IF MYUSER=USERNAME(1)
IF P1=P3
THISFORM.RELEASE
do form gzgl
ELSE
=MESSAGEBOX("超级用户密码错误,请再试一遍!",65,'提示信息')
ENDIF
ELSE
IF P1=P2
THISFORM.RELEASE
do form gzgl
ELSE
=MESSAGEBOX("普通用户密码错误,请再试一遍!",65,'提示信息')
ENDIF
ENDIF
“退出系统”命令按钮command2的click事件代码:
THISFORM.RELEASE
11.系统时间模块表单设计
11.1表单的执行与设计
表单的执行与设计屏幕分别如下图32、33所示
图33系统时间的执行屏幕
11.2控件属性域代码
时间控件的添加:
- 选择“工具”菜单中的“选项”菜单项,屏幕出现如图34。
- 选择“日历控件”,选择“确定”即可。
- Form1的init事件:
thisform.label2.caption="时间:"+alltrim(dtoc(datetime()))+time()
“退出”命令按钮command1的click事件代码:
thisform.release
12.系统帮助表单模块设计
12.1表单的设计与执行
执行屏幕如图34所示
12.2表单控件的属性与事件代码:
Form1的init事件代码:
将label1,label2,label3的wordwrap属性改为:—.T.
thisform.label2.caption="系统说明"+chr(13)+"本工资管理系统,是一个比较"+chr(13); +"完整的,关于visual foxfro使用实例的"+chr(13)+"系统,希望大家能够喜欢。"
thisform.label3.caption="产品名称:工资管理系统"+chr(13)+;
"版本号:V1.00"
thisform.label4.caption="版权所有:朱佩佩"+chr(13)
“确定”命令按钮command1的click事件代码:
thisform.release
图34系统帮助的执行屏幕
13.报表表单的设计
本系统共需要2个报表,即工资表报表、工资条报表
13.1工资表报表的设计与执行
13.1.1工资表的设计
工资表的报表设计如图35
设计报表时打开生成器,打开自动生成的报表,使用格式菜单的命令来完成布局,然后利用画图和画框工具来调整布局。
13.1.2工资表报表的执行
在报表相应控件上进行修改和设计,实现打印的方法右击报表相应控件,在弹出快捷菜单上选择“属性”命令,出现“报表表达式”对话框如图36所示。
该处代码为:
alltrim(str(year(date())))+"年"+alltrim(str(month(date())))+"月份"
图36 “报表表达式”对话框
图37工资表报表的执行屏幕
图38
工资条执行屏幕39
第四章.程序的连遍与系统维护
应用系统的设计,通过项目管理器将表单与菜单、数据库等连在一起,就可以建立可执行程序。利用项目管理器编译成可执行文件很简单,它将在项目管理器中的全部文件编译在一起,形成一个独立的可执行文件。连编必须进行以下4个步骤:
1.将所有的应用程序加入到项目管理器中。
2 .主程序的建立
3 .程序的调试
4 .应用程序的连编。
1. 将应用程序添加到项目管理器中
将全部的应用程序添加到项目管理器中的操作步骤如下:
1 .打开已建立的项目。
2 .选择相应的选项卡,依次把自由表、数据库、表单文件、报表文件、菜单文件以及类库添加到项目。
如果建立应用程序时,上述表及相关文件就已经在项目管理器中,上述步骤可以省略。
3 .为了避免在程序编译后会出现一个VFP窗口,可以在“项目管理器”窗口的“其他”选项卡的“文本文件”中,填加一个Config,fpw文件,文本内容是Screen=Off即可。
2.工资系统的主程序设计
为了连编,必须确定连编的顺序,并确定应用程序的接口,为此,必须编写主程序Main.prg,确定运行顺序。每个系统都应该有一个主程序,当在程序项目管理器中开始编写第一个程序(如程序文件、菜单、表单等)时,管理器会默认将其作为主程序,但有时可能第一个编辑的程序不是主程序,这时就要重新设置主程序。创建一个可独立运行的Windows程序,就必须建立一个程序文件作为主文件。其操作步骤如下:
1 .在“项目管理器”窗口中,单击“代码”选项卡,选择“程序”,并单击“新建”按钮。即可创建程序文件。
工资主程序的代码如下:
Clear Screen
=Setpath()
on shutdown Clear Events
Do Form fm
Read Events
On shutdown Events
Function Setpath()
Local lcsys16,lcprogram
Lcsys16=sys(16)
Lcprogram=subStr(lcsys16,at(“;”,lcsys16)-1)
Cd Left(lcprogram,rat(“\”,lcprogram))
Set path to Gzgl
Endfunc
2.单击右上交的“关闭”按钮,在“另存为”对话框中,以“main”为文件名保存。
3.用鼠标右键单击文件名“main .prg’,在弹出的快捷菜单中,选择“设置主文件“如图40所示,此时可以看到程序main变为黑体。
图40“设计主文件”快捷菜单
3.程序的调试
如果在程序中有语法性的错误,当程序运行到错误的语句时,系统就会停下来并提示程序有错,通常还会说出是什么错误,如“命令中含有不能识别的短语或关键字”,并给出“取消”、“挂起”、“忽略”、“帮助”四个选择,它们的意思分别是:
“取消”表示中止程序运行,回到命令窗口,相当于执行了Cancel命令,在程序中创建的所有变量被释放(除公共变量),但数据库及数据表一般保持当时的状态,可以用Browse命令查看数据表的内容,如记录指针所在的位置等。
“挂起”表示暂停程序,相当于执行了Suspend命令,这时程序中的所有变量都保持原值,可以用?忽略。
“忽略”表示忽略所有出现的错误,即跳过出错的语句继续执行后面的语句。
“帮助”表示显示有关出错的帮助信息,对于错误做更详细的说明。
如果这时能看出问题出在哪里,可以选择“取消”,然后进到程序中找出错误所在的位置,将其改正。在选择了“取消”后,可能这时有表单是打开的,那么用鼠标点一下该窗口,然后选择“关闭”。如果菜单是自定义菜单,用Set sysmenu to default回到系统菜单。改完后,再次运行程序前,最好将所有的数据库及表关闭,以免在程序打开一个数据表时出现表已打开的错误,比较好的办法是在程序开头先关闭所有的数据库及表。关闭所有数据库的命令是:Close Datagbase All。
关闭所有表的命令是:Close Table All 。
如果不知道问题出在程序的哪个地方,选择“挂起”,系统会弹出一个调试器窗口,显示出错的语句,在跟踪窗口的黄色箭头所指的语句就是可能出错的语句。
4.程序的连编
程序全部编写完成就可以开始编译软件了,操作步骤如下:
1.单击“项目管理器”窗口中的“连编”命令,屏幕出现“连编选项”
对话框,如图:
2.在“操作”框中,选择“连遍可执行文件”,按“确定”按钮。
3.输入编译后的.EXE文件名,然后保存在已建的应用程序所在的目录中。
4.接着系统便进入编译过程,这一过程是计算机自动完成的。在这一过程中系统会首先检查程序是否有错误,如有错误时会给出提示,在提示中可以选择“忽略”、“全部忽略”、“取消”。这里的“忽略”就是不管出现的错误继续编译。当然,一般不应该这样,一旦出现错误提示,应选择“取消”,然后找出相应的错误,改正后再编译。为了容易查找错误,系统还将错误记录下来,在菜单的“项目”—“错误”中可以看到,其中会讲明是什么错误,发生在哪个程序的哪一条语句中。对于有些错误会不给出提示而直接忽略,但它仍然会把错误记录下来。如果系统编译时没有记录错误,那是因为在菜单上的“工具”—“选项”—“常规”—“编程”中的“记录编译错误”没有打开。
5.编译完成后,用户就可以将自己的系统拷贝到其他的机器上运行(即脱离VFP环境)。但是值得注意的是,系统要将相应版本的VFP支持文件拷贝进去,比如,VFP6.0中需要的文件为:VFP6r.dllVFP6renu,dull。
第五章.心得体会
通过本次实训体验,使我基本上掌握了开发一个系统所要做的准备,从采集信息到收集信息再到整理信息的过程是必不可少的。从用户的角度去搜索要完成的基本功能,再决定所要得做的功能模块,最后再编辑和设计各个模块,最后在实现各个模块的连编,完成一个可以实现基本功能的管理系统。
同时该次实训使我掌握了VF系统环境的各种基本操作,如数据库的建立和使用、表单的设计和使用、菜单的设计和使用及菜单和表单之间的关系建立等等。
这次实训使我收益非浅,不但让我学到了很多知识,也使自己开阔了视野,知道了当今科技的快速发展,只有不断学习才可跟上时代的步伐。
考核点评:
成绩分类:A:90-100(优)
B:80-89(良)
C:60-79(中)
D:60以下(差)
评定等级:
评阅人 :