📄 wsalary_salary.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "WSalary_Salary.h" //工资管理窗体头文件
#include "DataModule.h" //数据模块窗体头文件
#include "Archives_Query.h" //数据记录查询窗体头文件
#include "WSalary_Work.h" //考勤管理窗体头文件
#include "Main.h" //考勤工资管理系统主窗体头文件
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "INHERIT"
#pragma link "Inherit"
#pragma link "CSPIN"
#pragma resource "*.dfm"
TF_Salary *F_Salary;
//---------------------------------------------------------------------------
__fastcall TF_Salary::TF_Salary(TComponent* Owner)
: TF_Inherit(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TF_Salary::FormShow(TObject *Sender)
{ /*****工资管理窗体OnShow事件*****/
PageControl1Change(this); //引用PageControl1对象标签页切换事件
}
//---------------------------------------------------------------------------
void __fastcall TF_Salary::PageControl1Change(TObject *Sender)
{ /*****PageControl不同标签页切换事件*****/
switch(PageControl1->ActivePageIndex){ //判断PageControl现在切换到了那一页,对导航条控件数据源进行动态赋值,实现动态切换数据源的目的
case 0 : DBNavigator1->DataSource = DM->DS_Salary; //导航导数据源为工资统计信息表
break;
case 1 : DBNavigator1->DataSource = DM->DS_SOther; //导航导数据源为奖金福利津贴扣发信息表
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TF_Salary::BitBtn1Click(TObject *Sender)
{ /*****员工查找按钮单击事件*****/
F_Work->BB_QueryClick(this); //引用考勤管理窗体上的员工查找按钮单击事件
}
//---------------------------------------------------------------------------
void __fastcall TF_Salary::ME_SPersonChange(TObject *Sender)
{ /*****员工工号按钮OnChange事件*****/
if(!ME_SPerson->Text.TrimRight().IsEmpty()){ //TrimRight()去掉空格函数
DM->AQ_Employee->Filter = "Employee_ID="+ME_SPerson->Text; //设置员工工号过滤器
DM->AQ_Employee->Filtered = true; //启动过滤器
DM->AQ_Employee->Open(); //打开员工信息表
}
}
//---------------------------------------------------------------------------
void __fastcall TF_Salary::ME_SBranchChange(TObject *Sender)
{ /*****部门按钮OnChange事件*****/
if(!ME_SBranch->Text.TrimRight().IsEmpty()){ //TrimRight()去掉空格函数
DM->AQ_Employee->Filter = "Employee_Branch="+ME_SBranch->Text; //设置员工工号过滤器
DM->AQ_Employee->Filtered = true; //启动过滤器
DM->AQ_Employee->Open(); //打开员工信息表
}
}
//---------------------------------------------------------------------------
void __fastcall TF_Salary::DBGrid1DblClick(TObject *Sender)
{ /*****DBGrid1数据记录项双击事件*****/
int Record;
switch(PageControl1->ActivePageIndex){ //判断PageControl现在切换到了那一页
case 0 :{
Record = SStatistic(); //用户自定义员工工资统计函数
break; //直接跳出
}
case 1 :{
DM->AT_Count->Filter = "Count_Name='SOther'"; //设置过滤器,提取奖金福利扣发信息表计数值
DM->AT_Count->Filtered = true; //开启过滤器
DM->AT_Count->Open(); //打开记录编号计数表
Record = DM->AT_CountCount_Value->Value; //提取计数值
// DM->AQ_SOther->Open();
DM->AQ_SOther->Insert(); //在奖金福利扣发信息表中追加一条记录
DM->AQ_SOtherSOther_YMonth->Value = DateTimePicker2->Date; //赋工资统计月份值
DM->AQ_SOtherSOther_Type->Value = RadioGroup1->ItemIndex; //赋加类别代码值
DM->AQ_SOtherSOther_Money->Value = CSpinEdit1->Text.ToDouble();//赋金额值
DM->AQ_SOtherSOther_Text->Value = Memo2->Text; //赋备注内容
DM->AQ_SOtherSOther_ID->Value = Record+1; //赋记录编号值
DM->AQ_SOtherSOther_PID->Value = DM->AQ_EmployeeEmployee_ID->Value; //赋员工工号值
DM->AQ_SOther->Post(); //提交追加数据记录
}
}
DM->AT_Count->Edit(); //编辑记录号计数数据表
DM->AT_CountCount_Value->Value = Record+1; //记录号加1再赋值
DM->AT_Count->Post(); //提交编辑数据
DM->AT_Count->Close(); //关闭记录号计数数据表
}
//---------------------------------------------------------------------------
int __fastcall TF_Salary::SStatistic(void)
{ /*****用户自定义员工工资统计函数*****/
int Record; //数据表计数值
int Person_ID; //员工工号
AnsiString QStr; //SQL语句
int Salary[5]; //工资计算参数
float PWork,POTime,PEvect,LateEarly,DAbsent,PTotal; //基本工资、加班工资、出差补贴、迟到早退扣发,旷工扣发,实发工资
float Bonus,Welfare,Allow,Insure; //奖金、福利、津贴和扣发
Person_ID = DM->AQ_EmployeeEmployee_ID->Value; //员工工号赋值
TIniFile *ini; //申请一个TIniFile类对象
ini = new TIniFile(ExtractFilePath(ParamStr(0))+"Config.INI"); //ExtractFilePath(ParamStr(0))取得当前工作路径
Salary[0] = ini->ReadInteger("SalaryParam","Salary1",10); //读取基本工资单价
Salary[1] = ini->ReadInteger("SalaryParam","Salary2",20); //读取加班工资单价
Salary[2] = ini->ReadInteger("SalaryParam","Salary3",100); //读取出差工资单价
Salary[3] = ini->ReadInteger("SalaryParam","Salary4",50); //读取迟到早退扣发单价
Salary[4] = ini->ReadInteger("SalaryParam","Salary5",100); //读取旷工扣发单价
delete ini; //释放ini对象
//计算正常上班工资、加班工资、迟到早退扣发金额和旷工扣发金额
unsigned short year,month,day; //临时变量
DateTimePicker1->Date.DecodeDate(&year,&month,&day); //分解得到年,月,日
QStr = "SELECT * FROM WSalary_Stat WHERE Stat_PID="+IntToStr(Person_ID)+" AND "; //生成SQL语句
QStr.Insert("Stat_YMonth = '"+IntToStr(year)+"-"+IntToStr(month)+"-01'",QStr.Length()+1);
F_Work->RunQuery(DM->AQ_Stat,QStr); //运行SQL语句,F_Work->RunQuery是考勤管理窗体下的自定义函数
if(!DM->AQ_Stat->RecordCount){ //没有找到考勤统计记录
Application->MessageBoxA("考勤统计记录没有找到,请先在考勤管理窗口进行考勤统计","提示对话框",MB_OK);
return 0; //直接返回
}
else{
PWork = DM->AQ_StatStat_HWork->Value*Salary[0]; //算得正常上班工资
POTime = DM->AQ_StatStat_HOvertime->Value*Salary[1]; //算得加班上班工资
PEvect = DM->AQ_StatStat_DEvection->Value*Salary[2]; //算得出差补贴,以天为单位
LateEarly = (DM->AQ_StatStat_TLate->Value+DM->AQ_StatStat_TEarly->Value)*Salary[3]; //算得迟到早退扣发金额
DAbsent = DM->AQ_StatStat_TAbsent->Value*Salary[4]; //算得旷工扣发金额
}
//计算奖金总金额
QStr = "SELECT SUM(SOther_Money) AS TMoney FROM WSalary_SOther WHERE SOther_PID="+IntToStr(Person_ID)+" AND "; //生成SQL语句
QStr.Insert("SOther_YMonth BETWEEN '"+IntToStr(year)+"-"+IntToStr(month)+"-01'AND '"+IntToStr(year)+"-"+IntToStr(month)+"-31'",QStr.Length()+1);
QStr.Insert(" AND SOther_Type = 0",QStr.Length()+1); //提取累加奖金金额
F_Work->RunQuery(DM->AQ_Back_Restore,QStr); //运行SQL语句得到累计奖金总金额
try{
Bonus = DM->AQ_Back_Restore->Fields->Fields[0]->Value; //提取累计奖金总金额
}
catch(...){
Bonus = 0; //如果无奖金记录则为0
}
//计算福利总金额
QStr = "SELECT SUM(SOther_Money) AS TMoney FROM WSalary_SOther WHERE SOther_PID="+IntToStr(Person_ID)+" AND "; //生成SQL语句
QStr.Insert("SOther_YMonth BETWEEN '"+IntToStr(year)+"-"+IntToStr(month)+"-01'AND '"+IntToStr(year)+"-"+IntToStr(month)+"-31'",QStr.Length()+1);
QStr.Insert(" AND SOther_Type = 1",QStr.Length()+1); //提取累加福利金额
F_Work->RunQuery(DM->AQ_Back_Restore,QStr); //运行SQL语句得到累计福利总金额
try{
Welfare = DM->AQ_Back_Restore->Fields->Fields[0]->Value; //提取累计福利总金额
}
catch(...){
Welfare = 0; //如果无福利记录则为0
}
//计算津贴总金额
QStr = "SELECT SUM(SOther_Money) AS TMoney FROM WSalary_SOther WHERE SOther_PID="+IntToStr(Person_ID)+" AND "; //生成SQL语句
QStr.Insert("SOther_YMonth BETWEEN '"+IntToStr(year)+"-"+IntToStr(month)+"-01'AND '"+IntToStr(year)+"-"+IntToStr(month)+"-31'",QStr.Length()+1);
QStr.Insert(" AND SOther_Type = 2",QStr.Length()+1); //提取累加津贴金额
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -