创建一条触发器,现在我的表是这样的:
create table MONTHPAY(
EMPCODE CHAR(11) NOT NULL,--员工编号
CURRENTTIME DATE,--发放时间(更改,只显示年月)
BASEPAY NUMERIC,--基本工资
ATTEND NUMERIC,--出勤奖罚
INSURANCE NUMERIC,--保险
FUND NUMERIC,--基金
SUBSIDY NUMERIC,--津贴
BONUS NUMERIC,--奖金
DEFAULT1 NUMERIC,--预留1
DEFAULT2 NUMERIC,--预留2
DEFAULT3 NUMERIC,--预留3
TAX NUMERIC,--缴税
        total numeric,--总工资
PRIMARY KEY(EMPCODE,CURRENTTIME)
)插入记录时不写入total值,在插入成功后自动计算填写总工资
total=BASEPAY+ATTEND+INSURANCE+FUND+SUBSIDY+BONUS+DEFAULT1+DEFAULT2+DEFAULT3+TAX请问要怎么写这个触发器?另外还有一个出勤表,用来计算出勤奖罚
create table ATTENDENCE(
SERIAL INT IDENTITY(0,1),--明细序列(标识符)
EMPCODE CHAR(11),--员工编号
ATTEVENT NCHAR(4),--事件(旷工、请假、加班)
ATTDATE DATE,--事件日期
)
当事件为矿工时attend-100,请假attend-50,加班attend+100
不知道这个可不可以写在MONTHPAY表的触发器里?即在插入时也不手动去写它的值,插入后自动计算填写
我的想法是在出勤表按员工编号分组后计算出来再插入,但不知道怎么写触发器。
在插入MONTHPAY的表记录时就触发计算填写请各位帮帮忙吧~谢谢了!!

解决方案 »

  1.   

    第一种用计算字段就可,或查询直接在SELECT语句计算。第二种情况如果要在MONTHPAY用触发器,也只能用替代触发器。
      

  2.   

    INSTEAD OF INSERT  --前置触发
      

  3.   

    如果写入的时候要自己算好插入吗?那不是很麻烦……
    求SQL语句
      

  4.   


    --生成测试数据(没事可做了)
    create table MONTHPAY
    (
    EMPCODE CHAR(11) NOT NULL,--员工编号
        CURRENTTIME DATETIME,--发放时间(更改,只显示年月)
        BASEPAY NUMERIC,--基本工资
        ATTEND NUMERIC,--出勤奖罚
        INSURANCE NUMERIC,--保险
        FUND NUMERIC,--基金
        SUBSIDY NUMERIC,--津贴
        BONUS NUMERIC,--奖金
        DEFAULT1 NUMERIC,--预留1
        DEFAULT2 NUMERIC,--预留2
        DEFAULT3 NUMERIC,--预留3
        TAX NUMERIC,--缴税
        TOTAL NUMERIC,--总工资
    )
    insert into MONTHPAY
    select '1','','20','0','10','20','30','10','10','10','10','10','0' union all
    select '2','','30','0','10','20','30','10','10','10','10','10','0' union all
    select '3','','40','0','10','20','30','10','10','10','10','10','0' union all
    select '4','','50','0','10','20','30','10','10','10','10','10','0'
    gocreate table ATTENDENCE
    (
    SERIAL INT IDENTITY(0,1),--明细序列(标识符)
    EMPCODE CHAR(11),--员工编号
    ATTEVENT NCHAR(4),--事件(旷工 0、请假 1、加班 2、正常 3)
    ATTDATE DATETIME,--事件日期
    )
    insert into ATTENDENCE
    select '1','0','' union all
    select '2','1','' union all
    select '3','2','' union all
    select '4','3',''
    gocreate trigger T_MONTH on MONTHPAY
    for insert
    as
    begin
    update MONTHPAY
    set TOTAL = BASEPAY+ATTEND+INSURANCE+FUND+SUBSIDY+BONUS+DEFAULT1+DEFAULT2+DEFAULT3+TAX
    +(case b.ATTEVENT when '0' then -100 when '1' then -50 when '2' then 100 else 0 end)
    from ATTENDENCE b where b.EMPCODE = MONTHPAY.EMPCODE
    end
    goinsert into ATTENDENCE select '5','0',''
    insert into MONTHPAY select '5','','60','0','10','20','30','10','10','10','10','10','0'select EMPCODE,TOTAL from MONTHPAYdrop table MONTHPAY,ATTENDENCEEMPCODE     TOTAL
    ----------- ----------
    1           30
    2           90
    3           250
    4           160
    5           70(5 行受影响)
      

  5.   


    SQL里的Tab在这里怎么排不好版呢?研究ing...
      

  6.   

    呵呵,那个total最终被我删掉用视图做了,园丁大大的代码被我改了一下直接update工资表的attend了~学习ING,非常感谢!