📄 u_main.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 + -