我想设计一个工资管理系统,但是到计算工资得部分卡住了,我设计了一个出勤表(当然还有其它相关的表)和工资表,结构如下:
出勤表
员工编号 加班小时数 请假天数 迟到早退次数 旷工次数 出差天数
000000 1 2 0 0 0
工资表
员工编号 基本工资 每小时加班费 总加班费 每一天请假扣费 请假总扣费 每次迟到扣费 迟到总扣费 每次旷工扣费 旷工总扣费 每一天出差补贴 总出差补贴 实发工资
000000 1500 100 100 30 60 10 0 30
0 80 0
怎样用存储过程实现在工资表输入上述数据联系出勤表的数据自动在实发工资列里计算出结果?另:自定义函数不知道行不行?
出勤表
员工编号 加班小时数 请假天数 迟到早退次数 旷工次数 出差天数
000000 1 2 0 0 0
工资表
员工编号 基本工资 每小时加班费 总加班费 每一天请假扣费 请假总扣费 每次迟到扣费 迟到总扣费 每次旷工扣费 旷工总扣费 每一天出差补贴 总出差补贴 实发工资
000000 1500 100 100 30 60 10 0 30
0 80 0
怎样用存储过程实现在工资表输入上述数据联系出勤表的数据自动在实发工资列里计算出结果?另:自定义函数不知道行不行?
解决方案 »
- 大家看看这个问题。
- 有点困惑。希望给解答一下!!!!!
- 真诚请大家帮忙,一个关于排班的统计!没有想法了:(
- 2条参数不同的存储过程在对一条记录update,我如何保证该条记录只被首先执行的存储过程update记录呢?
- 一个面试题,关于存储过程的,在线急等!!!!
- 这样的sql语句该怎么写??
- 恢复质疑数据库(求助)
- 十万火急!!!一个word 文档怎么存入sql 2000 中,应该属于哪种数据类型.???
- 求一复杂的SQL语句,高手看看!
- rtf 字串如何保存到 nvarchar字段,因为rtf字串里有许多单引号:
- 如果对查询结果:0000000100010001进行分段,然后得到另一查询结果。
- 依旧是排名问题
===》
似乎可以利用触发器
Create trigger tri_test on 工资表
after insert
as
begin
Update A
set 总加班费= B.每小时加班费 * C.加班小时数 ,
请假总扣费=B.每一天请假扣费 * C.请假天数 ,
迟到总扣费=B.每次迟到扣费 * C.迟到早退次数,
旷工总扣费=B.每次旷工扣费 * C.旷工次数,
总出差补贴=B.每一天出差补贴 * C.出差天数 ,
实发工资 = B.基本工资 + (B.每小时加班费 * C.加班小时数) + (B.每一天出差补贴 * C.出差天数)
-(B.每一天请假扣费 * C.请假天数)-(B.每次迟到扣费 * C.迟到早退次数)-(B.每次旷工扣费 * C.旷工次数)
from 工资表 A, inserted B, 出勤表 C
where A.员工编号=B.员工编号
and A.员工编号=C.员工编号
end
类似于
create table test
(
a int ,
b int ,
c as (a+b)
)
中的c列这样的定义形式,是不行的,计算列只能引用本表中的列。
采用4楼的方法是个不错的选择
另外,象这种需要计算的且列值不固定的情况,也可以不用形成一列,需要的时候联查再进行计算也要以的
例如select
总加班费= B.每小时加班费 * C.加班小时数 ,
请假总扣费=B.每一天请假扣费 * C.请假天数 ,
迟到总扣费=B.每次迟到扣费 * C.迟到早退次数,
旷工总扣费=B.每次旷工扣费 * C.旷工次数,
总出差补贴=B.每一天出差补贴 * C.出差天数 ,
实发工资 = B.基本工资 + (B.每小时加班费 * C.加班小时数) + (B.每一天出差补贴 * C.出差天数)
-(B.每一天请假扣费 * C.请假天数)-(B.每次迟到扣费 * C.迟到早退次数)-(B.每次旷工扣费 * C.旷工次数)
from 工资表 A, inserted B, 出勤表 C
where A.员工编号=B.员工编号
and A.员工编号=C.员工编号
create table TT1(员工编号 nvarchar(20),加班小时数 int ,请假天数 int , 迟到早退次数 int ,旷工次数 int ,出差天数 int)insert TT1
select '000000',1 , 2 , 0 , 0 , 0工资表
create table TT2(员工编号 nvarchar(20),基本工资 money,每小时加班费 money, 总加班费 money,
每一天请假扣费 money, 请假总扣费 money, 每次迟到扣费 money, 迟到总扣费 money,
每次旷工扣费 money, 旷工总扣费 money, 每一天出差补贴 money, 总出差补贴 money, 实发工资 money)insert TT2(员工编号,基本工资,每小时加班费,每一天请假扣费,每次迟到扣费,每次旷工扣费,每一天出差补贴)
select '000000',1500,100,30,10,30,80
Create trigger tri_test on TT2
for insert
as
begin
update A
set 总加班费= B.每小时加班费*C.加班小时数 ,
请假总扣费=B.每一天请假扣费 * C.请假天数 ,
迟到总扣费=B.每次迟到扣费 * C.迟到早退次数,
旷工总扣费=B.每次旷工扣费 * C.旷工次数,
总出差补贴=B.每一天出差补贴 * C.出差天数 ,
实发工资 = B.基本工资 + (B.每小时加班费 * C.加班小时数) + (B.每一天出差补贴 * C.出差天数)
-(B.每一天请假扣费 * C.请假天数)-(B.每次迟到扣费 * C.迟到早退次数)-(B.每次旷工扣费 * C.旷工次数)
from TT2 A, inserted B, TT1 C
where A.员工编号=B.员工编号
and A.员工编号=C.员工编号
endselect * from TT2员工编号 基本工资 每小时加班费 总加班费 每一天请假扣费 请假总扣费 每次迟到扣费
迟到总扣费 每次旷工扣费 旷工总扣费 每一天出差补贴 总出差补贴 实发工资
000000 1500.00 100.00 100.00 30.00 60.00 10.00 0.00 30.00 0.00 80.00 0.00 1540.00(1 行受影响)