表结构如下: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; LoopClose c1;dw_1.retrieve() |
然后呢,当然就是对数据窗口进行设置,让它具有自动计算功能了。数据窗口的ItemChanged事件是对每一列值发生变化时触发的,我们只要对它进行编程就可以实现自动计算功能。
| String ls_xm, ls_jsgs //定义变量,存放工资项目,计算公式String ls_dwonameDouble 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;LoopClose c1; |
程序已经在PB7.0+Oracle8i 下测试通过。

