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

📄 salarydlg.cpp

📁 工资管理源码;员工基本工资设定
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	// 打开计数器表
	pRS->Open("COUNTER",
		pTheConn.GetInterfacePtr(),
		adOpenKeyset,adLockOptimistic,adCmdTable);
	counter=pRS->GetCollect("COUNTER_VALUE").iVal; // 提取计数值
	counter++; // 计数值加1
	pRS->Fields->GetItem("COUNTER_VALUE")->PutValue(_variant_t(counter));
	pRS->Update(); // 更新
	pRS->Close(); // 关闭
	// 添加记录
	// 得到项目类型
	if(((CButton*)GetDlgItem(IDC_RADIO_BONUS))->GetCheck()) strType="0";
	else if(((CButton*)GetDlgItem(IDC_RADIO_FULI))->GetCheck()) strType="1";
	else if(((CButton*)GetDlgItem(IDC_RADIO_JINTIE))->GetCheck()) strType="2";
	else strType="3";
	// 打开表
	pRS->Open("SALARY_OTHER",
		pTheConn.GetInterfacePtr(),
		adOpenKeyset,adLockOptimistic,adCmdTable);
	pRS->AddNew(); // 添加新纪录
	pRS->Fields->GetItem("ID")->PutValue(_variant_t(counter));
	pRS->Fields->GetItem("YEARMONTH")->PutValue(strYearMonth.AllocSysString());
	pRS->Fields->GetItem("PERSON")->PutValue(strPersonID.AllocSysString());
	pRS->Fields->GetItem("TYPE")->PutValue(strType.AllocSysString());
	pRS->Fields->GetItem("NAME")->PutValue(m_strItemName.AllocSysString());
	pRS->Fields->GetItem("MONEY")->PutValue(_variant_t(m_fMoney));
	pRS->Fields->GetItem("DESCRIPTION")->PutValue(m_strDesription.AllocSysString());
	pRS->Update(); // 更新
	pRS.Release(); // 释放
}

void CSalaryDlg::OnBtnAddPerson() 
{
	// 数据库未连接则返回
	if(pTheConn->GetState()==adStateClosed) return;
	UpdateData(); // 更新数据
	// 无数据返回
	if(m_strItemName.IsEmpty() || m_strPersonName.IsEmpty()) return;
	AddRecord(m_strPersonID); // 添加记录
	// 刷新各列表
	UpdateDG(m_pDG2rs,m_cDG2,2);
	UpdateDG(m_pDG3rs,m_cDG3,3);
	UpdateDG(m_pDG4rs,m_cDG4,4);
	UpdateDG(m_pDG5rs,m_cDG5,5);
}

void CSalaryDlg::UpdateDG(_RecordsetPtr pDGrs, CDataGrid& cDG, int index)
{
	CString str;
	// 根据index得到过滤条件
	switch(index)
	{
	case 2:
		str="PERSON='" + m_strPersonID + "' and YEARMONTH='0000000'";
		break;
	case 3:
		str="PERSON='" + m_strPersonID
			+ "' and YEARMONTH='" + m_strYearMonth
			+ "' and TYPE='0'";
		break;
	case 4:
		str="(PERSON='" + m_strPersonID
			+ "' and YEARMONTH='" + m_strYearMonth
			+ "' and TYPE='1') or " +
			"(PERSON='" + m_strPersonID
			+ "' and YEARMONTH='" + m_strYearMonth
			+ "' and TYPE='2')";
		break;
	case 5:
		str="PERSON='" + m_strPersonID
			+ "' and YEARMONTH='" + m_strYearMonth
			+ "' and TYPE='3'";
		break;
	default:
		return;
	}
	if(pDGrs->GetState()==adStateOpen) pDGrs->Close(); // 关闭Recordset
	pDGrs->Filter=str.AllocSysString(); // 设定过滤条件
	// 打开Recordset
	pDGrs->Open("SALARY_OTHER",
		pTheConn.GetInterfacePtr(),
		adOpenKeyset,adLockOptimistic,adCmdTable);
	int n=m_pDG2rs->RecordCount;
	// 设置DataGrid
	cDG.SetRefDataSource((LPUNKNOWN)pDGrs);
}

