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

📄 u_attendance.pas

📁 工作计划管理
💻 PAS
字号:
unit u_attendance;

interface

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

type
  TF_attendance = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    DBGrid1: TDBGrid;
    GroupBox1: TGroupBox;
    i_io_time: TMaskEdit;
    Label1: TLabel;
    i_in_out: TRadioGroup;
    i_io_person_id: TMaskEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    B_add_all: TButton;
    B_add_depart: TButton;
    B_add_person: TButton;
    i_io_person_name: TEdit;
    GroupBox3: TGroupBox;
    Label10: TLabel;
    Label12: TLabel;
    i_leave_start_time: TMaskEdit;
    i_leave_person_id: TMaskEdit;
    B_leave_add: TButton;
    i_leave_person_name: TEdit;
    DBGrid3: TDBGrid;
    i_leave_end_time: TMaskEdit;
    Label11: TLabel;
    i_leave_reason: TMemo;
    Label13: TLabel;
    GroupBox5: TGroupBox;
    Label19: TLabel;
    Label20: TLabel;
    i_overtime_date: TMaskEdit;
    i_overtime_person_id: TMaskEdit;
    B_overtime_add: TButton;
    i_overtime_person_name: TEdit;
    DBGrid2: TDBGrid;
    Label21: TLabel;
    i_overtime_hour: TSpinEdit;
    Label22: TLabel;
    Label28: TLabel;
    GroupBox7: TGroupBox;
    Label29: TLabel;
    Label30: TLabel;
    Label31: TLabel;
    Label32: TLabel;
    i_errand_start_time: TMaskEdit;
    i_errand_person_id: TMaskEdit;
    B_errand_add: TButton;
    i_errand_person_name: TEdit;
    i_errand_end_time: TMaskEdit;
    i_errand_description: TMemo;
    DBGrid4: TDBGrid;
    GroupBox9: TGroupBox;
    Label38: TLabel;
    Label40: TLabel;
    Label42: TLabel;
    Seek_start_time: TMaskEdit;
    Seek_end_time: TMaskEdit;
    Seek_person_id: TMaskEdit;
    Seek_by_person: TCheckBox;
    Seek_by_time: TCheckBox;
    Seek_person_name: TEdit;
    Label5: TLabel;
    B_seek_io: TButton;
    Label6: TLabel;
    B_seek_overtime: TButton;
    Label7: TLabel;
    B_seek_leave: TButton;
    Label8: TLabel;
    B_seek_errand: TButton;
    i_io_depart_id: TMaskEdit;
    i_io_depart_name: TEdit;
    Gauge1: TGauge;
    Label9: TLabel;
    B_delete_attend: TButton;
    B_delete_overtime: TButton;
    B_delete_leave: TButton;
    B_delete_errand: TButton;
    procedure Seek_person_idChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure i_io_depart_idChange(Sender: TObject);
    procedure i_io_person_idChange(Sender: TObject);
    procedure io_add(Person_id:String);
    procedure B_add_personClick(Sender: TObject);
    procedure TabSheet1Show(Sender: TObject);
    procedure B_add_departClick(Sender: TObject);
    procedure B_add_allClick(Sender: TObject);
    procedure B_seek_ioClick(Sender: TObject);
    procedure i_overtime_person_idChange(Sender: TObject);
    procedure B_delete_attendClick(Sender: TObject);
    procedure TabSheet3Show(Sender: TObject);
    procedure B_overtime_addClick(Sender: TObject);
    procedure B_delete_overtimeClick(Sender: TObject);
    procedure B_seek_overtimeClick(Sender: TObject);
    procedure TabSheet2Show(Sender: TObject);
    procedure i_leave_person_idChange(Sender: TObject);
    procedure B_leave_addClick(Sender: TObject);
    procedure B_delete_leaveClick(Sender: TObject);
    procedure B_seek_leaveClick(Sender: TObject);
    procedure TabSheet4Show(Sender: TObject);
    procedure i_errand_person_idChange(Sender: TObject);
    procedure B_errand_addClick(Sender: TObject);
    procedure B_delete_errandClick(Sender: TObject);
    procedure B_seek_errandClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  F_attendance: TF_attendance;

implementation

uses u_datamodule;

{$R *.DFM}

