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

📄 u_main.pas

📁 一个小小的工资管理系统
💻 PAS
字号:
unit u_main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, ComCtrls, StdCtrls, DBCtrls, Mask, Grids, DBGrids, Spin, ExtCtrls,
  Gauges, Inifiles;

type
  TF_main = class(TForm)
    MainMenu1: TMainMenu;
    M_system: TMenuItem;
    M_connect: TMenuItem;
    M_disconnect: TMenuItem;
    N1: TMenuItem;
    M_printer_setup: TMenuItem;
    M_preview: TMenuItem;
    M_print: TMenuItem;
    M_exit: TMenuItem;
    M_option: TMenuItem;
    M_formula: TMenuItem;
    M_calculate: TMenuItem;
    M_stat: TMenuItem;
    M_report: TMenuItem;
    StatusBar1: TStatusBar;
    GroupBox1: TGroupBox;
    DBGrid1: TDBGrid;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    i_depart_id: TMaskEdit;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    i_salary: TDBEdit;
    i_person_id: TMaskEdit;
    i_person_name: TEdit;
    GroupBox2: TGroupBox;
    Label7: TLabel;
    Label8: TLabel;
    i_yearmonth: TMaskEdit;
    i_type: TRadioGroup;
    Label9: TLabel;
    i_money: TSpinEdit;
    Label10: TLabel;
    Label11: TLabel;
    i_name: TComboBox;
    i_fixed: TCheckBox;
    Label12: TLabel;
    i_description: TMemo;
    B_add_person: TButton;
    B_add_list: TButton;
    Label13: TLabel;
    i_depart_name: TEdit;
    DBGrid2: TDBGrid;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    DBGrid3: TDBGrid;
    DBGrid4: TDBGrid;
    DBGrid5: TDBGrid;
    PopupMenu1: TPopupMenu;
    M_delete: TMenuItem;
    Gauge1: TGauge;
    procedure M_connectClick(Sender: TObject);
    procedure M_disconnectClick(Sender: TObject);
    procedure M_exitClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure M_deleteClick(Sender: TObject);
    procedure i_depart_idChange(Sender: TObject);
    procedure i_person_idChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure M_formulaClick(Sender: TObject);
    procedure M_printer_setupClick(Sender: TObject);
    procedure M_previewClick(Sender: TObject);
    procedure M_printClick(Sender: TObject);
    procedure B_add_personClick(Sender: TObject);
    procedure B_add_listClick(Sender: TObject);
    procedure M_statClick(Sender: TObject);
    procedure DBGrid1DblClick(Sender: TObject);
    procedure i_yearmonthChange(Sender: TObject);
  private
    { Private declarations }
    procedure Add_record(person_id:String);
  public
    { Public declarations }
  end;

var
  F_main: TF_main;

implementation

uses u_login, u_datamodule, u_formula, u_report;

{$R *.DFM}

procedure TF_main.M_connectClick(Sender: TObject);
begin
  F_login.ShowModal;
  if DM_main.Database.Connected then
    StatusBar1.Panels[1].Text:='已连接到服务器:'+F_login.i_server.Text
  else
    StatusBar1.Panels[1].Text:='尚未登录服务器。请按F2登录。';
end;

procedure TF_main.M_disconnectClick(Sender: TObject);
begin
  DM_main.Database.Connected:=False;
  StatusBar1.Panels[1].Text:='尚未登录服务器。请按F2登录。';
end;

procedure TF_main.M_exitClick(Sender: TObject);
begin
  Close;
end;

procedure TF_main.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DM_main.Database.Connected:=False;
end;

procedure TF_main.M_deleteClick(Sender: TObject);
begin
  if Sender is TDBGrid then
    (Sender as TDBGrid).DataSource.DataSet.Delete;
end;