void CSalaryDlg::OnBtnAddList() 
{
	UpdateData(); // 更新数据
	_variant_t Value;
	CString strPersonID;
	// 判断数据库是否连接
	if(pTheConn->GetState()==adStateClosed) return;
	if(m_pDG1rs->GetState()==adStateClosed) return;
	m_pDG1rs->MoveFirst(); // 移动到头
	while(!m_pDG1rs->adoEOF) // 遍历员工列表
	{
		Value=m_pDG1rs->GetCollect("ID"); // 得到员工号
		strPersonID=(char*)_bstr_t(Value);
		AddRecord(strPersonID);
		m_pDG1rs->MoveNext();
	}
	// 刷新各列表
	UpdateDG(m_pDG2rs,m_cDG2,2);
	UpdateDG(m_pDG3rs,m_cDG3,3);
	UpdateDG(m_pDG4rs,m_cDG4,4);
	UpdateDG(m_pDG5rs,m_cDG5,5);
}

void CSalaryDlg::OnConfigFormula() // 显示公式调整窗口
{
	CFormulaDlg FormulaDlg;
	FormulaDlg.DoModal();
}

void CSalaryDlg::OnSystemExit() 
{
	EndDialog(IDOK); // 退出程序
}

void CSalaryDlg::OnCalculateStat() 
{
	CString str; // 临时变量
	int Rate_overtime,Money_errand,Money_late,Money_absent; // 记录中间结果
	long counter; // 保存计数值
	CString strYearMonth,strPerson,strAddDetail,strSubDetail; // 保存说明信息
	float basic,bonus,add_total,sub_total,total,temp; // 保存中间结果
	_RecordsetPtr pRS; // 临时Recordset对象

	// 数据库未连接则返回
	if(pTheConn->GetState()==adStateClosed) return;
	UpdateData(); // 更新数据
	// 读取参数
	CString strFileName=".\\formula.ini"; // INI文件名
	Rate_overtime=GetPrivateProfileInt("Formula", "OverTime", 150, strFileName);
	Money_errand=GetPrivateProfileInt("Formula", "Errand", 100, strFileName);
	Money_late=GetPrivateProfileInt("Formula", "Late", 10, strFileName);
	Money_absent=GetPrivateProfileInt("Formula", "Absent", 50, strFileName);
	strYearMonth=m_strYearMonth; // 获取统计月份
	// 遍历员工列表
	_RecordsetPtr pRS_person;
	pRS_person.CreateInstance(__uuidof(Recordset)); // 创建Recordset对象
	// 打开Recordset对象
	pRS_person->Open("select ID from PERSON where STATE='T'",
			pTheConn.GetInterfacePtr(),
			adOpenKeyset,adLockOptimistic,adCmdText);

	
	while(!pRS_person->adoEOF) // 遍历员工列表
	{
		strPerson=(char*)_bstr_t(pRS_person->GetCollect("ID")); // 获取员工号
		strAddDetail.Empty(); // 清除附加金额说明
		strSubDetail.Empty(); // 清除扣除金额说明
		basic=0; // 初始化基本工资
		bonus=0; // 初始化红利奖金
		add_total=0; // 初始化附加金额
		sub_total=0; // 初始化扣除金额
		total=0;
		pRS.CreateInstance(__uuidof(Recordset)); // 创建Recordset对象

	// 获取员工基本工资
		str="select SALARY from SALARY_SET where PERSON='" + strPerson + "'";
		if(pRS->GetState()==adStateOpen) pRS->Close();
		pRS->Open(str.AllocSysString(),
			pTheConn.GetInterfacePtr(),
			adOpenStatic,adLockReadOnly,adCmdText);
		basic=pRS->GetCollect("SALARY").fltVal; // 获取员工基本工资
		
		pRS->Close(); // 关闭Recordset对象
	// 获取员工出勤记录,计算相关工资额
		str="select WORK_HOUR,OVER_HOUR,ERRAND_HDAY,LATE_TIMES,EARLY_TIMES,ABSENT_TIMES from ATTENDANCE_STAT where YEAR_MONTH='"
			+ strYearMonth
			+ "' and PERSON='" +strPerson + "'";
		pRS->Open(str.AllocSysString(),
			pTheConn.GetInterfacePtr(),
			adOpenKeyset,adLockOptimistic,adCmdText);
		if (pRS->RecordCount==0)
		{
			AfxMessageBox("没有本月的出勤纪录");
			return;
		}
		basic*=pRS->GetCollect("WORK_HOUR").iVal; // 计算基本工资
		
		// 计算加班费
		temp=basic*pRS->GetCollect("OVER_HOUR").iVal*Rate_overtime/100.0;
	
		if(temp>0) // 判断是否有加班费
		{
			add_total+=temp; // 增加附加金额
			str.Format("%.f",temp); // 转换temp为字符串
			strAddDetail+="加班费:"+str+";"; // 增加附加金额说明
		}
		// 计算出差费
		temp=Money_errand*pRS->GetCollect("ERRAND_HDAY").iVal;
		if(temp>0) // 判断是否有加班费
		{
			add_total+=temp; // 增加附加金额
			str.Format("%.f",temp); // 转换temp为字符串
			strAddDetail+="差旅费:"+str+";"; // 增加附加金额说明
		}
	

		// 计算误工费
		temp=Money_late*(pRS->GetCollect("LATE_TIMES").bVal
						+pRS->GetCollect("EARLY_TIMES").bVal)
			+Money_absent*pRS->GetCollect("ABSENT_TIMES").bVal;
		if(temp>0) // 判断是否有误工费
		{
			sub_total+=temp; // 增加扣除金额
			str.Format("%.f",temp); // 转换temp为字符串
			strSubDetail+="误工费:"+str+";"; // 增加扣除金额说明
		}
		pRS->Close(); // 关闭Recordset对象
		
	// 统计奖金记录
		str="select NAME,MONEY from SALARY_OTHER where (YEARMONTH='"
			+ strYearMonth + "' or YEARMONTH='0000000')"
			+ " and PERSON='" +strPerson
			+ "' and TYPE='0'";
		pRS->Open(str.AllocSysString(),
			pTheConn.GetInterfacePtr(),
			adOpenKeyset,adLockOptimistic,adCmdText);
		while(!pRS->adoEOF) // 依次对所有记录进行操作
		{
			bonus+=pRS->GetCollect("MONEY").fltVal; // 增加奖金额
			pRS->MoveNext(); // 跳到下一条记录
		}
		pRS->Close(); // 关闭Recordset对象
		
	// 统计福利记录
		str="select NAME,MONEY from SALARY_OTHER where (YEARMONTH='"
			+ strYearMonth + "' or YEARMONTH='0000000')"
			+ " and PERSON='" +strPerson
			+ "' and TYPE='1'";
		pRS->Open(str.AllocSysString(),
			pTheConn.GetInterfacePtr(),
			adOpenKeyset,adLockOptimistic,adCmdText);
		while(!pRS->adoEOF) // 依次对所有记录进行操作
		{
			temp=pRS->GetCollect("MONEY").fltVal; // 提取福利金额
			add_total+=temp; // 增加附加金额
			str.Format("%.f",temp); // 转换temp为字符串
			// 增加附加金额说明
			CString strTmp=(char*)_bstr_t(pRS->GetCollect("NAME"));
			strAddDetail+=strTmp + ":" + str + ";";
			pRS->MoveNext(); // 跳到下一条记录
		}
		pRS->Close(); // 关闭Recordset对象
	
	// 统计津贴记录
		str="select NAME,MONEY from SALARY_OTHER where (YEARMONTH='"
			+ strYearMonth + "' or YEARMONTH='0000000')"
			+ " and PERSON='" +strPerson
			+ "' and TYPE='2'";
		pRS->Open(str.AllocSysString(),
			pTheConn.GetInterfacePtr(),
			adOpenKeyset,adLockOptimistic,adCmdText);
		while(!pRS->adoEOF) // 依次对所有记录进行操作
		{
			temp=pRS->GetCollect("MONEY").fltVal; // 提取津贴金额
			add_total+=temp; // 增加附加金额
			str.Format("%.f",temp); // 转换temp为字符串
			// 增加附加金额说明
			CString strTmp=(char*)_bstr_t(pRS->GetCollect("NAME"));
			strAddDetail+=strTmp + ":" + str + ";";
			pRS->MoveNext(); // 跳到下一条记录
		}
		pRS->Close(); // 关闭Recordset对象
	
			
	// 统计扣发记录
		str="select NAME,MONEY from SALARY_OTHER where (YEARMONTH='"
			+ strYearMonth + "' or YEARMONTH='0000000')"
			+ " and PERSON='" +strPerson
			+ "' and TYPE='3'";
		pRS->Open(str.AllocSysString(),
			pTheConn.GetInterfacePtr(),
			adOpenKeyset,adLockOptimistic,adCmdText);
		while(!pRS->adoEOF) // 依次对所有记录进行操作
		{
			temp=pRS->GetCollect("MONEY").fltVal; // 提取扣发金额
			sub_total+=temp; // 增加扣发金额
			str.Format("%.f",temp); // 转换temp为字符串
			// 增加扣发金额说明
			CString strTmp=(char*)_bstr_t(pRS->GetCollect("NAME"));
			strSubDetail+=strTmp + ":" + str + ";";
			pRS->MoveNext(); // 跳到下一条记录
		}
		pRS->Close(); // 关闭Recordset对象
	
	// 计算实发金额
		total=basic+bonus+add_total-sub_total;
		if(total<0) total=0; // 保证实发金额不小于0
	
	// 插入工资记录
		str="YEARMONTH='"+strYearMonth+"' and PERSON='"+strPerson+"'";
		pRS->Filter=str.AllocSysString(); // 设置过滤条件
		// 打开工资表
		pRS->Open("SALARY",
			pTheConn.GetInterfacePtr(),
			adOpenKeyset,adLockOptimistic,adCmdTable);

		if(pRS->RecordCount==0) // 判断是否存在该月份记录
		{ // 无旧记录,则新建记录
			// 打开计数器表
			

			_RecordsetPtr pRS_counter;
			pRS_counter.CreateInstance(__uuidof(Recordset));
			pRS_counter->Filter="ID='Y'"; // 设置过滤条件
			pRS_counter->Open("COUNTER",
					pTheConn.GetInterfacePtr(),
					adOpenKeyset,adLockOptimistic,adCmdTable);
			
			counter=pRS_counter->GetCollect("COUNTER_VALUE").iVal; // 提取计数值
			
			counter++; // 计数值加1
			pRS_counter->Fields->GetItem("COUNTER_VALUE")->PutValue(_variant_t(counter));
			pRS_counter->Update(); // 更新
			pRS_counter->Close(); // 关闭
			pRS_counter.Release(); // 释放
			// 追加工资记录
			pRS->AddNew();
			pRS->Fields->GetItem("ID")->PutValue(_variant_t(counter));
			pRS->Fields->GetItem("YEARMONTH")->PutValue(strYearMonth.AllocSysString());
			pRS->Fields->GetItem("PERSON")->PutValue(strPerson.AllocSysString());
			pRS->Fields->GetItem("BASIC")->PutValue(_variant_t(basic));
			pRS->Fields->GetItem("BONUS")->PutValue(_variant_t(bonus));
			pRS->Fields->GetItem("ADD_DETAIL")->PutValue(strAddDetail.AllocSysString());
			pRS->Fields->GetItem("ADD_TOTAL")->PutValue(_variant_t(add_total));
			pRS->Fields->GetItem("SUB_DETAIL")->PutValue(strSubDetail.AllocSysString());
			pRS->Fields->GetItem("SUB_TOTAL")->PutValue(_variant_t(sub_total));
			pRS->Fields->GetItem("TOTAL")->PutValue(_variant_t(total));
			pRS->Update(); // 更新
			
		}
		
		else // 有旧记录则修改记录
		{
			pRS->Fields->GetItem("BASIC")->PutValue(_variant_t(basic));
			pRS->Fields->GetItem("BONUS")->PutValue(_variant_t(bonus));
			pRS->Fields->GetItem("ADD_DETAIL")->PutValue(strAddDetail.AllocSysString());
			pRS->Fields->GetItem("ADD_TOTAL")->PutValue(_variant_t(add_total));
			pRS->Fields->GetItem("SUB_DETAIL")->PutValue(strSubDetail.AllocSysString());
			pRS->Fields->GetItem("SUB_TOTAL")->PutValue(_variant_t(sub_total));
			pRS->Fields->GetItem("TOTAL")->PutValue(_variant_t(total));
			pRS->Update(); // 更新
		}
		
		pRS->Close(); // 关闭Recordset对象
		pRS.Release(); // 释放
		
		
	// 跳至下一个员工记录
		pRS_person->MoveNext();
	}


	pRS_person.Release(); // 释放
}

