版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 第1章 系統(tǒng)設計</b></p><p> 1.1 系統(tǒng)功能分析</p><p> 考勤管理系統(tǒng)的主要功能如下:</p><p> 1.上班時間的設定。上下班時間相對固定,可以保存在客戶端的設置文件中。</p><p> 2.員工出入單位的情況記錄.出入情況主要由考勤機來記錄,但是
2、需要設置人工添加的功能,以備特殊情況的處理。</p><p> 3.請假、加班和出差情況的記錄。</p><p> 4.每個月底進行整月的出勤情況統(tǒng)計。</p><p> 1.2 系統(tǒng)功能模塊設計</p><p> 根據(jù)系統(tǒng)功能的要求,可以將系統(tǒng)分解成幾個功能模塊來分別設計,功能模塊圖如圖1-1所示。</p><p
3、> 圖1-1人事管理功能模塊圖</p><p><b> 1.3 數(shù)據(jù)流程圖</b></p><p> 出勤的原始記錄主要來源于考勤機,并且以固定格式保存在數(shù)據(jù)庫中??记诠芾硐到y(tǒng)的任務就是處理這些數(shù)據(jù)。</p><p><b> 第2章 數(shù)據(jù)庫設計</b></p><p> 2.1
4、數(shù)據(jù)庫需求分析 </p><p> 根據(jù)數(shù)據(jù)流程,可以列出以下管理系統(tǒng)所需的數(shù)據(jù)項和數(shù)據(jù)結構。</p><p> (1) 出勤記錄:記錄號、員工、出入情況和出入時間,如圖2-1。</p><p> (2) 月度考勤統(tǒng)計:記錄號、員工、年月、累計正常工作時間、累計請假時間、累計加班時間、累計出差時間、遲到次數(shù)、早退次數(shù)和礦工次數(shù),如圖2-2。</p>
5、<p> (3) 請假記錄:記錄號、員工、假期起始時間/結束時間和請假緣由,如圖2-3。</p><p> (4) 加班記錄:記錄號、員工、加班時間長度和日期,如圖2-4。</p><p> (5) 出差記錄:記錄號、員工、出差起始時間/結束時間和具體描述,如圖2-5。</p><p> 所需的外部數(shù)據(jù)支持:</p><p&
6、gt; (1) 人員信息:員工號、密碼、權限、姓名、部門、和當前狀態(tài)等。</p><p> (2) 部門設置:部門編號、名稱等。</p><p> 圖2-1 出勤記錄表</p><p> 圖2-2 月度考勤統(tǒng)計表</p><p> 圖2-3 請假記錄表</p><p> 圖2-4 加班記錄表&l
7、t;/p><p> 圖2-5 出差記錄表</p><p> 第3章 各個功能模塊的創(chuàng)建</p><p> 3.1 生成程序框架</p><p> 本系統(tǒng)的應用程序使用MFC ODBC的方法開發(fā),采用Dialog based 的應用框架,如圖3-1為。由一個對話框和若干個功能對話框組成。</p><p> 為了使
8、用ODBC類,需要在stdafx.h中加入#include”afxdb.h”頭文件。本程序需要連接一個數(shù)據(jù)庫,所以定義了一個CDatabase型的全局變量db,用于打開和關閉數(shù)據(jù)庫。數(shù)據(jù)庫的打開在登錄認證數(shù)據(jù)庫中。</p><p> 為了訪問數(shù)據(jù)庫中的表格,本程序從CRecordset中派生了8個類,分別用于封裝所需訪問的表格,如表3-1。通過訪問成員變量可以訪問當前記錄中字段的值。</p>&l
9、t;p> 表3-1 CRecordset派生類對應的表格</p><p> 3.2 登錄認證對話框</p><p> 登錄窗口如圖3-2所示,包括3個輸入框和2個按鈕。主要控件類型、ID和對應的成員變量及說明如表3-4。</p><p> 圖3-2 登錄窗口</p><p> 表3-4 登錄認證對話框控件列表
10、</p><p> 對IDOK的點擊加登錄代碼。</p><p> CLoginDlg類需要用到加密類,本程序使用的是CCrypt類。在cpp文件的開頭加入#include”Crypt.h”一行。</p><p> 另外,為了使用全局數(shù)據(jù)庫變量db,需要在cpp文件開頭加入以下語句:</p><p> Extern CDatabase
11、 db;</p><p> 用戶認證過程在“登錄”按鈕的處理函數(shù)中:代碼見附錄【1】</p><p> 為了運行登錄認證對話框,還需在App類的InitInstance()函數(shù)中在顯示主對話框前加入以下代碼:</p><p> CLoginDlg LoginDlg;</p><p> If(LoginDlg.DoModal()!=ID
12、OK)return FALSE;</p><p> 3.3主對話框窗口的設計</p><p> 用戶登錄后即顯示主對話框,如圖3-5所示。包括5個按鈕。控件列表如表3-6。</p><p><b> 圖3-5 主對話框</b></p><p> 表3-6 主對話框控件列表</p><p
13、> 在CAttendanceDlg 中定義以下成員變量:</p><p><b> Public:</b></p><p> CBrush m_brush;</p><p> CStatDlg* m_pStatDlg;</p><p> CAttDlg* m_pAttDlg;</p><
14、;p> CFont m_font;</p><p> 對話框初始化時需要改變標題字體大小,因此在OnInitDialog()中加入以下代碼:</p><p> // 改變標題字體大小</p><p> LOGFONT LogFont;</p><p> GetFont()->GetLogFont(&LogFont
15、);</p><p> LogFont.lfHeight+=LogFont.lfHeight/2;</p><p> LogFont.lfWidth+=LogFont.lfWidth/2;</p><p> m_font.CreateFontIndirect(&LogFont);</p><p> GetDlgItem(IDC
16、_STATIC_HEAD)->SetFont(&m_font);</p><p> 為了美觀起見,還插入了背景圖片,通過Ctrl+R引入圖片后,在OnPaint()中的條件語句的else()中添加下列代碼:見附錄【2】</p><p> 對話框中5個按鈕的功能主要是顯示相應的功能對話框。給按鈕的BN_CLICKED事件的處理和退出代碼見附錄【3】。</p>
17、<p> 3.4上班時間設置對話框的創(chuàng)建</p><p> 此對話框用于設置上下班時間,布局如圖3-7.所示。主要控件類型、ID和對應的成員變量及說明如表3-8所示。</p><p> 圖3-7 時間設置對話框</p><p> 表3-8 時間設置對話框控件列表</p><p> 一般上下班時間是相對固定的,而且需要在統(tǒng)計
18、是頻繁使用,所以不需要保存在數(shù)據(jù)庫中,因此采用標準的INI設置文件來保存這些數(shù)據(jù)。</p><p> 首先,在構造函數(shù)中初始化4個時間的取值:</p><p> CWorkplanDlg::CWorkplanDlg(CWnd* pParent /*=NULL*/)</p><p> : CDialog(CWorkplanDlg::IDD, pParent)&l
19、t;/p><p><b> {</b></p><p> m_Time1 = 0;</p><p> m_Time2 = 0;</p><p> m_Time3 = 0;</p><p> m_Time4 = 0;</p><p><b> }</b
20、></p><p> “修改”按鈕的BN_CLICKED事件處理用于保存當前的設置:代碼見附錄【4】</p><p> “恢復默認設置”按鈕的BN_CLICKED事件處理程序用于恢復初始設置。這個函數(shù)同時被OnInitDialog()函數(shù)應用,以實現(xiàn)初始化操作,代碼見附錄【5】</p><p> 3.5 考勤修改對話框的創(chuàng)建</p><
21、;p> 考勤修改對話框主要用來人工輸入出勤情況。在考勤機出現(xiàn)問題是,它可以及時彌補數(shù)據(jù)。同時加班、請假、出差的記錄都是需要通過這個對話框來輸入。對話框布局如圖3-9所示。為了區(qū)分不同的輸入,在對話框中嵌入了CPropertySheet和4個CPropertyPage,這4個CPropertyPage分別放置出勤、加班、請假和出差記錄的修改界面,而共用一個查詢條件設置。圖3-9下方空白處用于放置CPropertySheet和4個C
22、PropertyPage。對話框中的主要控件類型、ID和對應的成員變量及說明如表3-10所示。</p><p> 圖3-9 考勤修改對話框</p><p> 表3-10 考勤修改對話框控件列表</p><p> 為了使用CPropertySheet和CPropertyPage,需要在類定義中加入以下變量:</p><p> CPage
23、1 m_Page1;</p><p> CPage2 m_Page2;</p><p> CPage3 m_Page3;</p><p> CPage4 m_Page4;</p><p> CPropertySheet m_Sheet;</p><p> 然后在OnInitDialog中添加以下代碼:見附錄【
24、6】</p><p> 當輸入員工號時,需要檢索員工姓名,以確定設置的條件有效。加入IDC_EDT_SEEKPERSONID的EN_CHANGE消息,函數(shù)如下:見附錄【7】</p><p> 3.6 修改出勤記錄屬性頁的創(chuàng)建</p><p> 加入一個對話框資源,將其封裝設為從CPropertyPage繼承的CPage1類。對話框布局如圖3-11所示。對話框中
25、主要控件、ID和對應的成員變量及說明如表3-12所示。</p><p> 圖3-11 修改出勤記錄屬性頁</p><p> 表3-12 修改出勤記錄屬性頁控件列表</p><p> 界面初始化操作如下:見附錄【8】</p><p> 為了方便更新列表框內(nèi)容,編寫UpdateList()函數(shù),調(diào)用此函數(shù)可使列表框顯示給定的數(shù)據(jù)表格。見附
26、錄【9】</p><p> 當輸入部門編號時,自動檢索部門名稱。見附錄【10】</p><p> 輸入員工號是,檢索相應信息。見附錄【11】</p><p> 添加部門和全體員工出勤記錄的過程最終可分解為添加單個員工記錄的過程。設置以下子程序是為了避免程序的重復。見附錄【12】</p><p> 添加記錄的3個按鈕處理程序分別調(diào)用以上
27、的函數(shù)。見附錄【13】</p><p> “刪除所選紀錄”按鈕用于刪除列表中當前所選紀錄。見附錄【14】</p><p> “按條件檢索”按鈕用于激活檢索條件。見附錄【15】</p><p> 3.7 加班記錄屬性頁的創(chuàng)建</p><p> 加班記錄屬性頁的創(chuàng)建與考勤修改屬性頁類似,封裝類設為從CPropertyPage繼承的Cpag
28、e2類。為了將它們放入同一個Property Sheet,需將二者大小設為一致。界面設計如圖3-13,主要控件類型、ID和對應的成員變量及說明如表3-14所示。</p><p> 圖3-13 加班記錄屬性頁</p><p> 表3-14 加班記錄屬性頁控件列表</p><p> 初始化代碼如下:見附錄【16】</p><p> Upd
29、ateList()完成列表框數(shù)據(jù)顯示工作,代碼如下:見附錄【17】</p><p> 當輸入員工號時,需要檢索員工姓名,以確認輸入是否正確。見附錄【18】</p><p> “添加”按鈕用于完成紀錄的添加操作。見附錄【19】</p><p> 3.8 請假記錄屬性頁的創(chuàng)建</p><p> 請假記錄屬性頁封裝類為從CPropertyP
30、age繼承的Cpage3類。界面設計如圖3-15,主要控件類型、ID和對應的成員變量及說明如表3-16所示。</p><p> 圖3-15 請假記錄屬性頁</p><p> 表3-16 請假記錄屬性頁控件列表</p><p> 界面的初始化、列表框的更新、員工姓名的檢索、刪除所選記錄和條件檢索的功能與前面加班記錄相應的功能類似,代碼稍作修改即可。添加記錄的代碼
31、如下:見附錄【20】</p><p> 3.9 出差記錄屬性頁的創(chuàng)建</p><p> 請假記錄屬性頁封裝類為從CPropertyPage繼承的Cpage4類。界面設計如圖3-17,主要控件類型、ID和對應的成員變量及說明如表3-18所示。</p><p> 圖3-17 出差記錄屬性頁</p><p> 表3-18 出差記錄屬性頁控
32、件列表</p><p> 出差記錄與請假記錄的功能基本一致。</p><p> 3.10 考勤統(tǒng)計對話框的創(chuàng)建</p><p> 考勤統(tǒng)計對話框界面設計如圖3-19所示,主要控件類型、ID和對應的成員變量及說明如表3-20所示。</p><p> 圖3-19 考勤統(tǒng)計對話框</p><p> 表3-20
33、考勤統(tǒng)計控件列表</p><p> 列表框的初始化和數(shù)據(jù)更新和前面類似。初始化時設置缺省時間,修改構造函數(shù)如下:見附錄【21】</p><p> 當輸入員工號時,檢索員工姓名,用于確認輸入。見附錄【22】</p><p> “檢索”按鈕的處理代碼如下:見附錄【23】</p><p> 統(tǒng)計過程主要是記錄判斷過程,代碼如下:見附錄【24
34、】</p><p><b> 第4章 系統(tǒng)的實現(xiàn)</b></p><p> 各對話框設計完成后,運行程序,查看結果。系統(tǒng)啟動后,首先出現(xiàn)的是登錄對話框,如圖4-1。</p><p> 圖4-1 登錄對話框</p><p> 在輸入用戶名和密碼并登錄后,系統(tǒng)會從數(shù)據(jù)庫中提取相應記錄,來判斷用戶和密碼權限是否匹配,如
35、果不匹配,會彈出對話框提示,如圖4-2。</p><p> 圖4-2 認證失敗提示信息</p><p> 登錄成功后,會出現(xiàn)如圖4-3所示的主對話框。</p><p><b> 圖4-3 主對話框</b></p><p> 單擊對話框中的各個按鈕即可顯示相應的對話框。其中“重新登錄”用于回到登錄對話框,并且會隱藏
36、主對話框;“退出”按鈕直接退出應用程序;“設置”按鈕用來彈出上下班時間設置對話框;“出勤記錄”按鈕用來彈出考勤修改對話框;“統(tǒng)計”用來彈出統(tǒng)計對話框。</p><p> 圖4-4顯示的是單擊“設置”按鈕彈出的時間設置對話框。</p><p> 圖4-4 時間設置對話框</p><p> 考勤修改窗口如圖4-5所示。這個對話框包括4個記錄修改功能,分別對應出勤記
37、錄、加班記錄、請假記錄和出差記錄。檢索條件包括時間范圍和員工,可以根據(jù)需要任意選擇。如圖4-6。</p><p> 圖4-5 考勤修改窗口</p><p> 圖4-6 記錄檢索條件</p><p> 其中出勤記錄的添加時為了在考勤機出現(xiàn)故障是,可以人工添加,保證記錄的完整性。設置的全體員工、部門員工和單個員工出勤情況的輸入功能實現(xiàn)了批量輸入,下面的進度條可以
38、顯示進度,如圖4-7所示。</p><p> 圖4-7 添加修改出勤記錄對話框</p><p> 加班記錄對話框用于添加員工加班的日期和小時數(shù),如圖4-8。</p><p> 圖4-8 加班記錄對話框</p><p> 請假記錄和出差記錄布局和功能基本相似,主要用于記錄請假和出差的時間段和緣由,備注等。如圖4-9和4-10,分別為請
39、假記錄和出差記錄的對話框。</p><p> 圖4-9 請假記錄對話框</p><p> 圖4-10 出差記錄對話框</p><p> 考勤統(tǒng)計對話框有月度統(tǒng)計、檢索條件和記錄列表3部分。月度統(tǒng)計需要設定統(tǒng)計的時間范圍。檢索條件部分則用于快速地位記錄,便于查詢和修改,如圖4-11所示。</p><p> 圖4-11 考勤統(tǒng)計對話框&l
40、t;/p><p><b> 第5章 結束語</b></p><p> 通過本次課程設計的實踐,不僅熟悉了對Visual C++6.0程序設計工具的操作,加深了對Access2003的認識,還學到了有關考勤管理系統(tǒng)開發(fā)方面的知識。體會了軟件開發(fā)的基本過程,同時也學會了如何修改,調(diào)試程序,如何將各個模塊的功能進行合理的整合和調(diào)整,如何充分利用各方資源,優(yōu)化和完善程序。提
41、高了綜合應用計算機語言的各種編程知識和技巧進行程序設計的能力。</p><p> 在老師和同學的指導和幫助下,通過一個多月的設計和開發(fā),考勤管理系統(tǒng)基本完成,能夠實現(xiàn)對員工出勤情況的記錄和統(tǒng)計,以及按時間或員工號的各類查詢。</p><p> 但由于時間倉促和自己水平所限,本系統(tǒng)不可避免的還存在著一些缺陷,比如在權限的管理以及美觀方面做的還不好,還要其他方面還請老師和同學提寶貴意見,不
42、勝感激。</p><p><b> 參考文獻</b></p><p> [1] 李閩溟,吳繼剛,周學明.Visual C++6.0數(shù)據(jù)庫系統(tǒng)開發(fā)實例導航[M].北京:人民郵電出版社.2002:151-180.</p><p> [2] 侯奇峰,李曉華,李莎.Visual C++數(shù)據(jù)庫通用模塊開發(fā)與系統(tǒng)移植[M].北京:清華大學出版社.
43、2007:207-405.</p><p> [3] 王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論(第四版)[M]。北京:高等教育出版社.2008:263-330.</p><p> [4] 馬石安,魏文平.Visual C++程序設計與應用教程[M].北京:清華大學出版社.2007.</p><p> 附錄(主要程序代碼)</p><p> 【
44、1】void CLoginDlg::OnOK() </p><p><b> {</b></p><p> BOOL bLogin=FALSE;</p><p> CString strPasswd,strCount;</p><p> UpdateData(); // 更新數(shù)據(jù)變量</p><
45、;p> if(!db.Open(m_strDSN)) return; // 連接數(shù)據(jù)庫</p><p> strPasswd=CCrypt::Encrypt(m_strPasswd, 123); // 加密密碼</p><p> CRecordset rs(&db); // 構造記錄集</p><p> rs.Open(CRecordset::
46、forwardOnly,</p><p> "select COUNT(ID) as COUNT from PERSON where ID='" + m_strUser</p><p> +"' and PASSWD='" + strPasswd + "' and AUTHORITY='4'
47、;"); // 執(zhí)行查詢</p><p> rs.GetFieldValue("COUNT",strCount);</p><p> rs.Close(); // 關閉數(shù)據(jù)集</p><p> if(strCount=="1") // 判斷認證是否通過</p><p><b>
48、 {</b></p><p> EndDialog(IDOK); // 結束對話框,返回IDOK</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p>
49、; MessageBox("請輸入正確的用戶名和密碼,注意大小寫!","認證失敗");</p><p> db.Close(); // 關閉數(shù)據(jù)庫</p><p><b> }</b></p><p><b> }</b></p><p> 【2】
50、 CPaintDC dc(this); </p><p> CRect rect; </p><p> GetClientRect(&rect); </p><p> CDC dcMem; </p><p> dcMem.CreateCompatibleDC(&dc); </p&g
51、t;<p> CBitmap bmpBackground; </p><p> bmpBackground.LoadBitmap(IDB_BITMAP); </p><p> //IDB_BITMAP是圖對應的ID </p><p> BITMAP bitmap; </p><p> bmpBa
52、ckground.GetBitmap(&bitmap); </p><p> CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); </p><p> dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0, </p><
53、;p> bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); </p><p> 【3】void CAttendanceDlg::OnBtnExit() </p><p><b> {</b></p><p> EndDialog(IDCANCEL); // 退出主對話框,關閉程序</p>
54、;<p><b> }</b></p><p> void CAttendanceDlg::OnBtnRelogin() </p><p><b> {</b></p><p><b> // 隱藏主對話框</b></p><p> ShowWindow
55、(SW_HIDE);</p><p> // 顯示登錄對話框</p><p> CLoginDlg dlg;</p><p> if(dlg.DoModal()==IDOK)</p><p><b> {</b></p><p> ShowWindow(SW_SHOW); // 顯示對話
56、框</p><p><b> }</b></p><p> else EndDialog(IDCANCEL); // 退出程序</p><p><b> }</b></p><p> void CAttendanceDlg::OnBtnConfig() </p><p&g
57、t;<b> {</b></p><p> // 顯示工作時間設置對話框</p><p> CWorkplanDlg dlg;</p><p> dlg.DoModal();</p><p><b> }</b></p><p> void CAttendance
58、Dlg::OnBtnRecord() </p><p><b> {</b></p><p> // 非模態(tài)顯示出勤記錄對話框</p><p> if(!m_pAttDlg) // 指針為空,創(chuàng)建對話框</p><p><b> {</b></p><p> m_p
59、AttDlg=new CAttDlg();</p><p> m_pAttDlg->Create(IDD_DLG_ATTENDANCE, this);</p><p> m_pAttDlg->ShowWindow(SW_SHOW);</p><p><b> }</b></p><p> else /
60、/ 對話框已創(chuàng)建</p><p> m_pAttDlg->ShowWindow(SW_SHOW); // 顯示窗口</p><p><b> }</b></p><p> void CAttendanceDlg::OnBtnStatistics() </p><p><b> {</b>
61、;</p><p> // 非模態(tài)顯示考勤統(tǒng)計對話框</p><p> if(!m_pStatDlg) // 指針為空,創(chuàng)建對話框</p><p><b> {</b></p><p> m_pStatDlg=new CStatDlg();</p><p> m_pStatDlg->
62、;Create(IDD_DLG_STAT, this);</p><p> m_pStatDlg->ShowWindow(SW_SHOW);</p><p><b> }</b></p><p> else // 對話框已創(chuàng)建</p><p> m_pStatDlg->ShowWindow(SW_SH
63、OW); // 顯示窗口</p><p><b> }</b></p><p> 【4】void CWorkplanDlg::OnWorkplanModify() </p><p><b> {</b></p><p> CString strFileName=".\\workpl
64、an.ini"; // INI文件名</p><p> UpdateData(); // 更新數(shù)據(jù)</p><p> WritePrivateProfileString("WorkPlan", "Time1",</p><p> m_Time1.Format("%H:%M:%S"), str
65、FileName);</p><p> WritePrivateProfileString("WorkPlan", "Time2",</p><p> m_Time2.Format("%H:%M:%S"), strFileName);</p><p> WritePrivateProfileStrin
66、g("WorkPlan", "Time3",</p><p> m_Time3.Format("%H:%M:%S"), strFileName);</p><p> WritePrivateProfileString("WorkPlan", "Time4",</p><
67、;p> m_Time4.Format("%H:%M:%S"), strFileName);</p><p><b> }</b></p><p> 【5】void CWorkplanDlg::OnWorkplanReset() </p><p><b> {</b></p>
68、<p> CString cstr[4];</p><p> char str[4][9];</p><p><b> int i;</b></p><p> int nHour,nMinute,nSecond; // 時,分,秒</p><p> CString strFileName="
69、.\\workplan.ini"; // INI文件名</p><p> // 讀取INI文件</p><p> GetPrivateProfileString("WorkPlan", "Time1", "08:00:00", str[0], 9, strFileName);</p><p>
70、 GetPrivateProfileString("WorkPlan", "Time2", "12:00:00", str[1], 9, strFileName);</p><p> GetPrivateProfileString("WorkPlan", "Time3", "14:00:00"
71、;, str[2], 9, strFileName);</p><p> GetPrivateProfileString("WorkPlan", "Time4", "18:00:00", str[3], 9, strFileName);</p><p> for(i=0; i<4; i++) cstr[i]=str[i]
72、;</p><p> // 定義四個時間變量并初始化為INI文件中的值</p><p> sscanf(cstr[0].Left(2), "%d", &nHour);// 得到時</p><p> sscanf(cstr[0].Mid(3,2), "%d", &nMinute);// 得到分<
73、/p><p> sscanf(cstr[0].Mid(6,2), "%d", &nSecond);// 得到秒</p><p> CTime t1(2002,1,1,nHour,nMinute,nSecond);// 初始化t1</p><p> sscanf(cstr[1].Left(2), "%d", &am
74、p;nHour);// 得到時</p><p> sscanf(cstr[1].Mid(3,2), "%d", &nMinute);// 得到分</p><p> sscanf(cstr[1].Mid(6,2), "%d", &nSecond);// 得到秒</p><p> CTime t2(2
75、002,1,1,nHour,nMinute,nSecond);// 初始化t2</p><p> sscanf(cstr[2].Left(2), "%d", &nHour);// 得到時</p><p> sscanf(cstr[2].Mid(3,2), "%d", &nMinute);// 得到分</p>
76、<p> sscanf(cstr[2].Mid(6,2), "%d", &nSecond);// 得到秒</p><p> CTime t3(2002,1,1,nHour,nMinute,nSecond);// 初始化t3</p><p> sscanf(cstr[3].Left(2), "%d", &nHour)
77、;// 得到時</p><p> sscanf(cstr[3].Mid(3,2), "%d", &nMinute);// 得到分</p><p> sscanf(cstr[3].Mid(6,2), "%d", &nSecond);// 得到秒</p><p> CTime t4(2002,1,1,
78、nHour,nMinute,nSecond);// 初始化t4</p><p><b> // 設置成員變量</b></p><p> m_Time1=t1;</p><p> m_Time2=t2;</p><p> m_Time3=t3;</p><p> m_Time4=t4;&
79、lt;/p><p> UpdateData(FALSE); // 更新界面數(shù)據(jù)</p><p><b> }</b></p><p> 【6】 m_Sheet.AddPage(&m_Page1); // 加第1頁</p><p> m_Sheet.AddPage(&m_Page2); // 加第2
80、頁</p><p> m_Sheet.AddPage(&m_Page3); // 加第3頁</p><p> m_Sheet.AddPage(&m_Page4); // 加第4頁</p><p> m_Sheet.Create(this, WS_CHILD | WS_VISIBLE, 0); // 創(chuàng)建窗口</p><p&g
81、t; m_Sheet.ModifyStyleEx (0, WS_EX_CONTROLPARENT); // 修改風格</p><p> m_Sheet.ModifyStyle( 0, WS_TABSTOP ); // 修改風格</p><p><b> // 設置窗口位置</b></p><p> m_Sheet.SetWindowPo
82、s( NULL, 0, 100, 0, 0, </p><p> SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE );</p><p> 【7】void CAttDlg::OnChangeEdtSeekpersonid() </p><p><b> {</b></p><p>
83、; UpdateData(); // 更新數(shù)據(jù)</p><p> CPersonRS rs(&db); // 構造記錄集</p><p> rs.m_strFilter = "ID='" + m_strPersonID + "'"; // 設置過濾條件</p><p> rs.Open(); /
84、/ 打開記錄集</p><p> if(rs.GetRecordCount()==1) // 判斷員工記錄是否存在</p><p><b> {</b></p><p> m_strName=rs.m_NAME; // 得到員工姓名</p><p><b> }</b></p>
85、<p> else m_strName.Empty(); // 清除員工姓名的顯示</p><p> rs.Close(); // 關閉記錄集</p><p> UpdateData(FALSE); // 更新界面數(shù)據(jù)</p><p><b> }</b></p><p> 【8】BOOL CPag
86、e1::OnInitDialog() </p><p><b> {</b></p><p> CPropertyPage::OnInitDialog();</p><p> // 出入情況缺省為出</p><p> ((CButton*)GetDlgItem(IDC_RADIO_OUT))->SetChe
87、ck(TRUE);</p><p> // 為List添加網(wǎng)格</p><p> m_cList.SetExtendedStyle(LVS_EX_GRIDLINES);</p><p> // 設置List的列</p><p> int nWidth=110;</p><p> m_cList.InsertC
88、olumn(0, "記錄編號", LVCFMT_LEFT, nWidth);</p><p> m_cList.InsertColumn(1, "員工號", LVCFMT_LEFT, nWidth);</p><p> m_cList.InsertColumn(2, "出入情況", LVCFMT_LEFT, nWidth);&
89、lt;/p><p> m_cList.InsertColumn(3, "時間", LVCFMT_LEFT, nWidth);</p><p> CAttendanceRS rs(&db); // 構造出勤記錄表</p><p> UpdateList(rs); // 更新List</p><p> return
90、 TRUE; </p><p><b> }</b></p><p> 【9】void CPage1::UpdateList(CAttendanceRS& rs) // 更新列表框內(nèi)容</p><p><b> {</b></p><p><b> int i=0;<
91、;/b></p><p> CString strID,strTime;</p><p> rs.Open(); // 打開出勤記錄表</p><p> m_cList.DeleteAllItems(); // 清除列表框內(nèi)容</p><p> while(!rs.IsEOF()) // 對數(shù)據(jù)表中所有記錄進行處理</p&
92、gt;<p><b> {</b></p><p> m_cList.InsertItem(i, ""); // 添加新Item</p><p> strID.Format("%d", rs.m_ID); // 轉換為字符串</p><p> m_cList.SetItemText(
93、i, 0, strID);</p><p> m_cList.SetItemText(i, 1, rs.m_PERSON);</p><p> m_cList.SetItemText(i, 2, rs.m_IN_OUT);</p><p> m_cList.SetItemText(i, 3, rs.m_IO_TIME.Format("%Y-%m-%d
94、 %H:%M"));</p><p> rs.MoveNext(); // 跳到下一條記錄</p><p><b> i++;</b></p><p><b> }</b></p><p> rs.Close(); // 關閉出勤記錄表</p><p>&l
95、t;b> }</b></p><p> 【10】void CPage1::OnChangeEdtDepartid() </p><p><b> {</b></p><p> UpdateData(); // 更新數(shù)據(jù)</p><p> CDepartRS rs(&db); // 構造
96、記錄集</p><p> rs.m_strFilter = "ID='" + m_strDepartID + "'"; // 設置過濾條件</p><p> rs.Open(); // 打開記錄集</p><p> if(rs.GetRecordCount()==1) // 判斷部門代碼輸入是否正確<
97、;/p><p><b> {</b></p><p> m_strDepartName=rs.m_NAME; // 提取部門名稱</p><p><b> }</b></p><p> else m_strDepartName.Empty(); // 清除部門名稱</p><
98、p> rs.Close(); // 關閉記錄集</p><p> UpdateData(FALSE); // 更新界面數(shù)據(jù)</p><p><b> }</b></p><p> 【11】void CPage1::OnChangeEdtPersonid() </p><p><b> {<
99、/b></p><p> UpdateData(); // 更新數(shù)據(jù)</p><p> CPersonRS rs(&db); // 構造PERSON記錄表</p><p> rs.m_strFilter = "ID='" + m_strPersonID + "'"; // 設置過濾條件<
100、;/p><p> rs.Open(); // 打開記錄表</p><p> if(rs.GetRecordCount()==1) // 判斷員工號是否正確</p><p><b> {</b></p><p> m_strPersonName=rs.m_NAME; // 提取員工姓名</p><p
101、> m_strDepartID=rs.m_DEPARTMENT; // 提取員工所在部門編號</p><p><b> }</b></p><p> else m_strPersonName.Empty(); // 清除員工姓名顯示</p><p> rs.Close(); // 關閉記錄表</p><p>
102、; UpdateData(FALSE); // 更新界面數(shù)據(jù)</p><p> OnChangeEdtDepartid(); // 顯示部門名稱</p><p><b> }</b></p><p> 【12】void CPage1::IO_Add(CString strPersonID)</p><p><
103、;b> {</b></p><p> int counter; // 用于計數(shù)</p><p> CString strIO; // 保存出入情況</p><p> CCounterRS rs_counter(&db); // 構造計數(shù)器記錄表</p><p><b> // 記錄編號</b
104、></p><p> rs_counter.m_strFilter = "ID='A'"; // 設置過濾器,提取計數(shù)值</p><p> rs_counter.Open(); // 打開計數(shù)器記錄表</p><p> counter=rs_counter.m_COUNTER_VALUE; // 提取計數(shù)值</p
105、><p> counter++; // 計數(shù)值加1</p><p> rs_counter.Edit(); // 編輯計數(shù)器</p><p> rs_counter.m_COUNTER_VALUE=counter; // 保存當前計數(shù)</p><p> rs_counter.Update(); // 提交修改</p><
106、;p> rs_counter.Close(); // 關閉計數(shù)器記錄表</p><p><b> // 添加記錄</b></p><p> // 判斷確定出入情況</p><p> if(((CButton*)GetDlgItem(IDC_RADIO_OUT))->GetCheck())</p><p&g
107、t; strIO="O";</p><p> else strIO="I";</p><p> // 轉換出入時間類型</p><p> int nYear,nMonth,nDay,nHour,nMinute; // 年,月,日,時,分</p><p> sscanf(m_strIOTime.
108、Left(4), "%d", &nYear); // 得到年</p><p> sscanf(m_strIOTime.Mid(5,2), "%d", &nMonth); // 得到月</p><p> sscanf(m_strIOTime.Mid(8,2), "%d", &nDay); // 得到日&l
109、t;/p><p> sscanf(m_strIOTime.Mid(11,2), "%d", &nHour); // 得到時</p><p> sscanf(m_strIOTime.Mid(14,2), "%d", &nMinute); // 得到分</p><p><b> // 得到出入時間<
110、;/b></p><p> CTime IO_time(nYear,nMonth,nDay,nHour,nMinute,0);</p><p> CAttendanceRS rs_attendance(&db); // 構造考勤記錄表</p><p> rs_attendance.Open(); // 打開考勤記錄表</p><
111、;p> rs_attendance.AddNew(); // 追加考勤記錄</p><p> rs_attendance.m_ID=counter;</p><p> rs_attendance.m_PERSON=strPersonID;</p><p> rs_attendance.m_IN_OUT=strIO;</p><p&g
112、t; rs_attendance.m_IO_TIME=IO_time;</p><p> rs_attendance.Update();</p><p> rs_attendance.Close(); // 關閉考勤記錄表</p><p> UpdateList(rs_attendance); // 更新列表框</p><p><
113、;b> }</b></p><p> 【13】void CPage1::OnChangeEdtPersonid() </p><p><b> {</b></p><p> UpdateData(); // 更新數(shù)據(jù)</p><p> CPersonRS rs(&db); // 構造P
114、ERSON記錄表</p><p> rs.m_strFilter = "ID='" + m_strPersonID + "'"; // 設置過濾條件</p><p> rs.Open(); // 打開記錄表</p><p> if(rs.GetRecordCount()==1) // 判斷員工號是否正確&
115、lt;/p><p><b> {</b></p><p> m_strPersonName=rs.m_NAME; // 提取員工姓名</p><p> m_strDepartID=rs.m_DEPARTMENT; // 提取員工所在部門編號</p><p><b> }</b></p>
116、;<p> else m_strPersonName.Empty(); // 清除員工姓名顯示</p><p> rs.Close(); // 關閉記錄表</p><p> UpdateData(FALSE); // 更新界面數(shù)據(jù)</p><p> OnChangeEdtDepartid(); // 顯示部門名稱</p><
117、p><b> }</b></p><p> // 添加出勤記錄函數(shù)</p><p> void CPage1::IO_Add(CString strPersonID)</p><p><b> {</b></p><p> int counter; // 用于計數(shù)</p>
118、<p> CString strIO; // 保存出入情況</p><p> CCounterRS rs_counter(&db); // 構造計數(shù)器記錄表</p><p><b> // 記錄編號</b></p><p> rs_counter.m_strFilter = "ID='A'
119、"; // 設置過濾器,提取計數(shù)值</p><p> rs_counter.Open(); // 打開計數(shù)器記錄表</p><p> counter=rs_counter.m_COUNTER_VALUE; // 提取計數(shù)值</p><p> counter++; // 計數(shù)值加1</p><p> rs_counter.Ed
120、it(); // 編輯計數(shù)器</p><p> rs_counter.m_COUNTER_VALUE=counter; // 保存當前計數(shù)</p><p> rs_counter.Update(); // 提交修改</p><p> rs_counter.Close(); // 關閉計數(shù)器記錄表</p><p><b> /
121、/ 添加記錄</b></p><p> // 判斷確定出入情況</p><p> if(((CButton*)GetDlgItem(IDC_RADIO_OUT))->GetCheck())</p><p> strIO="O";</p><p> else strIO="I";
122、</p><p> // 轉換出入時間類型</p><p> int nYear,nMonth,nDay,nHour,nMinute; // 年,月,日,時,分</p><p> sscanf(m_strIOTime.Left(4), "%d", &nYear); // 得到年</p><p> sscan
123、f(m_strIOTime.Mid(5,2), "%d", &nMonth); // 得到月</p><p> sscanf(m_strIOTime.Mid(8,2), "%d", &nDay); // 得到日</p><p> sscanf(m_strIOTime.Mid(11,2), "%d", &
124、nHour); // 得到時</p><p> sscanf(m_strIOTime.Mid(14,2), "%d", &nMinute); // 得到分</p><p><b> // 得到出入時間</b></p><p> CTime IO_time(nYear,nMonth,nDay,nHour,nMin
125、ute,0);</p><p> CAttendanceRS rs_attendance(&db); // 構造考勤記錄表</p><p> rs_attendance.Open(); // 打開考勤記錄表</p><p> rs_attendance.AddNew(); // 追加考勤記錄</p><p> rs_atten
126、dance.m_ID=counter;</p><p> rs_attendance.m_PERSON=strPersonID;</p><p> rs_attendance.m_IN_OUT=strIO;</p><p> rs_attendance.m_IO_TIME=IO_time;</p><p> rs_attendance
127、.Update();</p><p> rs_attendance.Close(); // 關閉考勤記錄表</p><p> UpdateList(rs_attendance); // 更新列表框</p><p><b> }</b></p><p> void CPage1::OnBtnAddperson()
128、// 追加單個員工考勤記錄</p><p><b> {</b></p><p> if(!m_strPersonName.IsEmpty()) // 判斷員工是否存在</p><p><b> {</b></p><p> IO_Add(m_strPersonID); // 追加單個員工記
129、錄</p><p><b> }</b></p><p><b> }</b></p><p> void CPage1::OnBtnAdddepart() // 追加部門員工考勤記錄</p><p><b> {</b></p><p> i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- mfc聊天軟件課程設計---網(wǎng)絡聊天程序設計
- mfc課程設計報告---聊天室程序設計
- mfc聊天軟件課程設計---網(wǎng)絡聊天程序設計
- 基于mfc的貪吃蛇程序設計課程設計
- 課程設計--unix程序設計課程設計
- 課程設計——飛機訂票系統(tǒng)程序設計
- 課程設計報告--系統(tǒng)時間程序設計
- 程序設計課程設計報告
- 程序設計課程設計報告
- matlab程序設計 課程設計
- 程序設計課程設計--圖書管理系統(tǒng)
- 監(jiān)控系統(tǒng)程序設計技術課程設計
- java課程設計---java程序設計
- matlab程序設計 課程設計 (2)
- 程序設計課程設計--鏈表操作
- java面向對象程序設計課程設計--學生信息管理系統(tǒng)程序設計
- 《java程序設計》課程設計報告
- 【課程設計】面向對象程序設計
- 掃雷課程設計--掃雷程序設計
- 課程設計--linux c 程序設計
評論
0/150
提交評論