procedure TF_attendance.Seek_person_idChange(Sender: TObject);
begin
  with DM_main do
  begin
    T_person.Filter:='ID='''+Seek_person_id.Text+'''';
    T_person.Filtered:=True;
    T_person.Open;
    if T_person.RecordCount=1 then
      Seek_person_name.Text:=T_person['NAME']
    else
      Seek_person_name.Text:='';
    T_person.Close;
  end;
end;

procedure TF_attendance.FormCreate(Sender: TObject);
begin
  Seek_start_time.Text:=DateToStr(now-30);
  Seek_end_time.Text:=DateToStr(now);
end;

procedure TF_attendance.i_io_depart_idChange(Sender: TObject);
begin
  with DM_main do
  begin
    T_depart.Filter:='ID='''+i_io_depart_id.Text+'''';
    T_depart.Filtered:=True;
    T_depart.Open;
    if T_depart.RecordCount=1 then
      i_io_depart_name.Text:=T_depart['NAME']
    else
      i_io_depart_name.Text:='';
    T_depart.Close;
  end;
end;

procedure TF_attendance.i_io_person_idChange(Sender: TObject);
begin
  with DM_main do
  begin
    T_person.Filter:='ID='''+i_io_person_id.Text+'''';
    T_person.Filtered:=True;
    T_person.Open;
    if T_person.RecordCount=1 then
    begin
      i_io_person_name.Text:=T_person['NAME'];
      i_io_depart_id.Text:=T_person['DEPARTMENT'];
      i_io_depart_idChange(nil);
    end
    else
      i_io_person_name.Text:='';
    T_person.Close;
  end;
end;

procedure TF_attendance.io_add(Person_id:String);
var
  counter:Integer;
  in_out:String;
  io_time:TDateTime;
begin
  With DM_main do
  begin
    //记录编号
    T_counter.Filter:='ID=''A''';
    T_counter.Filtered:=True;
    T_counter.Open;
    counter:=T_counter['COUNTER_VALUE'];
    Inc(counter);
    T_counter.Edit;
    T_counter['COUNTER_VALUE']:=counter;
    T_counter.Post;
    T_counter.Close;
    //添加记录
    if i_in_out.ItemIndex=0 then
      in_out:='O'
    else
      in_out:='I';
    io_time:=StrToDateTime(i_io_time.Text);
    T_attendance.Filtered:=False;
    T_attendance.Open;
    T_attendance.AppendRecord([counter,Person_id,in_out,io_time]);
  end;
end;

procedure TF_attendance.B_add_personClick(Sender: TObject);
begin
  if length(i_io_person_name.Text)>0 then
  begin
    io_add(i_io_person_id.Text);
  end;
end;

procedure TF_attendance.TabSheet1Show(Sender: TObject);
begin
  i_io_time.Text:=DateTimeToStr(now);
  DM_main.T_attendance.Open;
end;

procedure TF_attendance.B_add_departClick(Sender: TObject);
var
  i,n:integer;
begin
  if length(i_io_depart_name.Text)>0 then
  begin
    with DM_main do
    begin
      T_person.Filter:='DEPARTMENT='''+i_io_depart_id.Text+''' AND STATE=''T''';
      T_person.Filtered:=True;
      T_person.Open;
      n:=T_person.RecordCount;
      i:=0;
      Gauge1.Progress:=0;
      T_person.First;
      while not T_person.Eof do
      begin
        io_add(T_person['ID']);
        T_person.Next;
        Inc(i);
        Gauge1.Progress:=(100*i) div n;
      end;
      T_person.Close;
    end;
  end;
end;

procedure TF_attendance.B_add_allClick(Sender: TObject);
var
  i,n:integer;
begin
  with DM_main do
  begin
    T_person.Filter:='STATE=''T''';
    T_person.filtered:=True;
    T_person.Open;
    n:=T_person.RecordCount;
    i:=0;
    Gauge1.Progress:=0;
    T_person.First;
    while not T_person.Eof do
    begin
      io_add(T_person['ID']);
      T_person.Next;
      Inc(i);
      Gauge1.Progress:=(100*i) div n;
    end;
    T_person.Close;
  end;
end;

procedure TF_attendance.B_seek_ioClick(Sender: TObject);
var
  FilterStr:String;
