工资核算信息系统的分析与实现
1. 工资核算信息系统
1.1工资核算信息系统的概念
工资核算信息系统是以工资数据为处理对象的计算机信息系统。主要包括以下几个环节:(1)编制工资单。(2)按部门(指定条件)汇总工资。(3)编制记帐凭证进行帐务处理。(4)打印工资条及工资单。
1.2建立工资核算系统的意义
工资核算的方法比较简单、固定,每个月进行工资计算的程序基本不变,工资核算的这种重复性和规律性为采用工资系统核算提供了可能性。在手工方式下,会计人员为了搞好工资核算,需要投入大量的精力和时间,但仍然很难避免错误的出现。采用工资核算系统后,无论从精度上、速度上、还是灵活性上,都是手工方式所不可比拟的,它可大大减轻财务人员的工作强度,提高工作效率。因此采用工资信息系统具有非常重要的意义。
1.3工资核算信息系统与会计信息系统的关系
会计信息系统是以会计数据为处理对象的计算机信息系统,工资核算系统是会计核算信息系统的一个子系统,又是财务处理系统的基础,它可以单独使用,也可以与会计核算其它系统一起使用,其与会计核算系统的关系如图1.1所示。
图1.1会计核算系统
图1.1 会计核算系统的功能结构
1.4工资核算系统的设计原则和目标 建立工资核算信息系统应遵循以下原则:
系统的原则:从系统的原则出发,以会计核算系统系统为基础,并与会计核算系统相协调,与财务职能相适应;提高经济效益的原则;逐步完善、发展的原则;系统统一性原则;精简原则。
建立会计信息系统的目标是:信息收集制度化;信息加工标准化;信息传递规范化;信息内容系统化;信息储存档案化;会计信息工作专业化。
2、工资核算系统的功能、结构、流程分析
2.1工资核算系统的功能、结构分析
工资核算信息系统应具有灵活设置工资项目和工资表格的功能、快速准确的核算功能、方便实用的查询功能以及必要的打印功能。工资管理系统软件的功能包括:
(1)输入各种工资数据,如考勤、工时等。
(2)准确无误地进行工资核算。按出勤情况自动进行个人工资计算;按收入情况自动进行个人收入调节税计算;可进行数据转换以实现与银行传递数据,由银行代发工资。
(3)查询个人工资、部门工资、单位工资以及各种工资数据。 (4)打印工资发放表、工资条、汇总表和职工花名册等。 其功能结构如图2.1所示:
图2.1 工资核算系统的功能结构图
2.2工资核算系统的流程分析
本工资软件程序的特点是数据流程比较简单,在整个系统中只有一个核心操作数据库tmp_gzk.dbf,数据关系简单增强了系统的运行稳定。其数据流程如下图所示:
图2.2 工资核算系统数据流程图
表2.1数据流属性表
2.3数据字典
数据库设计的主要任务是根据系统的实现功能与数据流图确定系统所需的数据库。在本系统设计中,主要涉及以下几个主要数据库:
1.密码数据表(gzkusers.dbf )
gzkusers(usename c(8),password c(20)) 记录:
记录号:usename password
1 zjg [***********]94
2. 部门数据表(gzk_bm.dbf)
gzk_bm(部门 c(2) ,部门名称 c(10)) 记录:
记录号: 部门 部门名称
1 01 局办 2 02 综合处 3 03 财务处 „ „ „ 3. 班组数据表(gzk_bz.dbf)
gzk_bz(班组 c(3) ,班组名称 c(10)) 记录:
记录号: 班组 班组名称 1 01 无 2 02 一派 „ „ „
3. 人员类别数据表(gzk_rylb.dbf)
gzk_rylb (类别 c(2) ,类别名称 c(10)) 记录:
记录号: 类别 类别名称 1 01 在职 2 02 退养 „ „ „
4.公式数据表(gzk_gs.dbf)
gzk_gs(栏目1 c(10),栏目2 c(256),类别 c(2)) 记录:
记录 栏目1 栏目2 类别 1 实发工资 =基础工资+职务工资+„ 01 2 实发工资 =(基础工资+职务工资+„)*0.6 02 „ „ „ „ 5. 工资项目修改库(gzk_stru.dbf)
gzk_stru( field_name c(10),field_type c(1),field_len n(3),field_dec n(3),list_check n(1))
记录:
记录号 field_name field_type field_len field_dec list_check 1 姓名 c 10 0 2 身份证 c 18 0 „ „ „ „ „ 7 类别 c 2 0
前七项是由系统设定的,在程序中是屏蔽掉的,用户是不能修改的。以下由用户根据单位工资项目自行定义。
8 基础工资 n 6 2 0 „ „ „ „ „ „
6. 操作工资库,结构由工资项目修改库确定,在程序中是由工资项目修改库生成而建立的。
除以上几个主要数据表外,在程序中还生成一系列临时表,主要为实现数据过渡、查询和打印功能的,在主程序退出时会自动删除。经过上述已设计好的数据流图,数据字典就可以进行下一步的程序实现了。
3、工资核算系统的实现
3.1模块流程图
3.2模块设计与编码
本节通过对部分模块的设计与编码示例来说明工资核算信息系统的实现。
3.2.1. 主程序(gzgl.prg )
set talk off set curs off „
set safe off set cent on
&&以上代码是设置应用程序的进行环境 set help to gzgl.chm &&设置帮助文件 set sysmenu off &&关闭系统菜单 clear all &&清除
public logpassword &&设置公共变量,此变量当密码为真时为.t. 否则为.f. logpassword=.f. &&给logpassword 赋初值 with _screen &&设定FoxPro 主窗口属性 .visible=.t.
.icon='scdrespl.ico' &&设置主窗口左上角的图标 .picture='setup.bmp' &&设置主窗口的背景图案 .windowstate=2 &&设置窗口最大化 .caption='【工资管理系统】' &&设置窗口标题 endwith
do form SOFABOUT with 1200 &&弹出软件关于窗口, 时间为1.2秒。 clear inkey(1.5)
set curs on &&打开光标
do form loginSYS &&弹出登陆窗口,等待用户输入登陆密码。
IF logpassword &&对返回的logpassword 值进行判断如果为真则进行gzgl.mpr 菜单程序,进入系统,否则退出程序。
do gzgl.mpr
ACTIVATE MENU _MSYSMENU NOWAIT READ events
ENDIF CLEAR EVENTS CLOSE ALL
SET SYSMENU TO DEFAULT
3.2.2.菜单程序(gzgl.mpr )
本程序中把菜单程序作为系统初始界面,并由主程序gzgl.prg 调用。菜单程序对应模块参照第三章详细设计中3.1 程序功能结构。
3.2.3.登陆窗口模块(loginsys.scx)
登陆模块运行界面如下:
下面主要介绍‘确认’按钮的click 事件。 sele gzkusers &&选择密码库 local oldpassword,wmz
loca for usename=thisform.combo1.value wmz=password &&取出密码库中的伪码
PP='' &&以下代码是对密码库password 字段中保存的密码解密 FOR II=10 TO 1 step -1
PP=PP+SUBS(WMZ,II,1)+SUBS(WMZ,II+10,1) ENDFOR
DD=SUBS(PP,17,4)+SUBS(PP,1,16) M1=SUBS(DD,1,10) M2=SUBS(DD,11,10)
ZMZ=INT(VAL(M1)-VAL(M2)) &&通过设定的数字组合得到真密码 oldpassword=zmz
if allt(thisform.text1.value)=allt(str(zmz)) *=messagebox('欢迎使用工资系统',0+48+0) logpassword=.t. close all release thisform else
=messagebox('你输入的密码错误, 请与工资管理员联系!',0+16+0) thisform.text1.setfocus close all release thisform endif
3.2.4. 修改密码窗体模块
(changpassword.scx)
窗体中确认按钮的click 事件。主要包含对用户设定的新密码进行加密成为伪码后存入密码数据库中,加密程序是解密的逆过程,代码略。
3.2.5. 工资库新建/修改模块(edit_gzkstru.scx)
在窗体中主要包含grid 控件,添加、删除、确认按钮,代码略。
3.2.6.设置计算公式模块(editgs.scx 表单)
在此表单的设计中主要涉及二个关键部分:
(1)对应工资栏目如何动态地在表单中显示,因为由于工资结构的不同,需要动态改变工资栏目的显示内容。此功能主要是通过以下代码实现的:
form1.init 事件 „
use gzk_rylb in 0 use gzk_gs excl in 0 use gzk_stru in 0 sele gzk_stru
scan for recno()>7 &&屏蔽掉系统定义的的栏目 k1='L'+iif(k
thisform.addobject('&k1','label') &&向表单中增加对象label thisform.&k1..forecolor=rgb(0,0,255) &&设置label 的前景色 thisform.&k1..visible=.t. thisform.&k1..backstyle=0
thisform.&k1..top=50+l*15 &&设置label 的上边界
thisform.&k1..left=(i-1)*100+20 &&设置label 的左边界 thisform.addobject('&k2','label') &&设置栏目名称 thisform.&k2..visible=.t. thisform.&k2..backstyle=0 thisform.&k2..top=50+l*15 thisform.&k2..left=(j-1)*100+60 i=i+1 j=j+1
if mod(i,7)=0 &&设置回行显示 l=l+1 i=1 j=1 endif K=K+1 endscan
„
(2)对应不同人员类别设置不同的计算公式的实现。
在程序中主要的通过一个combo 控件与grid1控件相关联来实现的。通过公式数据库gzkgs.dbf 中的“类别”字段分类计算公式。
记录 栏目1 栏目2 类别 1 实发工资 =基础工资+职务工资+„ 01(在职) 2 实发工资 =(基础工资+职务工资+„)*0.6 02(退养) „ „ „ „
3.2.7. 工资计算模块(gzjs.prg )
close all use tmp_gzk in 0 use gzk_gs in 0 sele gzk_gs
for I=1 to recc() &&此处关键是防止公式设置次序不同而计算出错 go top scan
k1=allt(栏目1)
k2=allt(substr(栏目2,2)) k3="'"+allt(类别)+"'" sele tmp_gzk
repl all &k1 with &k2 for 类别=&k3 sele gzk_gs endscan endfor
3.2.8. 数据录入/修改模块(edit_gzk.scx)
在此表单的设计中主要涉及三个关键部分(1)复选按钮框如何根据工资库结构动态变化,(2)复选按钮选定状态如何在grid 控件中实现动态对应,(3)如何将部门、人员类别与grid 控件进行动态绑定,以减少用户输入错误率。
对于第(1)个问题可参照设置计算公式模块(editgs.scx )中的方法实现。
对于第(2)(3)个问题在本程序中主要通过设计用户类mycheckbox 实现的, 部分代码如下:
mycheck.click „ local i i=1
*****移去对应combo1 sele gzk_stru
scan for list_check=1
k1='column'+str(i,iif(i
if field_name='类别'.or.field_name='部门'
thisform.grid1.&k1..removeobject('combo1','combobox') endif i=i+1 endscan i=1 ****
sele gzk_stru if this.value=1
repl list_check with 1 for field_name=this.caption else
repl list_check with 0 for field_name=this.caption endif
* k=substr(this.name,6)&&用此顺序要调整 * this.parent.grid1.deletecolumn(&k) thisform.grid1.recordsource='tmp_gzk' coun for list_check=1 to n thisform.grid1.columncount=n scan for list_check=1
k1='column'+str(i,iif(i
k3=allt(field_name)
**//判断是否显示组合框
if field_name='类别'.or.field_name='部门'
thisform.grid1.&k1..addobject('combo1','combobox') thisform.grid1.&k1..currentcontrol='combo1' thisform.grid1.&k1..combo1.visible=.t. thisform.grid1.&k1..combo1.rowsourcetype=6 thisform.grid1.&k1..combo1.columncount=2 do case
case field_name='类别'
thisform.grid1.&k1..combo1.rowsource='gzk_rylb.类别, 类别名称' case field_name='部门'
thisform.grid1.&k1..combo1.rowsource='gzk_bm.部门, 部门名称' endcase else
thisform.grid1.&k1..currentcontrol='text1' endif
thisform.grid1.&k1..controlsource='&k2' thisform.grid1.&k1..header1.alignment=2 thisform.grid1.&k1..header1.caption='&k3'
thisform.grid1.&k1..width=max(field_len*8,len(field_name)*6) i=i+1 endscan
thisform.grid1.setfocus thisform.grid1.refresh „
3.2.9查询(selegzk.scx )
查询模块是利用visual foxpro 6.0自带类库实现的,代码略。
3.2.10生成月工资库模块(creatmonthgzk.scx)
生成月工资库控件的click 事件如下: k='gzk'+left(allt(dtos(date())),6)
kk='gzk'+left(allt(dtos(date())),6)+'.dbf'
if file(sys(5)+sys(2003)+'\databak\'+'&kk') &&此处主要对文件路径的设置。 if messagebox('本月工资库已存在,要重新建立吗?',1+16+0)=1 close all else
thisform.release return endif endif
copy file tmp_gzk.dbf to &kk close all
copy file '&kk' to sys(5)+sys(2003)+'\databak\'+'&kk' dele file &kk
3.2.11打印工资模块(printone.scx )
数据库报表及表单设计都是静态的,如何根据不同的数据结构生成不同的报表是vfp 报表设计中的一个难题,一般的方法是将数据导出到excel 表中或者word 文档中来实现,在此程序中我对vfp 动态制表进行了探索,获得了一些设置方法,虽然与其他专用报表软件不能媲美。但至少找到了一个解决的途径。以下是实现的部分代码:
„
titletext='"'+space(5)+thisform.text1.value+'"' &&设置报表标题 „
for each ii in .columns if ii.width0
a(i,1)=ii.controlsource a(i,2)=ii.header1.caption k=k+ii.controlsource+',' i=i+1 J=J+1 endif endfor
k=substr(k,1,len(k)-1) endwith
SELE lstmp
copy fiel &k to lstmpfrx &&以上代码主要实现根据用户选择的打印栏目生成临时打印数据库
crea repo lsfrx from lstmpfrx use lsfrx.frx excl in 0 sele lsfrx go 2
insert blank before
repl platform with 'WINDOWS',objtype with 9,objcode with 0,NOREPEAT with .f.,pagebreak with .f.,colbreak with .f.,resetpage with .f.,plain with .f., height with 1354*headheight for platform=' '
go 4
inser blank before &&设定数据分组 if srfgroup='姓名'
repl platform with 'WINDOWS',objtype with 9,objcode with 3,expr with 'lstmpfrx. 姓名 ',NOREPEAT with .f.,pagebreak with .f.,colbreak
with .f.,resetpage with .f.,plain with .f., height with 1354 for platform=' '
else
repl platform with 'WINDOWS',objtype with 9,objcode with 3,expr with 'lstmpfrx. 部门名称 ',NOREPEAT with .f.,pagebreak with .f.,colbreak
with .f.,resetpage with .f.,plain with .f., height with 1354 for platform=' '
endif
***调整字体和字号 if .not.empty(srffont)
fontface1=substr(srffont,1,at(',',srffont)-1)
fontsize1=substr(substr(srffont,at(',',srffont)+1),1,at(',',substr(srffont,at(',',srffont)+1))-1)
repl fontsize with val(fontsize1) for objtype=5.or.objtype=8 repl fontface with fontface1 for objtype=5.or.objtype=8 endif
****调整组间距
repl height with height+jj for objcode=3
repl vpos with vpos+jj for objtype>4.and.objtype
„
repo form lsfrx.frx window winreport prev &&打印输出
„
由上述模块的设计可以看出,通过采用计算机技术,工资核算信息系统的各项功能是完全可以实现的,本人运用工资核算信息系统处理工资核算业务,感觉非常方便,提议各企事业单位都来开发使用工资核算信息系统,使工资核算信息系统发挥更大的效用。
本文的写作得到了丽水学院周建东老师和其他计算机专业老师的热心指导,在此深表感谢。
21