📄 statdlg.cpp
字号:
// StatDlg.cpp : implementation file
//
#include "stdafx.h"
#include "XieyuyingDB.h"
#include "StatDlg.h"
#include "PersonRS.h"
#include "CounterRS.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CDatabase db;
extern CTime StrToTime(CString str);
/////////////////////////////////////////////////////////////////////////////
// CStatDlg dialog
CStatDlg::CStatDlg(CWnd* pParent /*=NULL*/)
: CDialog(CStatDlg::IDD, pParent)
{
CTime End_t=CTime::GetCurrentTime(); // 当前时间
CTimeSpan tp(30,0,0,0); // 时间间隔为30天
//{{AFX_DATA_INIT(CStatDlg)
m_strTime = End_t.Format("%Y-%m");
m_STime = End_t-tp;
m_ETime = End_t;
m_bSeekbytime = FALSE;
m_bSeekbyperson = FALSE;
m_strSeektime = _T("");
m_strPersonID = _T("");
m_strPersonName = _T("");
//}}AFX_DATA_INIT
}
void CStatDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStatDlg)
DDX_Control(pDX, IDC_STAT_PROGRESS, m_cProgress);
DDX_Control(pDX, IDC_STAT_LIST, m_cList);
DDX_Text(pDX, IDC_STAT_EDT_TIME, m_strTime);
DDX_DateTimeCtrl(pDX, IDC_STAT_DATETIMEPICKER_STARTTIME, m_STime);
DDX_DateTimeCtrl(pDX, IDC_STAT_DATETIMEPICKER_ENDTIME, m_ETime);
DDX_Check(pDX, IDC_STAT_CHK_SEEKBYTIME, m_bSeekbytime);
DDX_Check(pDX, IDC_STAT_CHK_SEEKBYPERSON, m_bSeekbyperson);
DDX_Text(pDX, IDC_STAT_EDT_SEEKTIME, m_strSeektime);
DDX_Text(pDX, IDC_STAT_EDT_SEEKPERSONID, m_strPersonID);
DDX_Text(pDX, IDC_STAT_EDT_SEEKPERSONNAME, m_strPersonName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CStatDlg, CDialog)
//{{AFX_MSG_MAP(CStatDlg)
ON_EN_CHANGE(IDC_STAT_EDT_SEEKPERSONID, OnChangeStatEdtSeekpersonid)
ON_BN_CLICKED(IDC_STAT_BTN_SEEK, OnStatBtnSeek)
ON_BN_CLICKED(IDC_STAT_BTN_STAT, OnStatBtnStat)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStatDlg message handlers
void CStatDlg::OnChangeStatEdtSeekpersonid()
{
UpdateData(); // 更新数据
CPersonRS rs(&db); // 构造记录集
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); // 更新界面数据
}
void CStatDlg::OnStatBtnSeek()
{
CString strFilter; // 保存过滤字符串
CStatRS rs(&db); // 构造统计数据表
UpdateData(); // 更新数据
// 判断根据员工号过滤
if(m_bSeekbyperson) strFilter="PERSON='" + m_strPersonID + "'";
// 判断根据年月过滤
if(m_bSeekbytime)
{
if(!strFilter.IsEmpty()) // 如果已有过滤条件
strFilter += " and "; // 需添加and连接符
// 设置时间过滤条件
strFilter += "YEAR_MONTH='" + m_strSeektime + "'";
}
if(!strFilter.IsEmpty()) // 判断是否有过滤字符串
{
rs.m_strFilter=strFilter; // 设置过滤条件
}
UpdateList(rs); // 更新列表框
}
BOOL CStatDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 为List添加网格
m_cList.SetExtendedStyle(LVS_EX_GRIDLINES);
// 设置List的列
int nWidth=100;
m_cList.InsertColumn(0, "记录编号", LVCFMT_LEFT, 80);
m_cList.InsertColumn(1, "员工号", LVCFMT_LEFT, 50);
m_cList.InsertColumn(2, "年月", LVCFMT_LEFT, nWidth);
m_cList.InsertColumn(3, "正常工作时间(小时)", LVCFMT_LEFT, nWidth+40);
m_cList.InsertColumn(4, "加班时间(小时)", LVCFMT_LEFT, nWidth);
m_cList.InsertColumn(5, "请假时间(半天)", LVCFMT_LEFT, nWidth);
m_cList.InsertColumn(6, "出差时间(半天)", LVCFMT_LEFT, nWidth);
m_cList.InsertColumn(7, "迟到次数", LVCFMT_LEFT, nWidth-30);
m_cList.InsertColumn(8, "早退次数", LVCFMT_LEFT, nWidth-30);
m_cList.InsertColumn(9, "旷工次数", LVCFMT_LEFT, nWidth-30);
CStatRS rs(&db); // 构造出勤记录表
UpdateList(rs); // 更新List
m_cList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CStatDlg::UpdateList(CStatRS& rs)
{
int i=0;
CString str;
rs.Open(); // 打开统计数据表
m_cList.DeleteAllItems(); // 清除列表框内容
while(!rs.IsEOF()) // 对数据表中所有记录进行处理
{
m_cList.InsertItem(i, ""); // 添加新Item
str.Format("%d", rs.m_ID); // 转换为字符串
m_cList.SetItemText(i, 0, str);
m_cList.SetItemText(i, 1, rs.m_PERSON);
m_cList.SetItemText(i, 2, rs.m_YEAR_MONTH);
str.Format("%d", rs.m_WORK_HOUR);
m_cList.SetItemText(i, 3, str);
str.Format("%d", rs.m_OVER_HOUR);
m_cList.SetItemText(i, 4, str);
str.Format("%d", rs.m_LEAVE_HDAY);
m_cList.SetItemText(i, 5, str);
str.Format("%d", rs.m_ERRAND_HDAY);
m_cList.SetItemText(i, 6, str);
str.Format("%d", rs.m_LATE_TIMES);
m_cList.SetItemText(i, 7, str);
str.Format("%d", rs.m_EARLY_TIMES);
m_cList.SetItemText(i, 8, str);
str.Format("%d", rs.m_ABSENT_TIMES);
m_cList.SetItemText(i, 9, str);
rs.MoveNext(); // 跳到下一条记录
i++;
}
rs.Close(); // 关闭统计数据表
}
void CStatDlg::OnStatBtnStat()
{
CRecordset rs_Q_attend(&db); // 构造Q_attend记录集
CRecordset rs_Q_leave(&db); // 构造Q_leave记录集
CRecordset rs_Q_errand(&db); // 构造Q_errand记录集
CTimeSpan tp_1(1,0,0,0); // 构造一个1天的CTimeSpan
CTimeSpan tp_02(0,2,0,0); // 构造一个2小时的CTimeSpan
CTimeSpan TimeSpan[4]; // 保存上下班时间
int nHours[2]; // 保存上下午工作时间
CString strSTime,strETime; // 保存始末时间
CTime TimeStamp, LateTime, EarlyTime,WorkStart,WorkEnd; // 保存中间判断时间
int nWorkHour,nOverHour,nLeaveHDay,nErrandHDay; // 保存时间间隔长度
BOOL bLate,bEarly,bAbsent,bLeave,bErrand; // 保存判断结果
int nLateTimes,nEarlyTimes,nAbsentTimes; // 保存次数
CString cstr[4]; // 暂存起始时间
char str[4][9]; // 暂存起始时间
int i,j,n,counter; // 用于循环和计数
CString strTmp,strTmp1,strTmp2; // 临时变量
// 临时变量,年,月,日,时,分,秒
int nHour,nMinute,nSecond;
CString strFileName=".\\workplan.ini"; // INI文件名
UpdateData(); // 更新数据
// 读取INI文件
GetPrivateProfileString("WorkPlan", "Time1", "08:00:00", str[0], 9, strFileName);
GetPrivateProfileString("WorkPlan", "Time2", "12:00:00", str[1], 9, strFileName);
GetPrivateProfileString("WorkPlan", "Time3", "14:00:00", str[2], 9, strFileName);
GetPrivateProfileString("WorkPlan", "Time4", "18:00:00", str[3], 9, strFileName);
for(i=0; i<4; i++) cstr[i]=str[i];
// 定义四个时间间隔变量并初始化为INI文件中的值
CTimeSpan *pTS;
for(i=0; i<4; i++)
{
sscanf(cstr[i].Left(2), "%d", &nHour); // 得到时
sscanf(cstr[i].Mid(3,2), "%d", &nMinute); // 得到分
sscanf(cstr[i].Mid(6,2), "%d", &nSecond); // 得到秒
// 构造一个时间间隔变量
pTS=new CTimeSpan(0,nHour,nMinute,nSecond);
TimeSpan[i]=*pTS; // 赋值
delete pTS;
}
nHours[0]=(TimeSpan[1]-TimeSpan[0]).GetTotalHours(); // 计算上午工作时间
if((TimeSpan[1]-TimeSpan[0]).GetMinutes()>30) nHours[0]++; // 四舍五入
nHours[1]=(TimeSpan[3]-TimeSpan[2]).GetTotalHours(); // 计算下午工作时间
if((TimeSpan[3]-TimeSpan[2]).GetMinutes()>30) nHours[1]++; // 四舍五入
// 转换统计开始时间
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -