您好:
相關程式碼大致如下
主要是刷卡紀錄, 要轉到另一個LOG 表格
因為 新增/修改 刷卡紀錄時(目前都只有 寫入資料到刷卡紀錄表,很少UPDTE)
要去判斷,上班/下班 上班時間最前一筆資料, 下班最後一筆資料
但 會有2次刷卡的情況
但目前 這一個treiger
刷卡紀錄表寫入資料
|--trigger 判斷,寫入/異動到 LOG 檔
|---另外一個proc 排程去抓 log檔資料,並異動log檔部分欄位
這出現一個現象
1.刷卡時寫入一筆資料到 刷卡檔,此時,判斷要新增資料LOG,並沒有及時寫入到log
而是等 另一個PORC 去執行時, log檔才會出現 該筆新增的刷卡資料
2.刷卡時寫入一筆資料到 刷卡檔,此時,判斷要 異動LOG, 他有異動LOG資料
這應該要如何抓問題
謝謝
DECLARE @TEMP1 TABLE (
rw smallint,
comp varchar(3),
d_card varchar(8),
t_card varchar(6),
...
X11 varchar(2),
X12 varchar(2)
);
DECLARE @today as varchar(8)
----------新增 及異動
IF EXISTS(SELECT 1 FROM inserted)
BEGIN
------------*****----
SELECT @today= MAX( CONVERT(VARCHAR(8), recorddatetime,112 ) ) from inserted
SELECT @today
insert INTO @TEMP1
select
m.*
from (
select
FROM inserted m
WHERE ...
) m
LEFT JOIN (
/*上班 ,取關聯最新的一筆,看狀態 */
) i on m.work_no=i.work_no ...
LEFT join (
) o on m.work_no=o.work_no ...
WHERE m.rw=1 /*只抓上班最前,下班最後*/
------------------------------------------上班, 新增
Insert Into log --要改 DB
( )
SELECT d_card,t_card,work_no,..
from @TEMP1
WHERE shift='11' and X11='I'
-------------------------------下班,A 新增 / 更新
update t set t.stus='C'
from @TEMP1 m inner join log t --要改 DB
on m.work_no=t.work_no
WHERE m.shift='12' and m.X12='A'
and m.t_card_i =t.t_card
and (m.shift='12' and t.shift='11') and t.stus=''
-------------------------------下班, 新增
Insert Into log
( d_card, t_card, work_no ... )
SELECT d_card,t_card,work_no,shift,card_no,
first_name,
from @TEMP1
WHERE shift='12' and X12 IN ('I','A')
-------------------------------下班,更新
update t set t.t_card=m.t_card
from @TEMP1 m inner join log t
on m.work_no=t.work_no
AND ( m.ct_o -1 ) =t.stus /*最新的一筆*/
WHERE m.shift='12' and m.X12='U'
END; /*----IF EXISTS(SELECT 1 FROM inserted) ---- */
以我個人接觸過的刷卡考勤記錄系統,通常只會自動濾掉在幾秒(分)內的連續刷卡,其他的重覆刷卡都只是標示為該員刷卡異常,由人資檢視後手動修改考勤。
因為員工的狀況太多了,自動判斷太難了,可能員工08:50剛刷九點上班卡5分鐘後接到家裡來電就立刻請假刷退08:55,一個小時候10:00又回來刷上班卡,中午11:30再請假,下午15:00回來,加班到20:00,這樣的情形跨張嗎?我之前真遇過有員工一天內請三次事假的,人資跑來問我系統Key不進去作麼辦...
如果以上的經驗還沒勸退您,我個人仍不建議您用Trigger來作這個過濾的功能,變數真的太多,可能的話改成每日排程批次來作,問題會少一些。