现将我解决思路方法陈述如下
第步创建个工资表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) (含义见项目表下表)
第 2步创建个工资项目登记表tbl_gzxmdy用来记录工资管理实际工作中所有工资项目和项目的间计算关系其中计算关系可以是简单 4则运算也可以包含些(限于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
第 3步现在基础工作已经作好接下来就是实现了
首先定义个GRID风格数据窗口数据源选择Tbl_gztz表并将它放到窗口中进行些数据库联接在窗口OPEN事件中先将设置好工资发放项目进行化设置设置台头设置可见项具体代码如下:
dw_1.transobject(sqlca)
ls_xm,ls_xmmc //定义变量存放工资项目
Declare c1 cursor for //定义游标取出工资项目含义
Select xm,xmmc from tbl_gzxmdy;
Open c1 ;
Fetch c1 o:ls_xm,:ls_xmmc;
//循环提取数据到变量中
Do while sqlca.sqlcode =0
If isnull(ls_xmmc) or ls_xmmc ='' then
//对没有定义工资项目进行隐藏
Dw_1.mody(ls_xm+".width=0")
Else
//设置工资发放项目台头
Dw_1.mody(ls_xm+"_t.text='"+ls_xmmc+"'")
End
Fetch c1 o: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 o: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.itemnumber(row,ls_xm,ldc_je)
End
Fetch c1 o:ls_xm,:ls_jsgs;
Loop
Close c1;
已经在PB7.0+Oracle8i 下测试通过
最新评论