BOOL CSalaryDlg::PreTranslateMessage(MSG* pMsg) 
{
	// 处理快捷键
	TranslateAccelerator(m_hWnd, m_hAccTable, pMsg);
	return CDialog::PreTranslateMessage(pMsg);
}

void CSalaryDlg::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{// 处理菜单项的Prompt
	CDialog::OnMenuSelect(nItemID, nFlags, hSysMenu);
    if (nItemID != 0) // 可能为0(seperator时)
    {
		CString strStatusText;
		strStatusText.LoadString( nItemID );
		if (!strStatusText.IsEmpty())
		m_wndStatusBar.SetPaneText(0, strStatusText);
	}
}

void CSalaryDlg::RightClick(CDataGrid& DG, _RecordsetPtr pDGrs, short Button, long X, long Y)
{
	// 非右键按下则返回
	if(Button!=2) return;
	// 得到DataGrid窗口坐标
	CRect rc;
	DG.GetWindowRect(&rc);
	// 得到鼠标按下时位置
	CPoint pt;
	pt.x=X+rc.left;
	pt.y=Y+rc.top;
	// 弹出右键菜单
	CMenu popup;
	popup.CreatePopupMenu();
	popup.AppendMenu(MF_ENABLED,IDM_MENU_DELETERECORD,"删除当前记录(&Z)");
	popup.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pt.x,pt.y,this);
	// 记录当前所在DataGrid
	m_pCurDGrs=pDGrs;
}

