?? page1.cpp
字號:
// Page1.cpp : implementation file
//
#include "stdafx.h"
#include "Attendance.h"
#include "Page1.h"
#include "DepartRS.h"
#include "PersonRS.h"
#include "CounterRS.h"
#include "AttDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CDatabase db;
/////////////////////////////////////////////////////////////////////////////
// CPage1 property page
IMPLEMENT_DYNCREATE(CPage1, CPropertyPage)
CPage1::CPage1() : CPropertyPage(CPage1::IDD)
{
// 得到當前時間并格式化
CTime t=CTime::GetCurrentTime();
CString str=t.Format("%Y-%m-%d %H:%M");
//{{AFX_DATA_INIT(CPage1)
m_strIOTime = str;
m_strDepartID = _T("");
m_strDepartName = _T("");
m_strPersonID = _T("");
m_strPersonName = _T("");
//}}AFX_DATA_INIT
}
CPage1::~CPage1()
{
}
void CPage1::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPage1)
DDX_Control(pDX, IDC_LIST1, m_cList);
DDX_Control(pDX, IDC_PROGRESS1, m_cProgress);
DDX_Text(pDX, IDC_EDT_IOTIME, m_strIOTime);
DDX_Text(pDX, IDC_EDT_DEPARTID, m_strDepartID);
DDX_Text(pDX, IDC_EDT_DEPARTNAME, m_strDepartName);
DDX_Text(pDX, IDC_EDT_PERSONID, m_strPersonID);
DDX_Text(pDX, IDC_EDT_PERSONNAME, m_strPersonName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPage1, CPropertyPage)
//{{AFX_MSG_MAP(CPage1)
ON_EN_CHANGE(IDC_EDT_DEPARTID, OnChangeEdtDepartid)
ON_EN_CHANGE(IDC_EDT_PERSONID, OnChangeEdtPersonid)
ON_BN_CLICKED(IDC_BTN_ADDPERSON, OnBtnAddperson)
ON_BN_CLICKED(IDC_BTN_ADDDEPART, OnBtnAdddepart)
ON_BN_CLICKED(IDC_BTN_ADDALL, OnBtnAddall)
ON_BN_CLICKED(IDC_BTN_DELETEATTEND, OnBtnDeleteattend)
ON_BN_CLICKED(IDC_BTN_SEEKIO, OnBtnSeekio)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPage1 message handlers
BOOL CPage1::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// 出入情況缺省為出
((CButton*)GetDlgItem(IDC_RADIO_OUT))->SetCheck(TRUE);
// 為List添加網格
m_cList.SetExtendedStyle(LVS_EX_GRIDLINES);
// 設置List的列
int nWidth=110;
m_cList.InsertColumn(0, "記錄編號", LVCFMT_LEFT, nWidth);
m_cList.InsertColumn(1, "員工號", LVCFMT_LEFT, nWidth);
m_cList.InsertColumn(2, "出入情況", LVCFMT_LEFT, nWidth);
m_cList.InsertColumn(3, "時間", LVCFMT_LEFT, nWidth);
CAttendanceRS rs(&db); // 構造出勤記錄表
UpdateList(rs); // 更新List
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CPage1::OnChangeEdtDepartid()
{
UpdateData(); // 更新數據
CDepartRS rs(&db); // 構造記錄集
rs.m_strFilter = "ID='" + m_strDepartID + "'"; // 設置過濾條件
rs.Open(); // 打開記錄集
if(rs.GetRecordCount()==1) // 判斷部門代碼輸入是否正確
{
m_strDepartName=rs.m_NAME; // 提取部門名稱
}
else m_strDepartName.Empty(); // 清除部門名稱
rs.Close(); // 關閉記錄集
UpdateData(FALSE); // 更新界面數據
}
void CPage1::OnChangeEdtPersonid()
{
UpdateData(); // 更新數據
CPersonRS rs(&db); // 構造PERSON記錄表
rs.m_strFilter = "ID='" + m_strPersonID + "'"; // 設置過濾條件
rs.Open(); // 打開記錄表
if(rs.GetRecordCount()==1) // 判斷員工號是否正確
{
m_strPersonName=rs.m_NAME; // 提取員工姓名
m_strDepartID=rs.m_DEPARTMENT; // 提取員工所在部門編號
}
else m_strPersonName.Empty(); // 清除員工姓名顯示
rs.Close(); // 關閉記錄表
UpdateData(FALSE); // 更新界面數據
OnChangeEdtDepartid(); // 顯示部門名稱
}
// 添加出勤記錄函數
void CPage1::IO_Add(CString strPersonID)
{
int counter; // 用于計數
CString strIO; // 保存出入情況
CCounterRS rs_counter(&db); // 構造計數器記錄表
// 記錄編號
rs_counter.m_strFilter = "ID='A'"; // 設置過濾器,提取計數值
rs_counter.Open(); // 打開計數器記錄表
counter=rs_counter.m_COUNTER_VALUE; // 提取計數值
counter++; // 計數值加1
rs_counter.Edit(); // 編輯計數器
rs_counter.m_COUNTER_VALUE=counter; // 保存當前計數
rs_counter.Update(); // 提交修改
rs_counter.Close(); // 關閉計數器記錄表
// 添加記錄
// 判斷確定出入情況
if(((CButton*)GetDlgItem(IDC_RADIO_OUT))->GetCheck())
strIO="O";
else strIO="I";
// 轉換出入時間類型
int nYear,nMonth,nDay,nHour,nMinute; // 年,月,日,時,分
sscanf(m_strIOTime.Left(4), "%d", &nYear); // 得到年
sscanf(m_strIOTime.Mid(5,2), "%d", &nMonth); // 得到月
sscanf(m_strIOTime.Mid(8,2), "%d", &nDay); // 得到日
sscanf(m_strIOTime.Mid(11,2), "%d", &nHour); // 得到時
sscanf(m_strIOTime.Mid(14,2), "%d", &nMinute); // 得到分
// 得到出入時間
CTime IO_time(nYear,nMonth,nDay,nHour,nMinute,0);
CAttendanceRS rs_attendance(&db); // 構造考勤記錄表
rs_attendance.Open(); // 打開考勤記錄表
rs_attendance.AddNew(); // 追加考勤記錄
rs_attendance.m_ID=counter;
rs_attendance.m_PERSON=strPersonID;
rs_attendance.m_IN_OUT=strIO;
rs_attendance.m_IO_TIME=IO_time;
rs_attendance.Update();
rs_attendance.Close(); // 關閉考勤記錄表
UpdateList(rs_attendance); // 更新列表框
}
void CPage1::OnBtnAddperson() // 追加單個員工考勤記錄
{
if(!m_strPersonName.IsEmpty()) // 判斷員工是否存在
{
IO_Add(m_strPersonID); // 追加單個員工記錄
}
}
void CPage1::OnBtnAdddepart() // 追加部門員工考勤記錄
{
int i,n; // 用于保存記錄條數
CPersonRS rs_person(&db); // 構造員工信息表
if(m_strDepartName.IsEmpty()) return; // 判斷部門代號是否正確
// 設置過濾條件
rs_person.m_strFilter="DEPARTMENT='"+m_strDepartID+"' and STATE='T'";
rs_person.Open(); // 打開員工信息表
n=rs_person.GetRecordCount(); // 獲取員工人數
i=0; // 初始化已添加記錄條數
// 初始化進度條
m_cProgress.SetRange(0, n);
m_cProgress.SetPos(0);
while(!rs_person.IsEOF()) // 對數據表中所有記錄進行處理
{
IO_Add(rs_person.m_ID); // 添加當前員工出勤記錄
rs_person.MoveNext(); // 跳到下一個員工記錄
m_cProgress.SetPos(++i); // 顯示進度
}
rs_person.Close(); // 關閉員工信息表
}
void CPage1::OnBtnAddall() // 添加所有員工出勤記錄
{
int i,n; // 用于保存記錄條數
CPersonRS rs_person(&db); // 構造員工信息表
// 設置過濾條件,提取員工列表
rs_person.m_strFilter = "STATE='T'";
rs_person.Open(); // 打開員工信息表
n=rs_person.GetRecordCount(); // 獲取員工人數
i=0; // 初始化已添加記錄條數
// 初始化進度條
m_cProgress.SetRange(0, n);
m_cProgress.SetPos(0);
while(!rs_person.IsEOF()) // 對數據表中所有記錄進行處理
{
IO_Add(rs_person.m_ID); // 添加當前員工出勤記錄
rs_person.MoveNext(); // 跳到下一個員工記錄
m_cProgress.SetPos(++i); // 顯示進度
}
rs_person.Close(); // 關閉員工信息表
}
void CPage1::UpdateList(CAttendanceRS& rs) // 更新列表框內容
{
int i=0;
CString strID,strTime;
rs.Open(); // 打開出勤記錄表
m_cList.DeleteAllItems(); // 清除列表框內容
while(!rs.IsEOF()) // 對數據表中所有記錄進行處理
{
m_cList.InsertItem(i, ""); // 添加新Item
strID.Format("%d", rs.m_ID); // 轉換為字符串
m_cList.SetItemText(i, 0, strID);
m_cList.SetItemText(i, 1, rs.m_PERSON);
m_cList.SetItemText(i, 2, rs.m_IN_OUT);
m_cList.SetItemText(i, 3, rs.m_IO_TIME.Format("%Y-%m-%d %H:%M"));
rs.MoveNext(); // 跳到下一條記錄
i++;
rs.Close(); // 關閉出勤記錄表
}
void CPage1::OnBtnDeleteattend() // 刪除出勤記錄列表中所選記錄
{
CString strSQL;
int nItem;
// 得到第一個被選擇Item的位置
POSITION pos = m_cList.GetFirstSelectedItemPosition();
if(pos==NULL)
{
AfxMessageBox("沒有選擇記錄!");
return;
}
while(pos) // 遍歷所有被選Item
{
nItem=m_cList.GetNextSelectedItem(pos); // 得到Item Index
// 構造SQL語句
strSQL="delete from ATTENDANCE where ID="
+ m_cList.GetItemText(nItem, 0);
db.ExecuteSQL(strSQL); // 執行
}
CAttendanceRS rs(&db); // 構造出勤記錄表
UpdateList(rs); // 更新列表框
}
void CPage1::OnBtnSeekio()
{
CAttendanceRS rs(&db); // 構造出勤記錄表
CAttDlg *pDlg; // 指向包含本對象的CAttDlg的指針
CString strFilter; // 用于保存過濾字符串
CString strSTime,strETime; // 起始,結束時間
pDlg=(CAttDlg*)GetParent()->GetParent(); // 得到指針
pDlg->UpdateData(); // 更新數據
strSTime=pDlg->m_StartTime.Format("%Y-%m-%d");
strETime=pDlg->m_EndTime.Format("%Y-%m-%d");
if(pDlg->m_bSeekbyperson) // 判斷是否根據員工號檢索
strFilter="PERSON='" + pDlg->m_strPersonID + "'"; // 添加過濾條件
if(pDlg->m_bSeekbytime) // 判斷是否有時間范圍
{
if(strFilter.GetLength()>0) // 判斷是否已有過濾條件
strFilter += " and "; //如果是,需要添加and連接符
strFilter += "IO_TIME>#" + strSTime + "#"; // 添加開始時間過濾
strFilter += " and IO_TIME<#" + strETime + "#"; // 添加結束時間過濾
}
if(strFilter.GetLength()>0) // 判斷是否有過濾條件
rs.m_strFilter=strFilter; // 設置Filter
UpdateList(rs); // 更新列表框
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -