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