iT邦幫忙

1

C# 出勤未打卡簡訊通知程式該如何撰寫?

各位前輩好

我們資料庫是使用AS400/DB2,每天固定時間都會抓取刷卡數據Log.TXT檔,然後轉進出勤系統資料表。目前為了解決有些員工在上下班忘記刷卡,卻因為不知道沒刷卡,又沒填寫補刷卡單據,導致薪資結算異常等問題,要來開發程式,在早上08:40,及下午17:40,及下午10:00針對沒有刷卡數據的員工發送簡訊通知。

原本我的想法是,既然刷卡數據都會轉進AS400,我就直接從AS400撈出資料,在去調整跟卡機抓資料及轉檔程式進AS400的時間,但是主管卻說要抓取TXT檔比較即時。現在問題來了,兩個不同資料來源要怎麼比對? 我原本想說抓取AS400的卡號資料檔,再去TXT檔中的卡號比對,就可以帶出沒有刷卡的卡號,但後來發現無法比對,所以上來求助各位前輩。

那請問這樣有辦法抓出沒有刷卡的人員嗎?還是如我文章所述,直接從AS400抓取資料即可?謝謝!

看更多先前的討論...收起先前的討論...
你的txt檔也沒有即時產生,而是定時產生,抓不抓txt沒太大意義吧。

真要這樣比對,就每天定時產生另一個比對用的txt,在裡面的人就是要通知的,這樣就解決了。
優悠 iT邦新手 4 級 ‧ 2018-09-06 09:21:00 檢舉
資料庫一定有,今天上班員工資料,9點半(打卡計算時間)去找今天打卡紀錄
兩個比對,今天上班員工缺一,通知該員工
不過通常是主管9點半去看紀錄比較快,今天員工說不定礦工,需要主管處理。
上班又不是當兵不合理的要求就勇敢說不行
b7307024 iT邦新手 4 級 ‧ 2018-09-12 14:45:04 檢舉
哈~ 您說的不合理的要求是指"未打卡簡訊通知",還是抓取TXT檔不合理?
1
stephen3342
iT邦新手 4 級 ‧ 2018-09-05 16:14:58
最佳解答

建議直接進資料庫取資料, 不要使用TXT檔

原因:
1.員工會有請休假 或者 出差, 是否漏刷卡, 必需判別是否上班
2.員工會有不同班別, 規則複雜, 仍需由人事系統轉入打卡資料時判別
3.還有其他的, 例如有某些人標記為 "不必打卡"

b7307024 iT邦新手 4 級 ‧ 2018-09-07 16:27:54 檢舉

沒錯,您說的真合我意! 但主管就不知道為何硬要我抓TXT檔,說這樣比較及時,但若真的是要即時,早在要發簡訊通知前,就提早排程把資料轉進資料就好囉~ 唉!

我在職場30年, 偶而會將這些年所見向後進們說明, 有機會換工作, 經歷一定要虛假升級.
因一個曾當主管的草包, 幾乎到那裏都是主管, 這當中有很多因素, 不得不如此.
您的想法沒錯, 請堅持, 並可反向"請教"上列的一些情況
祝早日進到上位

b7307024 iT邦新手 4 級 ‧ 2018-09-21 11:29:00 檢舉

"經歷一定要虛假升級.
因一個曾當主管的草包, 幾乎到那裏都是主管, 這當中有很多因素, 不得不如此"

有點似懂非懂~ 哈哈!

1
小魚
iT邦高手 1 級 ‧ 2018-09-05 12:16:45

一定是有欄位可以比對的,
如果沒有欄位資料是怎麼送進去的? @@
先從Txt抓資料,
然後進去資料庫比對,
然後找出沒刷卡的員工.

看更多先前的回應...收起先前的回應...
b7307024 iT邦新手 4 級 ‧ 2018-09-05 13:14:03 檢舉

小魚大,送進去的是刷卡數據暫存檔,會固定時間將裡面的資料轉進刷卡數據正式檔,暫存檔的資料就會刪除,所以沒有辦法比對。然而,如我文章所說有一個"卡號資料檔",裡面存放"卡號,無效日期,員工代號,類別,卡鐘編號,備註",但要怎麼跟TXT檔比對呢?如果同樣都是存在AS400,就可以用TABLE JOIN去查詢資料,但是目前的情況來說,我就不知道怎麼做了。

竹本立里 iT邦研究生 5 級 ‧ 2018-09-05 14:58:19 檢舉

自建table 或是 進系統撈工號再跟txt 比對

b7307024 iT邦新手 4 級 ‧ 2018-09-05 15:14:07 檢舉

我初步的程式碼如下:

