高手请进---高分求解IC卡系统的统计考勤异常报表。 (200分)

  • 主题发起人 主题发起人 Harley
  • 开始时间 开始时间
H

Harley

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手:
小弟这里有一套IC卡考勤系统,是某个公司做的,我们单位正在用,不过因为当初设计要求上下班都打卡,可是现在只做到上班打卡,下班不打卡,致使原来的报表都没法使用。
这个系统的大概情况如下,分为四个门,1、3、4号为出入厂区门,2号为厂内出入生产区门。每个门上都有进、出卡机(进出分开刷卡),可以从机号上区分进出几号门(如101为1号门进,304为3号门出,偶数为出,奇数为进)。
上班时间为8:00,这个好办,因为上班要打卡。中午下班为12:00,不打卡,下午上班1:30,打卡,下班5:30不打卡。
每天的其它任何时间进出门都要正规打卡(进打进门卡机,出打出门卡机),请问可不可以从这些打卡记录中计算缺勤、迟到、早退(即只计算1、3、4号门的情况)这几种情况的人员?
原始的数据库是SQL7,这些打卡数据进入att_doordate表中,结构大体如下:
recid(记录流水号) empid(员工卡号) DevID(卡机号,可区分进出、门号) CardDay(打卡时间,时间日期型)
哪位高人能指点一下方法或直接给出答案,给出完美答案的再加200分(不够再加!)
谢谢大家!
如小弟有表述不清,请指明!
 
当然可以了,只是你们区分缺勤、迟到、早退的标准是什么?
按这个标准过滤数据即可了
 
不是过滤那么简单。这个问题要是没有人会就算了。
 
考勤管理必须有上班时间和下班时间,按照你们的实际需求,可以把原来的
上班时间8:00到12:00改为15:30,否则无论无何都不能统计出早退的情况,
只能统计出缺勤,迟到.
 
如果像你说的那样,这些特殊情况是可以确定出来的,因为正常情况下,入口记录应该
比出口记录多2条

以某一个人上午为例,下午类似
1 将当天打卡记录按时间排序,从第1个入口记录开始,如果晚于8:00则迟到
否则,依次读取出、入口打卡记录,取8:00前最晚时间的入口门记录,检索
大于该记录打卡时间,小于8:00的出口记录,如有,如果出口记录打卡时间
小于8:00,则迟到(这种情况和你们的约定有关)。

2 检索12:00之前的最后1条出口记录,如有,则检索该记录时间之后,12:00
之前的入口记录,没有则早退

3 如果此人打卡记录为空则缺勤



 
最简单的方法在SQL中做个自动执行的存储过程,给每个人每天加两条出门记录,
12:00及17:30两条,然后你们现有的程序就应可以处理了。
当然在加之前应先判断该员工当天是否有拉卡记录,如果没有就没必要加了.
 
为什么要改成15:30分,详细说一下好吗?
----------
tseug,你说的方法是比较容易理解的方法,能不能具体实现一段代码?
-----------
如果给每个人都赋值的话,就看不出倒底刷没刷卡了(该系统的原理就是根据上、下班打卡时间来判断的,人为赋值就破坏了其机能)
-----------------
大家还有好的办法吗?
 
没刷卡的人员不给添加记录不就行了!添加记录是在当天下班以后添加的,如果某个员工
没有刷卡记录就不用添加了(如果有加班就在加班时间结束以后 )。
如果你要原始的刷卡记录,那么过滤掉自动添加的记录就过以了.
当然这种方法是不能判断"早退"的
 
此问题我们也请了该系统的设计公司解决,看看他们能不能搞好。
 
最好在sql編寫存儲過程調用,可以解決!
 
kingson你所说的存储过程他们刚做了一个,不过只是从原库中删去正常的记录(即打过两次上班卡的人),然后
其它的记录仍然保留(这样会减少很多条记录),再由人工辨别早退、矿工等情况。如下:
if exists (select * from sysobjects where id = object_id(N'[dbo].[up_Attkqdata1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[up_Attkqdata1]
GO

SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON
GO

CREATE PROCEDURE [up_Attkqdata1]

AS
declare @empid int;
declare @kqdate datetime;
declare @kqdata int;
declare @i int;
declare @sTmpStr varchar(7999);


begin
select @i = 0;
delete from att_kqdata1 where kqdate > '2002-11-01';
declare cur_empid cursor for select empid from att_kqdata group by empid order by empid ;
open cur_empid;
fetch next from cur_empid into @empid
while @@fetch_status = 0
begin
declare cur_kqdate cursor for
select kqdate
from att_kqdata
where empid = @empid
and kqdate >'2002-11-01'
group by empid,kqdate
order by empid,kqdate;

open cur_kqdate ;
fetch next from cur_kqdate into @kqdate ;
while @@fetch_status = 0
begin
insert into Att_kqdata1(empid,kqdate)
values(@empid,@kqdate);
select @i = 0;

declare cur_kqdata cursor for
select kqtime
from att_kqdata
where empid = @empid
and kqdate = @kqdate
order by kqtime;
open cur_kqdata
fetch next from cur_kqdata into @kqdata;
while @@fetch_status = 0
begin
select @i = @i + 1;
select @sTmpStr = ' update Att_kqdata1 '
+ ' set kqdata' + cast(@i as varchar(2))
+ ' = ' + cast(@kqdata as varchar(8))
+ ' from att_kqdata1 '
+ ' where empid = '
+ cast(@empid as varchar(10))
+ ' and convert(varchar(10),kqdate,121) ='''
+ convert(varchar(10),@kqdate ,121) + '''';
exec (@sTmpStr);
if @@ERROR <> 0 goto label ;
fetch next from cur_kqdata into @kqdata;
end
label:
close cur_kqdata;
deallocate cur_kqdata;
fetch next from cur_kqdate into @kqdate ;
end
close cur_kqdate;
deallocate cur_kqdate;
fetch next from cur_empid into @empid ;
end
close cur_empid;
deallocate cur_empid;

end



GO
SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON
GO

但我运行进总会反复出现以下错误提示:
Server: Msg 2627, Level 14, State 1, Procedure up_Attkqdata1, Line 31Violation of PRIMARY KEY constraint 'PK_Att_kqdata1'. Cannot insert duplicate key in object 'Att_kqdata1'.The statement has been terminated.
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
....
不知是何原因?
 
哎,寫的這個存儲過程違背了主鍵約束,你再怎麼插入都是不行的,看一下三十一行的代碼,
你修改一下就可以了,不過這樣處理,不能處理是遲到,早退,曠工,請假等異常情況,如你需要
到源碼空間下載我的寫的源代碼,修改一下,適合你用,你的哪個考勤系統有源碼的話,我可以
給你修改,這種情況我以前在一個工廠的時候也遇到過!如果願意的話,我可以給你修改,
不過,我現在正在寫公司的ERP系統,快完了!有時間幫你改改!
 
谢谢,你说的地方在哪里?我去看看?
这个系统是PB做的,没有源码的。:-(
 
后退
顶部