procedure TF_main.i_depart_idChange(Sender: TObject);
begin
  if DM_main.Database.Connected then
  begin
    if Pos(' ',i_depart_id.Text)=0 then
    begin //判断输入完整并且数据库连接
      With DM_main.Q_depart do
      begin
        Close;
        Params.ParamValues['DEPART']:=i_depart_id.Text;
        Open;
        if RecordCount>0 then
          i_depart_name.Text:=FieldValues['NAME'];
        Close;
      end;
      With DM_main.Q_person_list do
      begin
        Close;
        Params.ParamValues['DEPART']:=i_depart_id.Text;
        Open;
      end;
    end
    else
    begin
      i_depart_name.Text:='';
      if Pos('*',i_depart_id.Text)<>0 then
      begin
        With DM_main.Q_person_list do
        begin
          Close;
          Params.ParamValues['DEPART']:='%';
          Open;
        end;
      end;
    end;
  end;
end;

procedure TF_main.i_person_idChange(Sender: TObject);
begin
  if (Pos(' ',i_person_id.Text)=0) and DM_main.Database.Connected then
  begin //判断输入完整并且数据库连接
    With DM_main do
    begin
      Q_person.Close;
      Q_person.Params.ParamValues['PERSON']:=i_person_id.Text;
      Q_person.Open;
      if Q_person.RecordCount=1 then
      begin
        i_person_name.Text:=Q_person['NAME'];
        //i_depart_id.Text:=Q_person['DEPARTMENT'];
        T_salary_set.Filter:='PERSON='''+i_person_id.Text+'''';
        T_salary_set.Filtered:=True;
        T_salary_set.Open;
        if T_salary_set.RecordCount=0 then
          T_salary_set.AppendRecord([i_person_id.Text,0]);
        T_salary_1.Filter:='PERSON='''+i_person_id.Text
          +''' AND YEARMONTH=''0000000''';
        T_salary_1.Filtered:=True;
        T_salary_1.Open;
        T_salary_2.Filter:='PERSON='''+i_person_id.Text
          +''' AND YEARMONTH='''+i_yearmonth.Text
          +''' AND OTHER_TYPE=''0''';
        T_salary_2.Filtered:=True;
        T_salary_2.Open;
        T_salary_3.Filter:='PERSON='''+i_person_id.Text
          +''' AND YEARMONTH='''+i_yearmonth.Text
          +''' AND (OTHER_TYPE=''1'' OR OTHER_TYPE=''2'')';
        T_salary_3.Filtered:=True;
        T_salary_3.Open;
        T_salary_4.Filter:='PERSON='''+i_person_id.Text
          +''' AND YEARMONTH='''+i_yearmonth.Text
          +''' AND OTHER_TYPE=''3''';
        T_salary_4.Filtered:=True;
        T_salary_4.Open;
      end;
      Q_person.Close;
    end;
  end
  else
  begin //数据不完整
    with DM_main do
    begin
      T_salary_set.Close;
      T_salary_1.Close;
      T_salary_2.Close;
      T_salary_3.Close;
    end;
    i_person_name.Text:='';
  end;
end;

procedure TF_main.FormCreate(Sender: TObject);
const
  delta=2;
begin
  //绑定进度条
  Gauge1.Parent:=StatusBar1;
  Gauge1.Top:=delta+1;
  Gauge1.Left:=StatusBar1.Panels[0].Width+delta+1;
  Gauge1.Height:=StatusBar1.Height-delta*2;
  Gauge1.Width:=StatusBar1.Panels[1].Width-delta*2;
  i_yearmonth.Text:=FormatDateTime('yyyy-mm',now);
end;

procedure TF_main.M_formulaClick(Sender: TObject);
begin
  F_formula.ShowModal;
end;

procedure TF_main.M_printer_setupClick(Sender: TObject);
begin
  F_report.QuickRep1.PrinterSetup;
end;

procedure TF_main.M_previewClick(Sender: TObject);
begin
  F_report.QuickRep1.Preview;
end;

procedure TF_main.M_printClick(Sender: TObject);
begin
  F_report.QuickRep1.Print;
end;

procedure TF_main.Add_record(person_id:String);
var
  counter:Integer;
  yearmonth:String;
