?? 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 + -