begin
  With DM_main.T_attendance do
  begin
    Close;
    FilterStr:='';
    if Seek_by_person.Checked then
      FilterStr:='PERSON='''+Seek_person_id.Text+'''';
    if Seek_by_time.Checked then
    begin
      if length(FilterStr)>0 then
        FilterStr:=FilterStr+' AND ';
      FilterStr:=FilterStr+'TIME>'+Seek_start_time.Text;
      FilterStr:=FilterStr+' AND TIME<'+Seek_end_time.Text;
    end;
    if length(FilterStr)>0 then
    begin
      Filter:=FilterStr;
      Filtered:=True;
    end
    else
      Filtered:=False;
    Open;
  end;
end;

procedure TF_attendance.i_overtime_person_idChange(Sender: TObject);
begin
  with DM_main do
  begin
    T_person.Filter:='ID='''+i_overtime_person_id.Text+'''';
    T_person.Filtered:=True;
    T_person.Open;
    if T_person.RecordCount=1 then
      i_overtime_person_name.Text:=T_person['NAME']
    else
      i_overtime_person_name.Text:='';
    T_person.Close;
  end;
end;

procedure TF_attendance.B_delete_attendClick(Sender: TObject);
begin
  DM_main.T_attendance.Delete;
end;

procedure TF_attendance.TabSheet3Show(Sender: TObject);
begin
  i_overtime_date.Text:=DateToStr(now);
  DM_main.T_overtime.Open;
end;

procedure TF_attendance.B_overtime_addClick(Sender: TObject);
var
  counter:integer;
  overtime_date:TDate;
begin
  with DM_main do
  begin
    if length(i_overtime_person_name.Text)>0 then
    begin
      //记录编号
      T_counter.Filter:='ID=''O''';
      T_counter.Filtered:=True;
      T_counter.Open;
      counter:=T_counter['COUNTER_VALUE'];
      Inc(counter);
      T_counter.Edit;
      T_counter['COUNTER_VALUE']:=counter;
      T_counter.Post;
      T_counter.Close;
      //添加记录
      overtime_date:=StrToDateTime(i_overtime_date.Text);
      T_overtime.Filtered:=False;
      T_overtime.Open;
      T_overtime.AppendRecord([counter,i_overtime_person_id.Text,i_overtime_hour.Value,overtime_date]);
    end;
  end;
end;

procedure TF_attendance.B_delete_overtimeClick(Sender: TObject);
begin
  DM_main.T_overtime.Delete;
end;

procedure TF_attendance.B_seek_overtimeClick(Sender: TObject);
var
  FilterStr:String;
begin
  With DM_main.T_overtime do
  begin
    Close;
    FilterStr:='';
    if Seek_by_person.Checked then
      FilterStr:='PERSON='''+Seek_person_id.Text+'''';
    if Seek_by_time.Checked then
    begin
      if length(FilterStr)>0 then
        FilterStr:=FilterStr+' AND ';
      FilterStr:=FilterStr+'WORK_DATE>='+Seek_start_time.Text;
      FilterStr:=FilterStr+' AND WORK_DATE<'+Seek_end_time.Text;
    end;
    if length(FilterStr)>0 then
    begin
      Filter:=FilterStr;
      Filtered:=True;
    end
    else
      Filtered:=False;
    Open;
  end;
end;

procedure TF_attendance.TabSheet2Show(Sender: TObject);
begin
  i_leave_start_time.Text:=DateTimeToStr(now);
  i_leave_end_time.Text:=DateTimeToStr(now);
  DM_main.T_leave.Open;
end;

procedure TF_attendance.i_leave_person_idChange(Sender: TObject);
begin
  with DM_main do
  begin
    T_person.Filter:='ID='''+i_leave_person_id.Text+'''';
    T_person.Filtered:=True;
    T_person.Open;
    if T_person.RecordCount=1 then
      i_leave_person_name.Text:=T_person['NAME']
    else
      i_leave_person_name.Text:='';
    T_person.Close;
  end;
end;

procedure TF_attendance.B_leave_addClick(Sender: TObject);
var
  counter:integer;
  leave_start_time,leave_end_time:TDateTime;
begin
  with DM_main do
  begin
    if length(i_leave_person_name.Text)>0 then
    begin
      //记录编号
      T_counter.Filter:='ID=''L''';
      T_counter.Filtered:=True;
      T_counter.Open;
      counter:=T_counter['COUNTER_VALUE'];
      Inc(counter);
      T_counter.Edit;
      T_counter['COUNTER_VALUE']:=counter;
      T_counter.Post;
      T_counter.Close;
      //添加记录
      leave_start_time:=StrToDateTime(i_leave_start_time.Text);
      leave_end_time:=StrToDateTime(i_leave_end_time.Text);
      T_leave.Filtered:=False;
      T_leave.Open;
      T_leave.AppendRecord([counter,i_leave_person_id.Text,leave_start_time,leave_end_time,i_leave_reason.Text]);
    end;
  end;
