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

📄 udepset.pas

📁 一个很好的员工档案管理系统源码 有无限制树
💻 PAS
字号:
unit uDepset;
                       
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,  StdCtrls, Mask, DBCtrls, Grids, DBGrids, DB, ADODB, DBGridEh,
  ComCtrls, ExtCtrls, Buttons, jpeg, uModalbase;

type
  TfrmDepset = class(TfrmModalBase)
    dsDep: TDataSource;
    aqDep: TADOQuery;
    btnAdd: TBitBtn;
    btnEdit: TBitBtn;
    btnDel: TBitBtn;
    btnExit: TBitBtn;
    Panel1: TPanel;
    lblDepset: TLabel;
    Panel2: TPanel;
    tvDept: TTreeView;
    Label2: TLabel;
    deDept: TDBEdit;
    Label3: TLabel;
    dcbPDept: TDBComboBox;
    Label4: TLabel;
    dmDes: TDBMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnEditClick(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnDelClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure tvDeptChange(Sender: TObject; Node: TTreeNode);
  private
    { Private declarations }
    procedure LoadTree;
    procedure FindTree(const ID: Integer);
    procedure FillDept; overload;
    procedure FillDept(ALevel: Integer); overload;
    procedure SetState(IsView: Boolean);
    procedure UpdateData;
    function GetStaffCount(ADeptNode: TTreeNode): Integer;
    procedure dsDepDataChange(Sender: TObject; Field: TField);
    procedure OnGetDeptText(Sender: TField; var Text: String; DisplayText: Boolean);
    procedure OnSetDeptText(Sender: TField; const Text: String);
  public
    { Public declarations }
  end;

var
  frmDepset: TfrmDepset;

implementation

uses uData, uGlobal, uStainfo;

var
  slDepta, slDeptb: TStrings;
  oId: Integer;

{$R *.dfm}

procedure TfrmDepset.LoadTree;
  procedure RecurTree(ANode: TTreeNode; ID: string);
  var
    aqDeptc: TADOQuery;
    i: Integer;
    pNode: TTreeNode;
    pId: string;
  begin
    aqDeptc := TADOQuery.Create(Self);
    DM.OpenQuery(aqDeptc, 'select id, dep from dept where pid=' + ID);
    if aqDeptc.Eof then Exit;
    for i := 0 to aqDeptc.RecordCount - 1 do
    begin
      pId := aqDeptc.FieldByName('id').AsString;
      pNode := tvDept.Items.AddChildObject(ANode, aqDeptc.FieldByName('dep').AsString, PInteger(aqDeptc.FieldByName('id').AsInteger));
      RecurTree(pNode, pId);
      aqDeptc.Next;
    end;
    aqDeptc.Free;
  end;
  
var
  aqDeptp: TADOQuery;
  oNode, pNode: TTreeNode;
  i: Integer;
  pId: string;
begin
  tvDept.Items.BeginUpdate;
  tvDept.Items.Clear;
  oNode := tvDept.Items.AddFirst(nil, '公司机构');
  aqDeptp := TADOQuery.Create(Self);
  DM.OpenQuery(aqDeptp, 'select id, dep from dept where pid=0');
  if aqDeptp.Eof then Exit;
  for i := 0 to aqDeptp.RecordCount - 1 do
  begin
    pId := aqDeptp.FieldByName('id').AsString;
    pNode := tvDept.Items.AddChildObject(oNode, aqDeptp.FieldByName('dep').AsString, PInteger(aqDeptp.FieldByName('id').AsInteger));
    RecurTree(pNode, pId);
    aqDeptp.Next;
  end;
  aqDeptp.Free;

  tvDept.Items.EndUpdate;
  if tvDept.Items.Count > 0 then
  begin
    tvDept.Items.GetFirstNode.Expand(false);
    tvDept.Items[0].Selected := true;
  end;
end;

procedure TfrmDepset.FindTree(const ID: Integer);
var
  i: Integer;
begin
  if ID = 0 then Exit;
  for i := 0 to tvDept.Items.Count - 1 do
    if Integer(tvDept.Items[i].Data) = ID then
    begin
      tvDept.Selected := tvDept.Items[i];
      Exit;
    end;
end;

procedure TfrmDepset.FillDept;
var
  aqFillDept: TADOQuery;
begin
  aqFillDept := TADOQuery.Create(Self);
  DM.OpenQuery(aqFillDept, 'select * from dept');
  slDepta.Clear;
  slDeptb.Clear;
  while not aqFillDept.Eof do
  begin
    dcbPDept.Items.Append(aqFillDept.FieldByName('dep').AsString);
    slDepta.Append(aqFillDept.FieldByName('id').AsString + '=' + aqFillDept.FieldByName('dep').AsString);
    slDeptb.Append(aqFillDept.FieldByName('dep').AsString + '=' + aqFillDept.FieldByName('id').AsString);
    aqFillDept.Next;
  end;
  dcbPDept.Items.Insert(0, '公司机构');
  dcbPDept.ItemIndex := 0;
  aqFillDept.Free;
end;

procedure TfrmDepset.FillDept(ALevel: Integer);
var
  i: Integer;
begin
  dcbPDept.Items.Clear;
  for i := 0 to tvDept.Items.Count - 1 do
    if (tvDept.Items[i].Level <= ALevel) and (tvDept.Items[i].Text <> tvDept.Selected.Text) then
      dcbPDept.Items.Append(tvDept.Items[i].Text);
end;

procedure TfrmDepset.FormCreate(Sender: TObject);
begin
  inherited;
  Log.Write('进入部门设置模块');
  DM.OpenQuery(aqDep, 'select * from dept');
  LoadTree;
  slDepta := TStringList.Create;
  slDeptb := TStringList.Create;
  FillDept;
  dsDep.OnDataChange := dsDepDataChange;
  SetState(True);
  aqDep.FieldByName('pid').OnGetText := OnGetDeptText;
  aqDep.FieldByName('pid').OnSetText := OnSetDeptText;
end;

procedure TfrmDepset.FormDestroy(Sender: TObject);
begin
  inherited;
  slDeptb.Free;
  slDepta.Free;
end;

procedure TfrmDepset.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(frmStaInfo) then
  begin
    frmStainfo.LoadTree(frmStaInfo.tvPer);
    frmStainfo.LoadTree(frmStaInfo.tvPerv);
    frmStainfo.fraStaDetail.FillData;
  end;
end;

procedure TfrmDepset.SetState(IsView: Boolean);
var
  i: Integer;
  sColor: TColor;
begin
  tvDept.Enabled := IsView;
  for i := 0 to ControlCount - 1 do
    if Controls[i] is TDBEdit then
      TDBEdit(Controls[i]).ReadOnly := IsView
    else if Controls[i] is TDBComBoBox then
      TDBComBoBox(Controls[i]).ReadOnly := IsView
    else if Controls[i] is TDBMemo then
      TDBMemo(Controls[i]).ReadOnly := IsView;

  if IsView then
  begin
    sColor := ViewColor;
    btnadd.Caption := '添 加';
    btnEdit.Caption := '修 改';
    btnDel.Visible := True;
  end
  else
  begin
    sColor := clWindow;
    deDept.SetFocus;
    if aqDep.State = dsInsert then
    begin
      btnadd.Caption := '提 交';
      dcbPDept.Text := tvDept.Selected.Text;
    end
    else btnadd.Caption := '确 定';
    btnEdit.Caption := '取 消';
    btnDel.Visible := False;
  end;
  for i := 0 to ControlCount - 1 do
    if Controls[i] is TDBEdit then
      TDBEdit(Controls[i]).Color := sColor
    else if Controls[i] is TDBComBoBox then
      TDBComBoBox(Controls[i]).Color := sColor
    else if Controls[i] is TDBMemo then
      TDBMemo(Controls[i]).Color := sColor;
end;

procedure TfrmDepset.UpdateData;
var
  aqExists: TADOQuery;
begin
  if deDept.Text <> '' then
  begin
    if aqDep.State = dsInsert then
    begin
      aqExists := TADOQuery.Create(Self);
      aqExists.Clone(aqDep, ltReadOnly);
      if aqExists.Locate('dep', Trim(deDept.Text), []) then
      begin
        MessageBox(Handle, '此部门已存在!', '提示', mb_IconInformation + mb_Ok);
        deDept.SetFocus;
        Abort;
      end;
      OnSetDeptText(aqDep.FieldByName('pid'), dcbPDept.Text);
      aqExists.Free;
    end;
    aqDep.UpdateBatch();
    FillDept;
    SetState(True);
  end
  else
  begin
    MessageBox(Handle, '请输入部门名!', '提示', mb_IconInformation + mb_Ok);
    deDept.SetFocus;
    Abort;
  end;
  LoadTree;
  aqDep.Requery();
end;

procedure TfrmDepset.tvDeptChange(Sender: TObject; Node: TTreeNode);
var
  id: Integer;
begin
  if Node.Data <> nil then
    id := Integer(Node.Data)
  else id := 0;
  FillDept(Node.Level);
  aqDep.Locate('id', IntToStr(id), []);
end;

procedure TfrmDepset.btnAddClick(Sender: TObject);
begin
  if btnadd.Caption = '添 加' then
  begin
    oId := Integer(tvDept.Selected.Data);
    aqDep.Append;
    SetState(False);
  end
  else
  begin
    if aqDep.State = dsInsert then
      Log.Write('添加部门[' + aqDep.FieldByName('dep').AsString + ']')
    else
      Log.Write('更新部门[' + aqDep.FieldByName('dep').AsString + ']');

    UpdateData;
    FindTree(oId);
    oId := 0;
  end;
end;

procedure TfrmDepset.btnEditClick(Sender: TObject);
begin
  if btnEdit.Caption = '修 改' then
  begin
    oId := Integer(tvDept.Selected.Data);
    aqDep.Edit;
    SetState(False);
  end
  else
  begin
    aqdep.CancelBatch();
    SetState(True);
    if oId <> 0 then oId := 0;
  end;
end;

function TfrmDepset.GetStaffCount(ADeptNode: TTreeNode): Integer;
var
  aqStaCount: TADOQuery;
begin
  aqStaCount := TADOQuery.Create(Self);
  DM.OpenQuery(aqStaCount, 'select count(*) as scount from stainfo where depid=' + IntToStr(Integer(ADeptNode.Data)));
  Result := aqStaCount.FieldByName('scount').AsInteger;
  aqStaCount.Free;
end;

procedure TfrmDepset.btnDelClick(Sender: TObject);
var
  s: string;
begin
  if tvDept.Selected.Data <> nil then
  begin
    if tvDept.Selected.HasChildren then
      MessageBox(Handle, '不能删除有下级单位的部门!', '提示', mb_Ok + mb_IconInformation)
    else
    begin
      if GetStaffCount(tvDept.Selected) > 0 then
        s := '此部门下有[' + IntToStr(GetStaffCount(tvDept.Selected)) + ']条员工档案信息,它们将同时被删除,确定吗?'
      else s := '确定要删除此部门吗?';
      if MessageBox(Handle, PAnsiChar(s), '提示', mb_YesNo + mb_IconQuestion) = idYes then
      begin
        Log.Write('删除部门[' + aqDep.FieldByName('dep').AsString + ']');
        aqDep.Delete;
        aqDep.UpdateBatch();
        tvDept.Selected.Delete;
      end;
    end;
  end
  else MessageBox(Handle, '不能删除公司机构!', '提示', mb_Ok + mb_IconInformation);
end;

procedure TfrmDepset.btnCloseClick(Sender: TObject);
begin
  Close();
end;

procedure TfrmDepset.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if aqDep.State in [dsInsert, dsEdit] then
  begin
    if MessageBox(Handle, '还有信息没有保存,确定要退出吗?', '提示', mb_IconQuestion + mb_YesNo) = idYes then
    begin
      aqDep.CancelBatch();
      CanClose := True;
    end
    else CanClose := False;
  end
  else CanClose := True;
end;

procedure TfrmDepset.dsDepDataChange(Sender: TObject; Field: TField);
begin
  if not (aqDep.State in [dsInsert, dsEdit]) then
    btnEdit.Enabled := aqDep.RecordCount <> 0
  else btnEdit.Enabled := True;
  btnDel.Enabled := aqDep.RecordCount <> 0;
end;

procedure TfrmDepset.OnGetDeptText(Sender: TField; var Text: String;
  DisplayText: Boolean);
begin
  if Sender.AsInteger = 0 then Text := '公司机构'
  else Text := slDepta.Values[Sender.AsString];
end;

procedure TfrmDepset.OnSetDeptText(Sender: TField; const Text: String);
begin
  if Text = '公司机构' then Sender.AsInteger := 0
  else Sender.AsString := slDeptb.Values[Text];
end;

end.

⌨️ 快捷键说明

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