begin
  if i_fixed.Checked then
    yearmonth:='0000000'
  else
    yearmonth:=i_yearmonth.Text;
  //获取计数
  with DM_main.T_counter do
  begin
    Close;
    Filter:='ID=''R''';
    Open;
    counter:=FieldValues['COUNTER_VALUE'];
    Inc(counter);
    Edit;
    FieldValues['COUNTER_VALUE']:=counter;
    Post;
    Close;
  end;
  with DM_main.Q_add_salary_other do
  begin
    Close;
    Params[0].Value:=counter;
    Params[1].Value:=yearmonth;
    Params[2].Value:=person_id;
    Params[3].Value:=IntToStr(i_type.ItemIndex);
    Params[4].Value:=i_name.Text;
    Params[5].Value:=i_money.Value;
    Params[6].Value:=i_description.Text;
    ExecSQL;
  end;
end;

procedure TF_main.B_add_personClick(Sender: TObject);
begin
  if DM_main.Database.Connected
    and (Length(i_name.Text)>0)
    and (Length(i_person_name.Text)>0) then
  begin
    Add_record(i_person_id.Text);
    With DM_main do
    begin
      T_salary_1.Refresh;
      T_salary_2.Refresh;
      T_salary_3.Refresh;
      T_salary_4.Refresh;
    end;
  end;
end;

procedure TF_main.B_add_listClick(Sender: TObject);
var
  i,n:integer;
begin
  With DM_main do
  begin
    if Database.Connected
      and Q_person_list.Active then
    begin
      With Q_person_list do
      begin
        n:=RecordCount;
        Gauge1.Progress:=0;
        i:=0;
        First;
        while not Eof do
        begin
          Add_record(FieldValues['ID']);
          Next;
          Inc(i);
          Gauge1.Progress:=(100*i) div n;
        end;
      end;
      T_salary_1.Refresh;
      T_salary_2.Refresh;
      T_salary_3.Refresh;
      T_salary_4.Refresh;
    end;
  end;
end;

procedure TF_main.M_statClick(Sender: TObject);
var
  MyInifile:Tinifile;
  Rate_overtime, Money_errand, Money_late, Money_absent:Integer;
  i,n:Integer;
  counter:Integer;
  yearmonth,person,add_detail,sub_detail:String;
  basic, bonus, add_total, sub_total, total, temp:Single;
