iT邦幫忙

0

MSSQL trigger 問題請教

  • 分享至 

  • xImage

您好:
相關程式碼大致如下
主要是刷卡紀錄, 要轉到另一個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) ----  */
看更多先前的討論...收起先前的討論...
freedr iT邦新手 5 級 ‧ 2024-06-19 10:41:28 檢舉
1. 依您的語句判斷,資料要能新增到資料表 log ,有二種條件
1.1 WHERE shift='11' and X11='I'
1.2 WHERE shift='12' and X12 IN ('I','A')
2. 然而,一開始即設限 WHERE m.rw=1 /*只抓上班最前,下班最後*/
2.1 符合 WHERE m.rw=1 者,未必符合前述的二種條件
2.2 是否應該試著找出符合前述的二種條件的 上班最前,下班最後 ?
noway iT邦研究生 1 級 ‧ 2024-06-19 16:54:55 檢舉
您好:
我是在
insert INTO @TEMP1
select ...
這一段,先去判斷 上班最前,下班最後,第二段上班最前,第二段上班之後
測試沒問題

但就,triger 後當下,沒有 INSERT
等到 proc 定時跑程式時(就只是抓log資料) ,所以才困惑
謝謝'
freedr iT邦新手 5 級 ‧ 2024-06-20 11:52:42 檢舉
想請教:您如何判定「 triger 後當下,沒有 INSERT」,而是要等到 proc 定時跑程式時,才會INSERT ? 另,資料表 log 上是否有 時間型別的欄位,可以用來填入資料 「新增」時的時間值呢?
noway iT邦研究生 1 級 ‧ 2024-06-20 13:41:55 檢舉
有 DATEX VARCHAR(8)
TIMEX VARCHAR(6)
刷入 寫入一筆
20240620 120101 入 有出時,填填C 欄位
20240620 130202 出

因為我刷一筆 刷卡紀錄 入時, 等了一段時間,LOG 沒有看到 資料進來
等我執行PROC 後,才有看到 LOG 有該筆新增資料
freedr iT邦新手 5 級 ‧ 2024-06-20 14:45:50 檢舉
還有一個可能性:是 刷入 的程式碼 有使用交易機制 ( BEGIN TRANSACTION ) 。也就是 ── 刷入後,程式需要再接著 新增/更新 其他資料表 ,直到 執行PROC 後,才算完成交易(COMMIT)。因而,最後才會真正觸發 Insert 指令。
noway iT邦研究生 1 級 ‧ 2024-06-21 10:36:34 檢舉
有 DATEX VARCHAR(8)
TIMEX VARCHAR(6)
刷入 寫入一筆
20240620 120101 入 有出時,填填C 欄位
20240620 130202 出

因為我刷一筆 刷卡紀錄 入時, 等了一段時間,LOG 沒有看到 資料進來
等我執行PROC 後,才有看到 LOG 有該筆新增資料
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
sam0407
iT邦大師 1 級 ‧ 2024-06-20 14:17:19

以我個人接觸過的刷卡考勤記錄系統,通常只會自動濾掉在幾秒(分)內的連續刷卡,其他的重覆刷卡都只是標示為該員刷卡異常,由人資檢視後手動修改考勤。

因為員工的狀況太多了,自動判斷太難了,可能員工08:50剛刷九點上班卡5分鐘後接到家裡來電就立刻請假刷退08:55,一個小時候10:00又回來刷上班卡,中午11:30再請假,下午15:00回來,加班到20:00,這樣的情形跨張嗎?我之前真遇過有員工一天內請三次事假的,人資跑來問我系統Key不進去作麼辦...

如果以上的經驗還沒勸退您,我個人仍不建議您用Trigger來作這個過濾的功能,變數真的太多,可能的話改成每日排程批次來作,問題會少一些。

noway iT邦研究生 1 級 ‧ 2024-06-21 11:49:32 檢舉

您好:確實是刷卡考勤,但廠商說沒有過濾 連續刷卡
所以 我有先trigger 去判斷刷卡資料 進/出 分段, 後段才叫沒有問題

但我現在要加一個去判斷 2分鐘內刷下班/又刷上班的,結果沒反應..才檢驗出這一個問題....

但他就目前正常RUN

sam0407 iT邦大師 1 級 ‧ 2024-06-25 10:56:55 檢舉

卡機廠商正常是都不會過濾連續刷卡的沒錯,實務上會是在考勤軟體上作,作法每家不同,像這種判斷出是連續刷卡的,一般也不會直接刪除,而是先將連續刷卡的記錄標示為異常刷卡,讓人資去處理。

我要發表回答

立即登入回答