end;

procedure TF_attendance.B_delete_leaveClick(Sender: TObject);
begin
  DM_main.T_leave.Delete;
end;

procedure TF_attendance.B_seek_leaveClick(Sender: TObject);
var
  FilterStr:String;
begin
  With DM_main.T_leave do
  begin
    Close;
    FilterStr:='';
    if Seek_by_person.Checked then
      FilterStr:='PERSON='''+Seek_person_id.Text+'''';
    if Seek_by_time.Checked then
    begin
      if length(FilterStr)>0 then
        FilterStr:=FilterStr+' AND ';
      FilterStr:=FilterStr+'END_TIME>='+Seek_start_time.Text;
      FilterStr:=FilterStr+' AND START_TIME<'+Seek_end_time.Text;
    end;
    if length(FilterStr)>0 then
    begin
      Filter:=FilterStr;
      Filtered:=True;
    end
    else
      Filtered:=False;
    Open;
  end;
end;

procedure TF_attendance.TabSheet4Show(Sender: TObject);
begin
  i_errand_start_time.Text:=DateTimeToStr(now);
  i_errand_end_time.Text:=DateTimeToStr(now);
  DM_main.T_errand.Open;
end;

procedure TF_attendance.i_errand_person_idChange(Sender: TObject);
begin
  with DM_main do
  begin
    T_person.Filter:='ID='''+i_errand_person_id.Text+'''';
    T_person.Filtered:=True;
    T_person.Open;
    if T_person.RecordCount=1 then
      i_errand_person_name.Text:=T_person['NAME']
    else
      i_errand_person_name.Text:='';
    T_person.Close;
  end;
end;

procedure TF_attendance.B_errand_addClick(Sender: TObject);
var
  counter:integer;
  errand_start_time,errand_end_time:TDateTime;
begin
  with DM_main do
  begin
    if length(i_errand_person_name.Text)>0 then
    begin
      //记录编号
      T_counter.Filter:='ID=''E''';
      T_counter.Filtered:=True;
      T_counter.Open;
      counter:=T_counter['COUNTER_VALUE'];
      Inc(counter);
      T_counter.Edit;
      T_counter['COUNTER_VALUE']:=counter;
      T_counter.Post;
      T_counter.Close;
      //添加记录
      errand_start_time:=StrToDateTime(i_errand_start_time.Text);
      errand_end_time:=StrToDateTime(i_errand_end_time.Text);
      T_errand.Filtered:=False;
      T_errand.Open;
      T_errand.AppendRecord([counter,i_errand_person_id.Text,errand_start_time,errand_end_time,i_errand_description.Text]);
    end;
  end;
end;

procedure TF_attendance.B_delete_errandClick(Sender: TObject);
begin
  DM_main.T_errand.Delete;
end;

procedure TF_attendance.B_seek_errandClick(Sender: TObject);
var
  FilterStr:String;
begin
  With DM_main.T_errand do
  begin
    Close;
    FilterStr:='';
    if Seek_by_person.Checked then
      FilterStr:='PERSON='''+Seek_person_id.Text+'''';
    if Seek_by_time.Checked then
    begin
      if length(FilterStr)>0 then
        FilterStr:=FilterStr+' AND ';
      FilterStr:=FilterStr+'END_TIME>='+Seek_start_time.Text;
      FilterStr:=FilterStr+' AND START_TIME<'+Seek_end_time.Text;
    end;
    if length(FilterStr)>0 then
    begin
      Filter:=FilterStr;
      Filtered:=True;
    end
    else
      Filtered:=False;
    Open;
  end;
end;

end.

⌨️ 快捷键说明

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