PB中关于动态工资项目问题的解决办法

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

我在做人事管理软件时发现一个问题就是,工资管理中工资的发放项目经常会发生变化,而且工资项目之间的计算关系也经常发生变化,这为实际的编程带来了很大的麻烦。其实实际工作中还有很多类似的情况需要解决,希望能为大家提供多一种思路以供参考。

现将我的解决方法陈述如下。

第一步,创建一个工资表tbl_gztz,用来记录职工的每个月的工资发放情况,其中就包括工资的发放项目。所以这个表字段应该尽量地多,你大可放在50个以上。 表结构如下:tbl_gztz

数据列名

数据列类型

数据列含义

Zgbh

Varchar2(10)

职工编号

Mc

Varchar2(10)

职工名称

Yf

Varchar2(6)

工资月份

Gz1

Number(12,2)

(含义见项目表下表)

Gz2

Number(12,2)

(含义见项目表下表)

Gz3

Number(12,2)

(含义见项目表下表)

Gz4

Number(12,2)

(含义见项目表下表)

Gz5

Number(12,2)

(含义见项目表下表)

第二步,创建一个工资项目登记表tbl_gzxmdy,用来记录工资管理实际工作中的所有的工资项目和项目之间的计算关系。其中计算关系可以是简单的四则运算,也可以包含一些函数(限于PB内容函数)。

表结构如下:

数据列名

数据列类型

数据列含义

Xm

Varchar2(10)

工资项目名称

Xmmc

Varchar2(20)

工资项目的含义

Jsgs

Varchar2(40)

对应的计算关系

Flag

Varchar2(1)

是否启用该项(1为启用,0为停用)

工资的发放项目从工资发放表Tbl_gztz中取出字段,这个在Oracle(或其它数据)中很容易取出,然后将取出的字段插入到工资项目定义表Tbl_gzxmdy中,并为每个项目定义其含义,没有为其定义的,到时候将不显示出来。

为了方便解释,举例说明比较清楚。取出发放项目字段的SQL语句如下:

Select Cname From Col Where Tname = 'TBL_GZTZ' and Coltype = 'NUMERIC' Order By Colno;

工资项目数据维护举例说明:

Xm

Xmmc

Jsgs

Gz1

技能工资

Gz2

浮动工资

Gz3

保险工资

Gz4

应发工资

Gz1 + Gz2

Gz5

房租费

Gz6

实发工资

Gz4 - Gz5

第三步,现在基础工作已经作好,接下来就是程序实现了。

首先,定义一个GRID风格的数据窗口,数据源选择Tbl_gztz表。并将它放到窗口中,进行一些数据库联接。在窗口的OPEN事件中,先将设置好的工资发放项目进行初始化设置,设置台头,设置可见项。具体代码如下:

dw_1.settransobject(sqlca)

string ls_xm,ls_xmmc //定义变量,存放工资项目

Declare c1 cursor for //定义游标,取出工资项目的含义

Select xm,xmmc from tbl_gzxmdy;

Open c1 ;

Fetch c1 into:ls_xm,:ls_xmmc;

//循环提取数据到变量中

Do while sqlca.sqlcode =0

If isnull(ls_xmmc) or ls_xmmc ='' then

//对没有定义的工资项目进行隐藏

Dw_1.modify(ls_xm+".width=0")

Else

//设置工资发放项目的台头

Dw_1.modify(ls_xm+"_t.text='"+ls_xmmc+"'")

End if

Fetch c1 into:ls_xm,:ls_xmmc;

Loop

Close c1;

dw_1.retrieve()

然后呢,当然就是对数据窗口进行设置,让它具有自动计算功能了。

数据窗口的ItemChanged事件是对每一列值发生变化时触发的,我们只要对它进行编程就可以实现自动计算功能。

String ls_xm, ls_jsgs //定义变量,存放工资项目,计算公式

String ls_dwoname

Double ldc_je //得到计算公式计算的结果值

This.accepttext()

Declare c1 cursor for //定义游标,取出工资项目的含义

Select xm,jsgs from tbl_gzxmdy;

Open c1 ;

Fetch c1 into:ls_xm,:ls_jsgs;

//循环提取数据到变量中

Do while sqlca.sqlcode =0

If isnull(ls_jsgs) or ls_jsgs ='' then

Else

//计算统计列结果,利用Evaluate计算

ldc_je = double(dw_1.Describe("Evaluate(lookupdisplay('" + ls_jsgs+"')" +row+ ")"))

//设置计算结果到工资统计项目列

this.setitemnumber(row,ls_xm,ldc_je)

End if

Fetch c1 into:ls_xm,:ls_jsgs;

Loop

Close c1;

程序已经在PB7.0+Oracle8i 下测试通过。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航