📄 salarydlg.cpp
字号:
// 打开计数器表
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 + -