⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlgkqconfirm.cpp

📁 Delphi数据库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	  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 + -