D10szGerun/A01基础公司管理/U_SalaryInPut.pas
2026-09-12 17:23:29 +08:00

275 lines
7.3 KiB
ObjectPascal

unit U_SalaryInPut;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, ToolWin, cxStyles, cxCustomData,
cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DB, cxDBData, ADODB,
cxGridLevel, cxClasses, cxControls, cxGridCustomView, cxGridCustomTableView,
cxGridTableView, cxGridDBTableView, cxGrid, DBClient, cxTextEdit, DateUtils,
cxLookAndFeels, cxLookAndFeelPainters, cxNavigator, dxSkinsCore, dxSkinWXI,
dxDateRanges, dxScrollbarAnnotations;
type
TfrmSalaryInPut = class(TForm)
ToolBar1: TToolBar;
TBSave: TToolButton;
TBClose: TToolButton;
Panel1: TPanel;
Label1: TLabel;
DayCombo: TComboBox;
Label2: TLabel;
YMCaption: TLabel;
Label3: TLabel;
HJCaption: TLabel;
cxGrid1: TcxGrid;
Tv1: TcxGridDBTableView;
v1EEName: TcxGridDBColumn;
v1DVal: TcxGridDBColumn;
v1Editer: TcxGridDBColumn;
v1Edittime: TcxGridDBColumn;
cxGrid1Level1: TcxGridLevel;
DataSource1: TDataSource;
Order_Main: TClientDataSet;
ADOQueryCmd: TADOQuery;
ADOQueryTemp: TADOQuery;
procedure FormShow(Sender: TObject);
procedure TBSaveClick(Sender: TObject);
procedure TBCloseClick(Sender: TObject);
procedure DayComboChange(Sender: TObject);
procedure Order_MainAfterPost(DataSet: TDataSet);
private
FDay: Integer; //当前录入日(1-31)
FDays: Integer; //当月天数
FSRDate: TDateTime; //当前录入日期
FInitFlag: Boolean;
procedure InitDayCombo();
procedure InitData();
procedure CalcHJ();
function SaveData(): Boolean;
{ Private declarations }
public
PState: Integer; //0:新增; 1:修改
FYMonth: string; //年月(yyyymm)
FInitDay: Integer;
{ Public declarations }
end;
var
frmSalaryInPut: TfrmSalaryInPut;
implementation
uses
U_DataLink, U_RTFun;
const
CNDayOfWeek: array[1..7] of string = ('日', '一', '二', '三', '四', '五', '六');
{$R *.dfm}
procedure TfrmSalaryInPut.FormShow(Sender: TObject);
begin
FInitFlag := True;
YMCaption.Caption := Copy(FYMonth, 1, 4) + '年' + Copy(FYMonth, 5, 2) + '月';
if PState = 1 then
Caption := '工资修改'
else
Caption := '工资录入';
InitDayCombo();
InitData();
CalcHJ();
FInitFlag := False;
end;
procedure TfrmSalaryInPut.InitDayCombo();
var
i, FY, FM, FDay: Integer;
begin
FY := StrToInt(Copy(FYMonth, 1, 4));
FM := StrToInt(Copy(FYMonth, 5, 2));
FDays := DaysInMonth(EncodeDate(FY, FM, 1));
DayCombo.Items.Clear;
for i := 1 to FDays do
DayCombo.Items.Add(Format('%d日(%s)', [i, CNDayOfWeek[DayOfWeek(EncodeDate(FY, FM, i))]]));
//默认当天
if (FInitDay >= 1) and (FInitDay <= FDays) then
FDay := FInitDay
else
begin
FDay := DayOf(SGetServerDate(ADOQueryTemp));
if FDay > FDays then
FDay := 1;
end;
DayCombo.ItemIndex := FDay - 1;
end;
procedure TfrmSalaryInPut.InitData();
begin
if DayCombo.ItemIndex < 0 then
Exit;
FDay := DayCombo.ItemIndex + 1;
FSRDate := EncodeDate(StrToInt(Copy(FYMonth, 1, 4)), StrToInt(Copy(FYMonth, 5, 2)), FDay);
with ADOQueryTemp do
begin
Close;
sql.Clear;
sql.Add(' select E.EEID,E.EECode,E.EEName ');
sql.Add(' ,S.GZS as DVal,S.SALID as SALID,S.Editer as Editer,S.Edittime as Edittime ');
sql.Add(' from SY_Employee E ');
sql.Add(' left join SY_Salary S on S.EEID=E.EEID and S.GZRQ=' + quotedstr(FormatDateTime('yyyy-mm-dd', FSRDate)));
sql.Add(' where isnull(E.EEType,''正式'')<>''离职'' or S.EEID is not null ');
sql.Add(' order by E.EECode ');
Open;
end;
SCreateCDS(ADOQueryTemp, Order_Main);
SInitCDSData(ADOQueryTemp, Order_Main);
TDateTimeField(Order_Main.FieldByName('Edittime')).DisplayFormat := 'mm-dd hh:nn';
Order_Main.MergeChangeLog;
end;
procedure TfrmSalaryInPut.DayComboChange(Sender: TObject);
begin
if FInitFlag then
Exit;
if DayCombo.ItemIndex < 0 then
Exit;
if Order_Main.ChangeCount > 0 then
if Application.MessageBox('切换日期将放弃未保存的修改,继续吗?', '提示', 32 + 4) <> IDYES then
begin
FInitFlag := True;
DayCombo.ItemIndex := FDay - 1;
FInitFlag := False;
Exit;
end;
InitData();
CalcHJ();
end;
procedure TfrmSalaryInPut.Order_MainAfterPost(DataSet: TDataSet);
begin
CalcHJ();
end;
procedure TfrmSalaryInPut.CalcHJ();
var
FVal, FHJ: Double;
FBm: TBookmark;
begin
FHJ := 0;
with Order_Main do
begin
DisableControls;
FBm := GetBookmark;
First;
while not Eof do
begin
if TryStrToFloat(Trim(fieldbyname('DVal').AsString), FVal) then
FHJ := FHJ + FVal;
Next;
end;
if FBm <> nil then
begin
GotoBookmark(FBm);
FreeBookmark(FBm);
end;
EnableControls;
end;
HJCaption.Caption := FormatFloat('0.##', FHJ);
end;
function TfrmSalaryInPut.SaveData(): Boolean;
var
mval: string;
begin
Result := False;
if Order_Main.IsEmpty then
Exit;
if Order_Main.State in [dsEdit, dsInsert] then
Order_Main.Post;
try
ADOQueryCmd.Connection.BeginTrans;
with Order_Main do
begin
DisableControls;
First;
while not Eof do
begin
mval := Trim(fieldbyname('DVal').AsString);
if Trim(fieldbyname('SALID').AsString) = '' then
begin
//当天无记录且录了值 -> 新增一条
if mval <> '' then
with ADOQueryCmd do
begin
Close;
sql.Clear;
sql.Add('insert into SY_Salary(GZRQ,EEID,GZS,Filler,Filltime) values(');
sql.Add(quotedstr(FormatDateTime('yyyy-mm-dd', FSRDate)) + ',' + quotedstr(Trim(Order_Main.fieldbyname('EEID').AsString)));
sql.Add(',' + quotedstr(mval) + ',' + quotedstr(Trim(DName)) + ',getdate())');
ExecSQL;
end;
end
else
begin
// if mval = '' then
// begin
// //清空 -> 删除当天记录
// with ADOQueryCmd do
// begin
// Close;
// sql.Clear;
// sql.Add('delete SY_Salary where SALID=' + Trim(Order_Main.fieldbyname('SALID').AsString));
// ExecSQL;
// end;
// end
// else
// begin
//修改工时 -> 更新并记录修改人
with ADOQueryCmd do
begin
Close;
sql.Clear;
sql.Add('update SY_Salary set GZS=' + quotedstr(mval));
sql.Add(',Editer=' + quotedstr(Trim(DName)) + ',Edittime=getdate()');
sql.Add(' where SALID=' + Trim(Order_Main.fieldbyname('SALID').AsString));
ExecSQL;
end;
// end;
end;
Next;
end;
First;
EnableControls;
end;
ADOQueryCmd.Connection.CommitTrans;
Order_Main.MergeChangeLog;
Result := True;
except
ADOQueryCmd.Connection.RollbackTrans;
Order_Main.EnableControls;
Application.MessageBox('保存失败!', '提示', 0);
end;
end;
procedure TfrmSalaryInPut.TBSaveClick(Sender: TObject);
begin
ToolBar1.SetFocus;
if SaveData() then
begin
Application.MessageBox('保存成功!', '提示', 0);
ModalResult := 1;
end;
end;
procedure TfrmSalaryInPut.TBCloseClick(Sender: TObject);
begin
if Order_Main.ChangeCount > 0 then
if Application.MessageBox('有未保存的修改,确定关闭吗?', '提示', 32 + 4) <> IDYES then
Exit;
Close;
end;
end.