各位前輩好
我們資料庫是使用AS400/DB2,每天固定時間都會抓取刷卡數據Log.TXT檔,然後轉進出勤系統資料表。目前為了解決有些員工在上下班忘記刷卡,卻因為不知道沒刷卡,又沒填寫補刷卡單據,導致薪資結算異常等問題,要來開發程式,在早上08:40,及下午17:40,及下午10:00針對沒有刷卡數據的員工發送簡訊通知。
原本我的想法是,既然刷卡數據都會轉進AS400,我就直接從AS400撈出資料,在去調整跟卡機抓資料及轉檔程式進AS400的時間,但是主管卻說要抓取TXT檔比較即時。現在問題來了,兩個不同資料來源要怎麼比對? 我原本想說抓取AS400的卡號資料檔,再去TXT檔中的卡號比對,就可以帶出沒有刷卡的卡號,但後來發現無法比對,所以上來求助各位前輩。
那請問這樣有辦法抓出沒有刷卡的人員嗎?還是如我文章所述,直接從AS400抓取資料即可?謝謝!
建議直接進資料庫取資料, 不要使用TXT檔
原因:
1.員工會有請休假 或者 出差, 是否漏刷卡, 必需判別是否上班
2.員工會有不同班別, 規則複雜, 仍需由人事系統轉入打卡資料時判別
3.還有其他的, 例如有某些人標記為 "不必打卡"
一定是有欄位可以比對的,
如果沒有欄位資料是怎麼送進去的? @@
先從Txt抓資料,
然後進去資料庫比對,
然後找出沒刷卡的員工.
小魚大,送進去的是刷卡數據暫存檔,會固定時間將裡面的資料轉進刷卡數據正式檔,暫存檔的資料就會刪除,所以沒有辦法比對。然而,如我文章所說有一個"卡號資料檔",裡面存放"卡號,無效日期,員工代號,類別,卡鐘編號,備註",但要怎麼跟TXT檔比對呢?如果同樣都是存在AS400,就可以用TABLE JOIN去查詢資料,但是目前的情況來說,我就不知道怎麼做了。
自建table 或是 進系統撈工號再跟txt 比對
我初步的程式碼如下:
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();
}
你問我們也沒用啊,
難道你資料庫的內容可以給我們看嗎?
你要去找出對應的欄位,
然後針對那個欄位去篩選,
大概只能幫到這樣了。
小魚大,你誤會我的意思了,我知道在AS400上的卡號資料檔,只是不知道怎麼比對而已。但後來有前輩教我將卡號存入DIctionary的方式,並給予預設值,在將TXT裡有的卡號,存入TXT的刷卡日期,這樣就可以帶出未刷卡的卡號了。
哦哦..用這麼貴的設備來做打卡提訊系統..也太大材小用了..
原本我的想法是,既然刷卡數據都會轉進AS400,我就直接從AS400撈出資料,在去調整跟卡機抓資料及轉檔程式進AS400的時間,但是主管卻說要抓取TXT檔比較即時。
主管說既然要即時,就將【刷卡數據都會轉進AS400】轉進AS400, 提早轉進去
//但現在問題是我需要抓出沒有存在TXT檔中的資料,但我不知道該怎麼抓
先撈出全部(AS400)卡號,有存在的TXT檔案中的,表示有刷卡紀錄。
從全部的資料中移除,剩下的就是要通知忘記刷卡的人員,
再補上最大老闆過濾不用刷,及特殊人員不用刷卡
我的想法是
如果無法改變log倒入資料庫的時間的話
那就自建資料庫Table吧
1.在程式執行時先把自建的Table清空,然後自行將當日資料log.txt倒入
2.在這三個時段定期執行程式時,將員工代碼資料表與這個Table串在一起,
例如08:40執行時,篩選打卡時間<08:40 ,然後leftjoin進去員工代號表,找出刷卡紀錄空值的人
3.看是否能夠找到請假資料表,這樣就又可篩選出當日請假人員,再把這些人排除就可以寄通知了
其實是可以改的,主管不知道為何要我抓TXT的資料,我想我至少先做一個雛型出來,至少可以發送簡訊出去,之後資料來源要怎麼改在看看吧!!
由file寫回AS400 DB會比較麻煩(內碼轉換的問題),也會影響到AS400線上即時系統資源使用,主管可能認為儘量不要影響即時系統吧,建議在AS400在不忙的時段把員工排休匯入Open系統DB, 再統一由Open系統做簡訊發送,會比較好.
fuzzylee1688大,你從一開始就一直提到OPEN系統,請問這是什麼呢?? 我查Google都沒查到正確解釋。