最近在弄一个工资管理系统,在工资计算公式自定义方面遇到问题举例如下:
第一个是:工资帐套 存储帐套 及工资项目 用户定义的公式等等 已经完成
gzxm(工资项目) xmlx(项目类型) jsgs(计算公式) gsjd(公式解读) xmid(项目ID)
工资天数 输入项 gz05
工资单价 输入项 gz06
工资金额 计算项 工资天数*工资单价 round(gz05*gz06,1) gz07第二个是工资表 存储某个月度员工的工资明细,工资表初始化等已经完成。直接调用存储过程解决。通过游标读取xmid和gsjd 然后update就可以了
empid(员工编号) gzyear gzmonth gz01 gz02 gz03 ....gz30(我设置工资项目不会超过30)
001 2008 12 0 0 0 ....第三个 工资管理 advstringgrid读取已经初始化数据后的工资 然后输入项为可编辑
如第一个里面提到的 只要输入工资天数和工资单价 则工资金额自动修改
先说一下,存储过程要解决这个并非简单
因为不能确定传入哪个参数 传出的计算结果为哪个
而且工资表里并非包含这么一个公式,这个只是笨蛋的举例而已
第一个是:工资帐套 存储帐套 及工资项目 用户定义的公式等等 已经完成
gzxm(工资项目) xmlx(项目类型) jsgs(计算公式) gsjd(公式解读) xmid(项目ID)
工资天数 输入项 gz05
工资单价 输入项 gz06
工资金额 计算项 工资天数*工资单价 round(gz05*gz06,1) gz07第二个是工资表 存储某个月度员工的工资明细,工资表初始化等已经完成。直接调用存储过程解决。通过游标读取xmid和gsjd 然后update就可以了
empid(员工编号) gzyear gzmonth gz01 gz02 gz03 ....gz30(我设置工资项目不会超过30)
001 2008 12 0 0 0 ....第三个 工资管理 advstringgrid读取已经初始化数据后的工资 然后输入项为可编辑
如第一个里面提到的 只要输入工资天数和工资单价 则工资金额自动修改
先说一下,存储过程要解决这个并非简单
因为不能确定传入哪个参数 传出的计算结果为哪个
而且工资表里并非包含这么一个公式,这个只是笨蛋的举例而已
create table t1(
id varchar(10),
name varchar(40),
f1 decimal,
f2 decimal,
f3 as f1*f2
)insert into t1(id,name,f1,f2) values('asdf','asfd',1,2)
因为我的公式是转换成sql语句处理的
比如用户设置了基本工资金额为计算项,公式是天数*工资单价,保留2位小数
则我数据库里公式解读列就为round(gz05*gz06,2)
初始化时,利用游标读取非输入项的id和对应公式,生成sql语句进行update
分两步执行,第一步是先update初始值,第2步再通过公式update本来是用advstringgrid读出数据的
后来改成了用dbgrideh,这样的好处是利用select gz05,gz06,round(gz05*gz06,2) as gz07 ....显示数据
在修改完gz05后,重新读取数据,gz07项,也即是gz05参与计算的计算项会自动改变数值但笨蛋不知道如何在dbgrid这样的数据敏感控件里,在修改完某个输入项数值后,其参与计算的项会自动修改
如果我没理解错的话,你用触发器实现,或者使用过程都问题不大的。create table t1(
gzxm varchar(20),
xmlx varchar(20),
jsgs varchar(100),
gsjd varchar(100),
xmid varchar(10)
);truncate table t1;
insert into t1 values('工资天数','输入项','','','gz01');
insert into t1 values('工资单价','输入项','','','gz02');
insert into t1 values('工资金额','计算项','工资天数*工资单价','round(t2.gz01*t2.gz02,1)','gz03');
insert into t1 values('工资金额1','计算项','工资天数*工资单价+1','round(t2.gz01*t2.gz02,1)+1','gz04');
create table t2(
empid varchar(10),
gzyear varchar(10),
gzmonth varchar(10),
gz01 decimal,
gz02 decimal,
gz03 decimal,
gz04 decimal
);create trigger trig_t2 on t2
after insert , update
as
declare
@mysql varchar(2000)
begin
if update(gz01) or update(gz02)
begin
select @mysql = ''
select @mysql = @mysql + xmid + ' = '+ gsjd + ',' from t1 where xmlx = '计算项'
select @mysql = left(@Mysql,len(@mysql)-1)
if exists(select 1 from sysobjects where id = object_id(N'jaxtemp'))
drop table jaxtemp
select * into jaxtemp from inserted
select @mysql = 'update t2 set '+@mysql + ' from jaxtemp t4
where t2.empid = t4.empid and t2.gzyear = t4.gzyear and t2.gzmonth= t4.gzmonth '
exec(@mysql)
drop table jaxtemp
end
endinsert into t2(empid,gzyear,gzmonth,gz01,gz02) values('001','2008','12',1,1)select * from t2
例如定义一个实得底薪,在公式里可写成:if(上班天数>=21,实得底薪,基本底薪*(上班天数/21),基本底薪和上班天数是一个项目。
此自定义公式经测试成功,且目前有支持十几个函数,但可以增加多个函数