www.gusucode.com > VC++版的小型考勤管理系统-源码程序 > VC++版的小型考勤管理系统-源码程序\code\Page1.cpp
// Page1.cpp : implementation file // Download by http://www.NewXing.com #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); // 更新列表框 }