void CSalaryDlg::OnMouseDownDatagrid2(short Button, short Shift, long X, long Y) 
{
	RightClick(m_cDG2, m_pDG2rs, Button, X, Y); // 弹出右键菜单
}

void CSalaryDlg::OnMouseDownDatagrid3(short Button, short Shift, long X, long Y) 
{
	RightClick(m_cDG3, m_pDG3rs, Button, X, Y); // 弹出右键菜单
}

void CSalaryDlg::OnMouseDownDatagrid4(short Button, short Shift, long X, long Y) 
{
	RightClick(m_cDG4, m_pDG4rs, Button, X, Y); // 弹出右键菜单
}

void CSalaryDlg::OnMouseDownDatagrid5(short Button, short Shift, long X, long Y) 
{
	RightClick(m_cDG5, m_pDG5rs, Button, X, Y); // 弹出右键菜单
}

void CSalaryDlg::OnDeleteRecord()
{
	// 数据库未连接则返回
	if(pTheConn->GetState()==adStateClosed) return;
	// Recordset对象打开状态则删除当前记录
	if(m_pCurDGrs->GetState()==adStateOpen)
		m_pCurDGrs->Delete(adAffectCurrent); // 删除当前记录
}

void CSalaryDlg::OnPreviewView() // 查看本月工资
{
	// 数据库未连接则返回
	if(pTheConn->GetState()==adStateClosed) return;
	UpdateData(); // 更新数据

	CPreviewDlg dlg;
	dlg.m_strYearMonth=m_strYearMonth;
	dlg.DoModal(); // 显示本月工资计算结果
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -