最近在弄一个工资管理系统,在工资计算公式自定义方面遇到问题举例如下:
第一个是:工资帐套 存储帐套 及工资项目 用户定义的公式等等 已经完成
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读取已经初始化数据后的工资 然后输入项为可编辑
如第一个里面提到的 只要输入工资天数和工资单价  则工资金额自动修改
先说一下,存储过程要解决这个并非简单
因为不能确定传入哪个参数  传出的计算结果为哪个 
而且工资表里并非包含这么一个公式,这个只是笨蛋的举例而已

解决方案 »

  1.   

    llh朋友  你的工资公式如何处理的?
      

  2.   

    或者,为什么不考虑计算列呢?
    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)
      

  3.   

    事实上,我已经实现了多数部分
    因为我的公式是转换成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这样的数据敏感控件里,在修改完某个输入项数值后,其参与计算的项会自动修改
      

  4.   

    大概了解你的意思了,但没发现你卡在什么地方
    如果我没理解错的话,你用触发器实现,或者使用过程都问题不大的。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
      

  5.   

    我有个自己用Delphi写的自定义公式,公式项目可以自定义多项,且每个项目可以由不同的项目根据不同的条件生成,如果有兴趣可以联系我,邮箱:[email protected]
    例如定义一个实得底薪,在公式里可写成:if(上班天数>=21,实得底薪,基本底薪*(上班天数/21),基本底薪和上班天数是一个项目。
    此自定义公式经测试成功,且目前有支持十几个函数,但可以增加多个函数