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.