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

📄 wsalary_salary.cpp

📁 很经典的数据库代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

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