begin
  //读取参数
  MyInifile:=Tinifile.Create(ExtractFilePath(Paramstr(0))+'formula.ini');
  Rate_overtime:=MyInifile.ReadInteger('Formula', 'OverTime', 150);
  Money_errand:=MyInifile.ReadInteger('Formula', 'Errand', 100);
  Money_late:=MyInifile.ReadInteger('Formula', 'Late', 10);
  Money_absent:=MyInifile.ReadInteger('Formula', 'Absent', 50);
  yearmonth:=i_yearmonth.Text;
  With DM_main do
  begin
    //获取员工列表
    with Q_person_list_all do
    begin
      Open;
      n:=RecordCount;
      i:=0;
      Gauge1.Progress:=0;
      First;
      while not Eof do
      begin
      //统计员工工资
        person:=FieldValues['ID'];
        add_detail:='';
        sub_detail:='';
        basic:=0;
        bonus:=0;
        add_total:=0;
        sub_total:=0;
        total:=0;
        //基本工资
        with Q_salary_base do
        begin
          Close;
          Params.ParamValues['PERSON']:=person;
          Open;
          basic:=FieldValues['SALARY'];
          Close;
        end;
        //获取员工出勤记录,计算相关工资额
        with Q_attendance_stat do
        begin
          Close;
          Params.ParamValues['PERSON']:=person;
          Params.ParamValues['YEARMONTH']:=yearmonth;
          Open;
          basic:=basic*FieldValues['WORK_HOUR'];
          temp:=basic*FieldValues['OVER_HOUR']*Rate_overtime/100;
          if temp>0 then
          begin
            add_total:=add_total+temp;
            add_detail:='加班费:'+FloatToStrF(temp, ffFixed, 5, 1)+';';
          end;
          temp:=Money_errand*FieldValues['ERRAND_HDAY'];
          if temp>0 then
          begin
            add_total:=add_total+temp;
            add_detail:='差旅费:'+FloatToStrF(temp, ffFixed, 5, 1)+';';
          end;
          temp:=Money_late*(FieldValues['LATE_TIMES']+FieldValues['EARLY_TIMES'])
               +Money_absent*FieldValues['ABSENT_TIMES'];
          if temp>0 then
          begin
            sub_total:=sub_total+temp;
            sub_detail:='误工费:'+FloatToStrF(temp, ffFixed, 5, 1)+';';
          end;
          Close;
        end;
        With Q_salary_other do
        begin
          //统计奖金记录
          Close;
          Params.ParamValues['YEARMONTH']:=yearmonth;
          Params.ParamValues['PERSON']:=person;
          Params.ParamValues['TYPE']:='0';
          Open;
          First;
          while not Eof do
          begin
            bonus:=bonus+FieldValues['MONEY'];
            Next;
          end;
          //统计福利记录
          Close;
          Params.ParamValues['TYPE']:='1';
          Open;
          First;
          while not Eof do
          begin
            temp:=FieldValues['MONEY'];
            add_total:=add_total+temp;
            add_detail:=add_detail+FieldValues['NAME']+':'
                        +FloatToStrF(temp, ffFixed, 5, 1)+';';
            Next;
          end;
          //统计津贴记录
          Close;
          Params.ParamValues['TYPE']:='2';
          Open;
          First;
          while not Eof do
          begin
            temp:=FieldValues['MONEY'];
            add_total:=add_total+temp;
            add_detail:=add_detail+FieldValues['NAME']+':'
                        +FloatToStrF(temp, ffFixed, 5, 1)+';';
            Next;
          end;
           //统计扣发记录
          Close;
          Params.ParamValues['TYPE']:='3';
          Open;
          First;
          while not Eof do
          begin
            temp:=FieldValues['MONEY'];
            sub_total:=sub_total+temp;
            sub_detail:=sub_detail+FieldValues['NAME']+':'
                        +FloatToStrF(temp, ffFixed, 5, 1)+';';
            Next;
          end;
          Close;
        end;
        total:=basic+bonus+add_total-sub_total;
        if total<0 then total:=0;
        //插入工资记录
        with T_add_salary do
        begin
          Close;
          Filter:='YEARMONTH='''+yearmonth+''' AND PERSON='''
                 +person+'''';
          Filtered:=True;
          Open;
          if RecordCount=0 then
          begin
            //获取计数
            with T_counter do
            begin
              Close;
              Filter:='ID=''Y''';
              Open;
              counter:=FieldValues['COUNTER_VALUE'];
              Inc(counter);
              Edit;
              FieldValues['COUNTER_VALUE']:=counter;
              Post;
              Close;
            end;
            AppendRecord([counter, yearmonth, person, basic, bonus,
                add_detail, add_total, sub_detail, sub_total, total]);
          end
          else
          begin
            Edit;
            FieldValues['BASIC']:=basic;
            FieldValues['BONUS']:=bonus;
            FieldValues['ADD_DETAIL']:=add_detail;
            FieldValues['ADD_TOTAL']:=add_total;
            FieldValues['SUB_DETAIL']:=sub_detail;
            FieldValues['SUB_TOTAL']:=sub_total;
            FieldValues['TOTAL']:=total;
            Post;
          end;
          Close;
        end;
        Inc(i);
        Gauge1.Progress:=(100*i) div n;
        Next;
      end;//下一个员工
    end;
  end;
end;

procedure TF_main.DBGrid1DblClick(Sender: TObject);
begin
  if DM_main.Q_person_list.Active then
    i_person_id.Text:=DM_main.Q_person_list['ID'];
end;

procedure TF_main.i_yearmonthChange(Sender: TObject);
begin
  try
    if DM_main.Database.Connected then
    begin
      F_report.PHeader.Caption:=i_yearmonth.Text+'月度工资报表';
      DM_main.Q_salary_list.Close;
      DM_main.Q_salary_list.Params.ParamValues['YEARMONTH']:=i_yearmonth.Text;
      DM_main.Q_salary_list.Open;
    end;
  except
    //
  end;
end;

end.

⌨️ 快捷键说明

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