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

时间:2007-06-15 来源: 作者: 【字体: 减小 增大收藏 | 投稿
  

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

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

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

  表结构如下:tbl_gztz

财软.联盟.fs119.net

数据列名 数据列类型 数据列含义 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内容函数)。

财 软联盟 fs119.net

  表结构如下:
财.软联盟.fs119.net

数据列名 数据列类型 数据列含义 Xm Varchar2(10) 工资项目名称 Xmmc Varchar2(20) 工资项目的含义 Jsgs Varchar2(40) 对应的计算关系 Flag Varchar2(1) 是否启用该项(1为启用,0为停用)

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

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

SelectCnameFromColWhereTname='TBL_GZTZ'andColtype='NUMERIC'OrderByColno;

财,软联盟,fs119.net

  工资项目数据维护举例说明:
财管,家园,fs119.net

Xm Xmmc Jsgs Gz1 技能工资 Gz2 浮动工资 Gz3 保险工资 Gz4 应发工资 Gz1Gz2 Gz5 房租费 Gz6 实发工资 Gz4-Gz5

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

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

dw_1.settransobject(sqlca)
stringls_xm,ls_xmmc//定义变量,存放工资项目
Declarec1cursorfor//定义游标,取出工资项目的含义
Selectxm,xmmcfromtbl_gzxmdy;
 Openc1;
 Fetchc1into:ls_xm,:ls_xmmc;
 //循环提取数据到变量中
 Dowhilesqlca.sqlcode=0
  Ifisnull(ls_xmmc)orls_xmmc=''then
   //对没有定义的工资项目进行隐藏
   Dw_1.modify(ls_xm".width=0")
  Else
   //设置工资发放项目的台头
   Dw_1.modify(ls_xm"_t.text='"ls_xmmc"'")
  Endif
  Fetchc1into:ls_xm,:ls_xmmc;
 Loop

Closec1;
dw_1.retrieve()

财 软联盟 fs119.net

财软 联盟 fs119.net

  然后呢,当然就是对数据窗口进行设置,让它具有自动计算功能了。
数据窗口的ItemChanged事件是对每一列值发生变化时触发的,我们只要对它进行编程就可以实现自动计算功能。
财管家园.fs119.net

Stringls_xm,ls_jsgs//定义变量,存放工资项目,计算公式
Stringls_dwoname
Doubleldc_je//得到计算公式计算的结果值

财软 联盟 fs119.net

This.accepttext()
Declarec1cursorfor//定义游标,取出工资项目的含义
Selectxm,jsgsfromtbl_gzxmdy;
Openc1;
Fetchc1into:ls_xm,:ls_jsgs;
//循环提取数据到变量中
Dowhilesqlca.sqlcode=0
 Ifisnull(ls_jsgs)orls_jsgs=''then
 Else
  //计算统计列结果,利用Evaluate计算
  ldc_je=double(dw_1.Describe("Evaluate(lookupdisplay('"ls_jsgs"')"row")"))
  //设置计算结果到工资统计项目列
  this.setitemnumber(row,ls_xm,ldc_je)
 Endif
 Fetchc1into:ls_xm,:ls_jsgs;
Loop
Closec1; 财软联 盟 fs119.net

  程序已经在PB7.0Oracle8i下测试通过。 财软.联盟.fs119.net

财管.家园.fs119.net


上一篇:PB/Sybase系统开发中的数据库转移
下一篇:在PowerBuilder中动态调用函数

精品课程推荐