private void Form1_Load(object sender, EventArgs e)
{
	StreamReader str = new StreamReader(@"C:\CardLog\20180904.txt");
	String line;
	while ((line = str.ReadLine()) != null)
	{
		string[] chars = line.ToString().Split(',');
		string AttnDay = chars[0];     //刷卡日期
		string AttnTime = chars[1];    //刷卡時間
		string CardID = chars[2];      //刷卡卡號
		int bingo = string.Compare(AttnTime, "084059");

		if(bingo == -1)
		{
			using (OleDbConnection as400_cn = new OleDbConnection())
            {
				as400_cn.ConnectionString = CS_YJ400;
				as400_cn.Open();

				DataTable dt = new DataTable();

				String strOLE = " SELECT CDCARD,CDEMPN " +
								" FROM PHLIB.PHFCRD " +
								" WHERE ";                       //但現在問題是我需要抓出沒有存在TXT檔中的資料,但我不知道該怎麼抓

				OleDbCommand as400_cmd = new OleDbCommand(strOLE, as400_cn);
				OleDbDataReader dr = as400_cmd.ExecuteReader();
				dt.Load(dr);

            }
		}
	}
	str.Close();
}
小魚 iT邦高手 1 級 ‧ 2018-09-05 19:04:01 檢舉

你問我們也沒用啊,
難道你資料庫的內容可以給我們看嗎?
你要去找出對應的欄位,
然後針對那個欄位去篩選,
大概只能幫到這樣了。

b7307024 iT邦新手 4 級 ‧ 2018-09-07 17:20:07 檢舉

小魚大,你誤會我的意思了,我知道在AS400上的卡號資料檔,只是不知道怎麼比對而已。但後來有前輩教我將卡號存入DIctionary的方式,並給予預設值,在將TXT裡有的卡號,存入TXT的刷卡日期,這樣就可以帶出未刷卡的卡號了。

1
fuzzylee1688
iT邦新手 2 級 ‧ 2018-09-05 13:26:50

哦哦..用這麼貴的設備來做打卡提訊系統..也太大材小用了..

b7307024 iT邦新手 4 級 ‧ 2018-09-05 13:36:10 檢舉

呵呵~ 不是只有做這個而已的啦! 我問的這個問題是最近想要做得!

會用到AS400設備的系統都是著重於線上即時,安全性要很高應用系統, 對你提的打卡鐘提示需求,一般Open Source配備就夠用了, 你應該將這個需求轉給Open系統協助開發, 才會更有彈性,維運才會輕鬆.

2
Luke
iT邦新手 3 級 ‧ 2018-09-05 16:27:50

原本我的想法是,既然刷卡數據都會轉進AS400,我就直接從AS400撈出資料,在去調整跟卡機抓資料及轉檔程式進AS400的時間,但是主管卻說要抓取TXT檔比較即時。

主管說既然要即時,就將【刷卡數據都會轉進AS400】轉進AS400, 提早轉進去

//但現在問題是我需要抓出沒有存在TXT檔中的資料,但我不知道該怎麼抓
先撈出全部(AS400)卡號,有存在的TXT檔案中的,表示有刷卡紀錄。
從全部的資料中移除,剩下的就是要通知忘記刷卡的人員,
再補上最大老闆過濾不用刷,及特殊人員不用刷卡

/images/emoticon/emoticon10.gif

b7307024 iT邦新手 4 級 ‧ 2018-09-07 17:24:18 檢舉

目前已可以找出未刷卡的卡號,但是因為卡號資料檔裡面有失效的卡號,所以這樣子抓,資料也不正確,正要跟主管提議全部從AS400中抓的說!

0
ken040714
iT邦新手 5 級 ‧ 2018-09-06 09:47:25

我的想法是
如果無法改變log倒入資料庫的時間的話
那就自建資料庫Table吧
1.在程式執行時先把自建的Table清空,然後自行將當日資料log.txt倒入
2.在這三個時段定期執行程式時,將員工代碼資料表與這個Table串在一起,
例如08:40執行時,篩選打卡時間<08:40 ,然後leftjoin進去員工代號表,找出刷卡紀錄空值的人
3.看是否能夠找到請假資料表,這樣就又可篩選出當日請假人員,再把這些人排除就可以寄通知了

b7307024 iT邦新手 4 級 ‧ 2018-09-07 17:25:52 檢舉

其實是可以改的,主管不知道為何要我抓TXT的資料,我想我至少先做一個雛型出來,至少可以發送簡訊出去,之後資料來源要怎麼改在看看吧!!

由file寫回AS400 DB會比較麻煩(內碼轉換的問題),也會影響到AS400線上即時系統資源使用,主管可能認為儘量不要影響即時系統吧,建議在AS400在不忙的時段把員工排休匯入Open系統DB, 再統一由Open系統做簡訊發送,會比較好.

b7307024 iT邦新手 4 級 ‧ 2018-09-12 14:42:33 檢舉

fuzzylee1688大,你從一開始就一直提到OPEN系統,請問這是什麼呢?? 我查Google都沒查到正確解釋。

我要發表回答

立即登入回答