www.gusucode.com > VC++版的小型考勤管理系统-源码程序 > VC++版的小型考勤管理系统-源码程序\code\Page3.cpp

    // Page3.cpp : implementation file
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "Attendance.h"
#include "Page3.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;
/////////////////////////////////////////////////////////////////////////////
// CPage3 property page

IMPLEMENT_DYNCREATE(CPage3, CPropertyPage)

CPage3::CPage3() : CPropertyPage(CPage3::IDD)
{
	// 得到当前时间并格式化
	CTime t=CTime::GetCurrentTime();
	CString str=t.Format("%Y-%m-%d %H:%M");
	//{{AFX_DATA_INIT(CPage3)
	m_strSTime = str;
	m_strETime = str;
	m_strReason = _T("");
	m_strPersonID = _T("");
	m_strPersonName = _T("");
	//}}AFX_DATA_INIT
}

CPage3::~CPage3()
{
}

void CPage3::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPage3)
	DDX_Control(pDX, IDC_LIST3, m_cList);
	DDX_Text(pDX, IDC_EDT_LEAVE_STARTTIME, m_strSTime);
	DDX_Text(pDX, IDC_EDT_LEAVE_ENDTIME, m_strETime);
	DDX_Text(pDX, IDC_EDT_LEAVE_REASON, m_strReason);
	DDX_Text(pDX, IDC_EDT_LEAVE_PERSONID, m_strPersonID);
	DDX_Text(pDX, IDC_EDT_LEAVE_PERSONNAME, m_strPersonName);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CPage3, CPropertyPage)
	//{{AFX_MSG_MAP(CPage3)
	ON_EN_CHANGE(IDC_EDT_LEAVE_PERSONID, OnChangeEdtLeavePersonid)
	ON_BN_CLICKED(IDC_BTN_LEAVE_ADD, OnBtnLeaveAdd)
	ON_BN_CLICKED(IDC_BTN_LEAVE_DELETEATTEND, OnBtnLeaveDeleteattend)
	ON_BN_CLICKED(IDC_BTN_LEAVE_SEEKIO, OnBtnLeaveSeekio)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPage3 message handlers

void CPage3::OnChangeEdtLeavePersonid() 
{
	UpdateData(); // 更新数据

	CPersonRS rs(&db); // 构造PERSON记录表
	rs.m_strFilter = "ID='" + m_strPersonID + "'"; // 设置过滤条件
	rs.Open(); // 打开记录表
	if(rs.GetRecordCount()==1) // 判断员工号是否正确
	{
		m_strPersonName=rs.m_NAME; // 提取员工姓名
	}
	else m_strPersonName.Empty(); // 清除员工姓名显示
	rs.Close(); // 关闭记录表
	UpdateData(FALSE); // 更新界面数据
}

BOOL CPage3::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
	// 为List添加网格
	m_cList.SetExtendedStyle(LVS_EX_GRIDLINES);
	// 设置List的列
	int nWidth=90;
	m_cList.InsertColumn(0, "记录编号", LVCFMT_LEFT, nWidth-20);
	m_cList.InsertColumn(1, "员工号", LVCFMT_LEFT, nWidth-20);
	m_cList.InsertColumn(2, "开始时间", LVCFMT_LEFT, nWidth+20);
	m_cList.InsertColumn(3, "结束时间", LVCFMT_LEFT, nWidth+20);
	m_cList.InsertColumn(4, "缘由", LVCFMT_LEFT, nWidth);
	CLeaveRS 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 CPage3::UpdateList(CLeaveRS &rs)
{
	int i=0;
	CString strID,strSTime,strETime;
	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);
		strSTime=rs.m_START_TIME.Format("%y-%m-%d %H:%M");
		m_cList.SetItemText(i, 2, strSTime);
		strETime=rs.m_END_TIME.Format("%y-%m-%d %H:%M");
		m_cList.SetItemText(i, 3, strETime);
		m_cList.SetItemText(i, 4, rs.m_REASON);
		rs.MoveNext(); // 跳到下一条记录
		i++;
	}
	rs.Close(); // 关闭记录表
}

void CPage3::OnBtnLeaveAdd() 
{
	int counter; // 用于计数
	CCounterRS rs_counter(&db); // 构造计数器记录表

	UpdateData(); // 更新数据
// 记录编号
	rs_counter.m_strFilter = "ID='L'"; // 设置过滤器,提取计数值
	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(); // 关闭计数器记录表
// 添加记录
	int nYear,nMonth,nDay,nHour,nMinute; // 年,月,日,时,分
	// 转换起始时间类型
	sscanf(m_strSTime.Left(4), "%d", &nYear); // 得到年
	sscanf(m_strSTime.Mid(5,2), "%d", &nMonth); // 得到月
	sscanf(m_strSTime.Mid(8,2), "%d", &nDay); // 得到日
	sscanf(m_strSTime.Mid(11,2), "%d", &nHour); // 得到时
	sscanf(m_strSTime.Mid(14,2), "%d", &nMinute); // 得到分
	// 得到起始时间
	CTime S_time(nYear,nMonth,nDay,nHour,nMinute,0);
	// 转换结束时间类型
	sscanf(m_strETime.Left(4), "%d", &nYear); // 得到年
	sscanf(m_strETime.Mid(5,2), "%d", &nMonth); // 得到月
	sscanf(m_strETime.Mid(8,2), "%d", &nDay); // 得到日
	sscanf(m_strETime.Mid(11,2), "%d", &nHour); // 得到时
	sscanf(m_strETime.Mid(14,2), "%d", &nMinute); // 得到分
	// 得到结束时间
	CTime E_time(nYear,nMonth,nDay,nHour,nMinute,0);
	
	CLeaveRS rs_leave(&db); // 构造请假记录表
	rs_leave.Open(); // 打开请假记录表
	rs_leave.AddNew(); // 追加请假记录
	rs_leave.m_ID=counter;
	rs_leave.m_PERSON=m_strPersonID;
	rs_leave.m_START_TIME=S_time;
	rs_leave.m_END_TIME=E_time;
	rs_leave.m_REASON=m_strReason;
	rs_leave.Update();
	rs_leave.Close(); // 关闭请假记录表
	UpdateList(rs_leave); // 更新列表框
}

void CPage3::OnBtnLeaveDeleteattend() 
{
	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 LEAVE where ID=" + m_cList.GetItemText(nItem, 0);
		db.ExecuteSQL(strSQL); // 执行
	}
	CLeaveRS rs(&db); // 构造请假记录表
	UpdateList(rs); // 更新列表框
}

void CPage3::OnBtnLeaveSeekio() 
{
	CLeaveRS 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 += "END_TIME>#" + strSTime + "#"; // 添加开始时间过滤
		strFilter += " and START_TIME<#" + strETime + "#"; // 添加结束时间过滤
	}
	if(strFilter.GetLength()>0) // 判断是否有过滤条件
		rs.m_strFilter=strFilter; // 设置Filter
	UpdateList(rs); // 更新列表框
}