📄 dlgkqconfirm.cpp
字号:
sCode = sText.Left(6);
memcpy(txt.m_szCode,sCode, 6);
txt.m_szCode[6] = NULL;
sText = sText.Mid(i+1);
i = sText.Find(',');
if (i > 0)
{//取日期
sDate = sText.Left(i);
sTime = sText.Mid(i+1, 8);
if(sDate >= sInDate && sDate <= sAfterDate)
{//取时间
txt.m_tDate = COleDateTime(COleVariant(sDate + _T(" ") + sTime));
m_Txt.push_back(txt);
sSQL.Format("Insert Into kv_kt_tmp (km_code, km_date) Values('%s', '%s %s')",
sCode, sDate, sTime);
if(!m_RecordSet.Open(sSQL)) goto err03;
}//end if
}//end if
}//end if
}//end while
fclose(file);
m_pConnection->CommitTrans();
_Restore(); //将m_Txt排序
sDateItem = sInDate.Mid(8, 2); //取当天列名
if (sDateItem.GetAt(0) == '0')
sDateItem = sDateItem.Right(1);
sDateItem = _T("kq_d") + sDateItem;
sText = sInDate.Left(4) + sInDate.Mid(5, 2);
//开始比较
// sSQL.Format("Select * From kv_kq_Input Where kq_id Like '%s%%' Order by kq_code",
// sInDate);
sSQL.Format("Select * From kv_kq_Input Where kq_id Like '%s%%' Order By kq_code ",
sText);
if(!m_RecordSet.Open(sSQL)) goto err04;
m_Master.SetRedraw(false);
while(m_RecordSet.IsEOF() == false) //取每一排班
{
m_RecordSet.GetCollect("kq_code", sCode);
m_RecordSet.GetCollect("kq_name", sName);
m_RecordSet.GetCollect(sDateItem, sText);
m_RecordSet.MoveNext();
sText = _IsProject(sCode, sText);
//sText = "QD";
m_MasterDoc.New();
nItem = 0;
m_Master.SetItemText(nItem, 0, sInDate);
m_Master.SetItemText(nItem, 1, sCode);
m_Master.SetItemText(nItem, 2, sName);
m_Master.SetItemText(nItem, 3, sText);
SetCheck(nItem, sText);
bNew = true;
}
m_Master.SetRedraw(true);
if(bNew)
{
m_MasterDoc.NewBefore("kv_kt_confirm"); //新增前必需连结数据库
SetState(1);
}
return ;
err01:
m_pConnection->RollbackTrans();
MessageBox("打开"+sFileScr+"失败!!!","错误", MB_OK|MB_ICONSTOP);
return ;
//err02:
// m_pConnection->RollbackTrans();
err04:
MessageBox("无有发现"+sDate+"考勤计划!!!","错误", MB_OK|MB_ICONSTOP);
return ;
err03:
m_pConnection->RollbackTrans();
MessageBox("Err02删除"+sFileScr+"日结失败!!!","错误", MB_OK|MB_ICONSTOP);
return ;
}
void CDlgKqConfirm::OnItemchangedLeft(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
const int nItem = pNMListView->iItem;
int nSubItem;
CString sCode, sSQL, sPro, sName;
if (pNMListView->uNewState == 3 && nItem >= 0)
{
//m_Master.SetItemState(m_Master.GetSelected(), 0, LVIS_SELECTED);
//合成主键
// m_edProject.GetWindowText(sPro);
sCode = m_Left.GetItemTextEx(nItem, "编号");
sName = m_Left.GetItemTextEx(nItem, "名称");
sPro = sPro + sCode;
nSubItem = m_Master.GetSubItem("编号");
for(int i = 0; i < m_Master.GetItemCount(); i++)
{
sSQL = m_Master.GetItemText(i, nSubItem);
if(sSQL == sCode)
{//found
m_Master.MoveToTop(i);
m_Master.UnSelectItem(m_Master.GetSelected());
m_Master.SelectItem(i);
return ;
}
}//end for
}
*pResult = 0;
}
///////////////////////////////////////////
//导入考勤计划
//将考勤计划转换成统一时间格式 HH:MM:SS (小时:分钟:秒)
void CDlgKqConfirm::_InputProject()
///////////////////////////////////////////
{
//1装入部门
CString sSQL, sText;
CProject Project;
COleDateTime tDate;
sSQL = _T("Select * From kv_kq_project Order by kp_code, kp_no");
m_Project.clear();
if(!m_RecordSet.Open(sSQL)) return ;
while(m_RecordSet.IsEOF() == false)
{
Project.Reset();
m_RecordSet.GetCollect("kp_code", Project.sCode);
m_RecordSet.GetCollect("kp_no", Project.lNo);
//开始
m_RecordSet.GetCollect("kp_begin", tDate);
Project.sBegin = tDate.Format("%H:%M:00");
m_RecordSet.GetCollect("kp_begin_enabled", sText);
if(sText != 'Y' || Project.sBegin == _T(""))
Project.bBeginenabled = false;
else
Project.bBeginenabled = true;
//早退
m_RecordSet.GetCollect("kp_zt", tDate);
Project.sZT = tDate.Format("%H:%M:00");
m_RecordSet.GetCollect("kp_zt_enabled", sText);
if(sText != 'Y' || Project.sZT == _T(""))
Project.bZTenabled = false;
else
Project.bZTenabled = true;
//迟到
m_RecordSet.GetCollect("kp_kg", tDate);
Project.sKG = tDate.Format("%H:%M:00");
m_RecordSet.GetCollect("kp_kg_enabled", sText);
if(sText != 'Y' || Project.sKG == _T(""))
Project.bKGenabled = false;
else
Project.bKGenabled = true;
m_Project.push_back(Project);
m_RecordSet.MoveNext();
}
}
void CDlgKqConfirm::_Restore()
{
CInputTxt txt;
COleDateTimeSpan tSpan; //时间差
int i, j;
//以编号排序
for (i = 0; i < m_Txt.size(); i++)
{
for (j = i +1 ; j < m_Txt.size(); j++)
{
if(strcmp(m_Txt[i].m_szCode, m_Txt[j].m_szCode)>0)
{
txt = m_Txt[i];
m_Txt[i] = m_Txt[j];
m_Txt[j] = txt;
}
}//end for
}//end for
//以时间排序
for (i = 0; i < m_Txt.size(); i++)
{
for (j = i +1 ; j < m_Txt.size(); j++)
{
tSpan = m_Txt[i].m_tDate - m_Txt[j].m_tDate;
if(tSpan.GetTotalSeconds() > 0)
{
txt = m_Txt[i];
m_Txt[i] = m_Txt[j];
m_Txt[j] = txt;
}
}//end for
}//end for
}
void CDlgKqConfirm::SetCheck(int nItem, CString sState, BOOL bModify)
{
if(nItem < 0) return;
int nSubItem;
if(bModify)
{
nSubItem = m_Master.GetSubItem("类型");
m_Master.SetItemText(nItem, nSubItem, sState);
m_MasterDoc.SetModify(nItem, LD_EDIT);
}
nSubItem = m_Master.GetSubItem("正常");
if(sState == _T("ZC"))
m_Master.SetItemText(nItem, nSubItem, "Y");
else
m_Master.SetItemText(nItem, nSubItem, "N");
if(sState == _T("QD"))
m_Master.SetItemText(nItem, nSubItem+1, "Y");
else
m_Master.SetItemText(nItem, nSubItem+1, "N");
if(sState == _T("ZT"))
m_Master.SetItemText(nItem, nSubItem+2, "Y");
else
m_Master.SetItemText(nItem, nSubItem+2, "N");
if(sState == _T("KG"))
m_Master.SetItemText(nItem, nSubItem+3, "Y");
else
m_Master.SetItemText(nItem, nSubItem+3, "N");
}
void CDlgKqConfirm::OnClickMaster(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
const int nColumn = pNMListView->iSubItem;
const int nItem = pNMListView->iItem;
int nSubItem = m_Master.GetSubItem("正常");
CString sText;
*pResult = 0;
if (nSubItem == nColumn)
sText = _T("ZC");
else if (nSubItem+1 == nColumn )
sText = _T("QD");
else if (nSubItem+2 == nColumn )
sText = _T("ZT");
else if (nSubItem+3 == nColumn)
sText = _T("KG");
else
return ;
//nSubItem = m_Master.GetSubItem("类型");
//m_Master.SetItemText(nItem, nSubItem, sText);
SetCheck(nItem, sText, true);
}
void CDlgKqConfirm::CProject::Reset()
{
lNo = 0;
sCode = _T("");
sBegin =_T("");
bBeginenabled = false;
sQD = _T("");
bQDenabled = false;
sZT = _T("");
bZTenabled = false;
sKG = _T("");
bKGenabled = false;
bLong = false;
}
CString CDlgKqConfirm::_IsProject(CString &sCode, CString &sPro)
{
COleDateTime tBeforeTime; //前一个打卡时间
COleDateTime tTime; //前一个打卡时间
CString sDate;
COleDateTimeSpan tSpan; //时间差
BOOL bFirst = true; //是否第1个打卡时间
BOOL bFound;
int iNo = 1; //第n次打卡
int j = 0;
CString sRet = _T("ZC");
CProject Project;
for (int i = 1; _GetProject(sPro, i, Project); i++)
{//取一考勤安排
bFound = false;
for(; j < m_Txt.size(); j ++)
{//取一记录
if(sCode != m_Txt[j].m_szCode)
{//i > 0 表示已经到结尾了
if (i > 1 ) return _T("KG"); //没有发现有效考勤记录,当扩工返回
continue;
}
if(bFirst == false) //两次打卡时间必需大小5分钟
{
tSpan = m_Txt[j].m_tDate - tBeforeTime;
if(tSpan.GetTotalMinutes() < 5) continue; //忽略
}
tBeforeTime = m_Txt[j].m_tDate; //记录上一次打卡时间
bFirst = false;
sDate = m_Txt[j].m_tDate.Format("%Y-%m-%d");
//开始
if(Project.bBeginenabled)
{
tTime = COleDateTime(COleVariant(sDate + _T(" ") + Project.sBegin));
tSpan = tTime - m_Txt[j].m_tDate ;
if (tSpan.GetTotalSeconds() > 0)continue; //忽略
}
bFound = true;
//迟到
if(Project.bQDenabled)
{
tTime = COleDateTime(COleVariant(sDate + _T(" ") + Project.sQD));
tSpan = m_Txt[j].m_tDate - tTime;
if (tSpan.GetTotalSeconds() > 0)
{
sRet = _T("QD");
}
}
//早退
if(Project.bZTenabled)
{
tTime = COleDateTime(COleVariant(sDate + _T(" ") + Project.sZT));
tSpan = m_Txt[j].m_tDate - tTime;
if (tSpan.GetTotalSeconds() < 0)
{
sRet = _T("ZT");
}
}
//扩工
if(Project.bKGenabled)
{
tTime = COleDateTime(COleVariant(sDate + _T(" ") + Project.sBegin));
tSpan = m_Txt[j].m_tDate - tTime;
if (Project.lNo % 2 && tSpan.GetTotalSeconds() > 0)
{//上班
return _T("KG"); //发现扩工即返回
}
if ((Project.lNo % 2)==0 && tSpan.GetTotalSeconds() < 0)
{//下班
return _T("KG"); //发现扩工即返回
}
goto nexit01;
}//end if
}//end for
nexit01:
if (bFound == false) //没有发现有效考勤记录
return _T("KG"); //当扩工返回
}//end for
return sRet;
}
BOOL CDlgKqConfirm::_GetProject(CString &sPro, long lNo, CProject &Project)
{
for (int i =0 ; i < m_Project.size(); i++)
{
if (m_Project[i].lNo == lNo && m_Project[i].sCode == sPro)
{
Project = m_Project[i];
return true;
}
}//end for
return false;
}
void CDlgKqConfirm::OnDtx()
{
// TODO: Add your control notification handler code here
int nItem = m_Master.GetSelected();
int nSubItem = m_Master.GetSubItem("编号");
if(nItem >= 0 && nSubItem >= 0 )
{
CString sCode = m_Master.GetItemText(nItem, nSubItem);
CString sSQL = _T("Select * From kv_kt_tmp Where km_code = '");
sSQL = sSQL + sCode + _T("'");
m_RightDoc.ResetAll();
m_RightDoc.Retrieve(sSQL, false);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -