📄 untdptemp.pas
字号:
unit UntDptEmp;
{
初始作者:吴功兴
编写日期:2004/1/6----2004/3/10
单元主要功能:完成部门和人员的增加、删除、修改
}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ToolWin, StdCtrls, ExtCtrls, ImgList, Db, DBTables, Menus,
UntframeEmp, DBCtrls, Buttons, UntframeDpt;
type
TfrmDptEmp = class(TForm)
pnlTree: TPanel;
TreeView1: TTreeView;
imgPhoto1: TImageList;
tblDpt: TTable;
pmRightClick: TPopupMenu;
tblEmp: TTable;
qryDptEmp: TQuery;
mifresh: TMenuItem;
pnlEmp: TPanel;
bbtnAddDpt: TBitBtn;
bbtnAddEmp: TBitBtn;
bbntDelete: TBitBtn;
bbtnmodify: TBitBtn;
bbtnOk: TBitBtn;
bbtnCancel: TBitBtn;
bbtnExit: TBitBtn;
Panel1: TPanel;
FrameEmp: TFrameEmp;
FrameDpt: TFrameDpt;
procedure btnCancelClick(Sender: TObject);
//procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure TreeView1DblClick(Sender: TObject);
procedure btnAddDptClick(Sender: TObject);
procedure btnOkClick(Sender: TObject);
procedure btnAddEmpClick(Sender: TObject);
procedure bntDeleteClick(Sender: TObject);
procedure btnmodifyClick(Sender: TObject);
procedure TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure miAddDptClick(Sender: TObject);
procedure miAddEmpClick(Sender: TObject);
procedure mideleteClick(Sender: TObject);
procedure miModifyClick(Sender: TObject);
procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure mifreshClick(Sender: TObject);
procedure edtdptmanageDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure TreeView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FrameDptdedtDptNameChange(Sender: TObject);
procedure FrameDptedtupDptmanegerDragDrop(Sender, Source: TObject; X,
Y: Integer);
procedure FrameDptedtupDptmanegerDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
procedure bbtnAddDptClick(Sender: TObject);
procedure bbtnAddEmpClick(Sender: TObject);
procedure bbntDeleteClick(Sender: TObject);
procedure bbtnmodifyClick(Sender: TObject);
procedure bbtnOkClick(Sender: TObject);
procedure bbtnCancelClick(Sender: TObject);
procedure bbtnExitClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure TreeView1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
procedure FrameEmpdedtNameChange(Sender: TObject);
// procedure Button1Click(Sender: TObject);
private
sEmpDptcode: string;
sUserName: string;
iMaxEmpid, iSelectnodeparent: integer; //记录员工的最大流水号
iUpDptmaneger: integer;
sDptManeger: string;
nodeSelect: Ttreenode;
sNodeSelectName: string;
//根据库中的部门信息和员工信息建立对应的树
procedure Createtreeview;
//选中一个结点显示该结点的信息
procedure Showselectdp(node: Ttreenode);
//清除控件的显示
procedure ClearCtrl(ParentControls: array of TWincontrol);
//设置编辑框的状态 ,CtrlEnable为true可编辑,否则读取
procedure SetCtrlStatus(ParentControls: array of TWincontrol; CtrlEnable: boolean);
//删除结点函数
procedure DeleteNode;
//把一个结点移到另一个结点下
procedure Oldnodetonewnode(oldnode, node: TTreeNode);
//判断员工的代码是否重复
function CheckEmpcode(Empcode: string): boolean;
//根据sql把字段值加入列表框中
procedure FillComboBox(qryname: TQuery; sSql: string;
cmBox: TCustomComboBox; default_value: integer);
procedure InitAllComboBox;
procedure Displayinfo(datasetname: tdataset; fieldyname: array of string; Controlname: array of TWincontrol);
function EmpIDToEmpName(sEmpID:string):string;
function EmpNametoEmpID(sEmpName:string):string;
{ Private declarations }
public
bAdd, bEdit: boolean; //增加、修改状态的判定
{ Public declarations }
end;
var
frmDptEmp: TfrmDptEmp;
implementation
uses dmpub, UntPub;
{$R *.DFM}
procedure TfrmDptEmp.btnCancelClick(Sender: TObject);
begin
frameEmp.tblEmp.Cancel;
end;
//根据库中的部门信息和员工信息建立对应的树
procedure TfrmDptEmp.createtreeview;
var
node, newnode: TTreeNode;
begin
//建立一个根结点,并且从表中选取可做根结点的记录,最后改变结点的属性
Node := TreeView1.Items.GetFirstNode;
//根据上级部门的值确定最上面的一级部门
tblDpt.Filter := 'upDptID=0';
tblDpt.Filtered := true;
try
tblDpt.Active := true;
tblDpt.first;
while not tblDpt.Eof do
begin
NewNode := TreeView1.Items.AddChild(Node, tblDpt.FieldByname('DptName').asstring);
//利用StateIndex保存部门的DptId
NewNode.StateIndex := tblDpt.FieldByName('DptId').Asinteger;
NewNode.SelectedIndex := 10;
NewNode.ImageIndex := 10;
tblDpt.Next;
end;
except
on E: Exception do
begin
ErrorHandler(E, 'TfrmDptEmp.createtreeview');
Application.MessageBox('打开部门数据表出错!', Pchar(_sAppTitle), MB_ICONERROR + MB_OK);
end;
end;
//下面逐个加入下一级部门或员工的结点
Node := TreeView1.Items.GetFirstNode;
while (node <> nil) do //and (node.SelectedIndex=0) do
begin
if (node.SelectedIndex mod 10) = 0 then
begin
tblDpt.Filter := 'upDptID=' + intToStr(Node.StateIndex);
tblDpt.Filtered := true;
try
tblDpt.Active := true;
tblDpt.first;
while not tblDpt.eof do
begin
NewNode := TreeView1.Items.AddChild(Node, tblDpt.FieldByname('DptName').asstring);
// 根据选择部门结点的stateindex来查找该结点所对应的部门表中的记录
NewNode.StateIndex := tblDpt.FieldByName('DptId').Asinteger;
NewNode.SelectedIndex := 0;
NewNode.ImageIndex := 1;
tblDpt.Next;
end;
tblEmp.Filter := 'DptID=' + intToStr(Node.StateIndex);
tblEmp.Filtered := true;
tblEmp.Active := true;
tblEmp.first;
while not tblEmp.eof do
begin
NewNode := TreeView1.Items.AddChild(Node, tblEmp.FieldByname('Name').asstring);
// 根据选择员工结点的stateindex来查找该结点所对应的员工表中的记录
NewNode.StateIndex := tblEmp.FieldByname('USER_ID').asinteger;
NewNode.SelectedIndex := 3;
NewNode.ImageIndex := 2;
tblEmp.Next;
end;
except
on E: Exception do
begin
ErrorHandler(E, 'TfrmDptEmp.createtreeview');
Application.MessageBox('打开部门或人员数据表出错!', Pchar(_sAppTitle), MB_ICONERROR + MB_OK);
exit;
end;
end;
end;
// if node.StateIndex=6 then showmessage('ddd');
if Node.HasChildren then //有子树则进入子树 得到子树的第一个孩子结点
begin
Node := Node.getFirstChild;
end
else
begin
Node := Node.GetNext;
//否则取下一个节点
if (node = nil) or (Node.level = 0) then //返回到0级时结束
break;
end;
end;
Node := TreeView1.Items.GetFirstNode;
if node <> nil then
node.expanded := true;
end;
//显示选中结点的部门或员工信息
procedure TfrmDptEmp.showselectdp(node: Ttreenode);
var
iDptID: integer;
begin
//根据选择的结点是部门还是员工显示该部门或该员工的信息
if node.ImageIndex <> 2 then
begin
frameDpt.Visible := true;
frameEmp.Visible := false;
frameEmp.tblEmp.Filtered := false;
ClearCtrl([frameDpt]);
if node.Level = 0 then
iDptID := 0
else
iDptID := node.Parent.StateIndex;
fillComboBox(qryDptEmp, 'select DISTINCT name from OA where Stiuation=''单位领导''',
frameDpt.cbxupDptmaneger, -1);
// fillComboBox(qryDptEmp, 'select DISTINCT name from OA where Stiuation=''部门主管''and DptID=' + inttostr(node.StateIndex),
// frameDpt.cbxDptmaneger, -1);
try
qryDptEmp.Active:=false;
qryDptEmp.SQL.Clear;
qryDptEmp.SQL.Add('select DISTINCT name from OA where Stiuation=''部门主管''and DptID=' + inttostr(node.StateIndex));
qryDptEmp.Active:=true;
except
on E: Exception do
begin
ErrorHandler(E, 'TfrmDptEmp.createtreeview');
Application.MessageBox('打开部门或人员数据表出错!', Pchar(_sAppTitle), MB_ICONERROR + MB_OK);
end;
end;
frameDpt.stcDptManeger.Caption:='';
if not qryDptEmp.IsEmpty then
begin
qryDptEmp.First;
while not qryDptEmp.Eof do
begin
if frameDpt.stcDptManeger.Caption<>'' then
frameDpt.stcDptManeger.Caption:=frameDpt.stcDptManeger.Caption+','+ qryDptEmp.fieldbyname('name').asstring
else
frameDpt.stcDptManeger.Caption:=qryDptEmp.fieldbyname('name').asstring;
qryDptEmp.Next;
end;
end;
//根据选择部门结点来查找该结点所对应的部门表中的记录
if frameDpt.tblDpt.Locate('DptID', node.StateIndex, []) then
begin
frameDpt.stcDepcode.Caption := frameDpt.tblDpt.FieldByname('DptId').asstring;
if node.Level <> 0 then
frameDpt.stcupDptName.Caption := node.Parent.Text
else
frameDpt.stcupDptName.Caption := '无上级部门';
iUpDptmaneger := 0;
//sDptmaneger := '';
iUpDptmaneger := frameDpt.tblDpt.FieldByname('upDptmaneger').asinteger;
// sDptmaneger := frameDpt.tblDpt.FieldByname('Dptmaneger').asstring;
if (frameEmp.tblEmp.Locate('USER_ID', iUpDptmaneger, [])) and (iUpDptmaneger >= 0) then
frameDpt.cbxupDptmaneger.text := frameEmp.tblEmp.fieldbyname('name').asstring;
// if frameEmp.tblEmp.Locate('EmpID', iDptmaneger, []) then
// if sDptmaneger<>'' then
// frameDpt.edtDptmaneger.text := EmpIDToEmpName(sDptmaneger)
// else
// frameDpt.edtDptmaneger.text := '';
end;
end
else
// 根据选择员工结点来查找该结点所对应的员工表中的记录
begin
frameDpt.Visible := false;
frameEmp.Visible := true;
tblEmp.Filtered := false;
ClearCtrl([frameEmp]);
frameEmp.tblEmp.Active:=false;
frameEmp.tblEmp.Active:=true;
if FrameEmp.tblEmp.Locate('USER_ID', node.StateIndex, []) then
begin
frameEmp.stcEmpDpt.Caption := node.Parent.Text;
end;
end;
end;
procedure TfrmDptEmp.FormShow(Sender: TObject);
begin
{try
frameDpt.tbldpt.Active := true;
FrameEmp.tblEmp.Active := true;
tblDpt.Active := true;
tblEmp.Active := true;
except
on E: Exception do
begin
ErrorHandler(E, 'TfrmDptEmp.createtreeview');
Application.MessageBox('打开部门或人员数据表出错!', Pchar(_sAppTitle), MB_ICONERROR + MB_OK);
end;
end;
createtreeview;
bAdd := false;
bEdit := false;
ClearCtrl([frameDpt, frameEmp]);
bbtnOk.Enabled := false;
bbtnCancel.Enabled := false;
SetCtrlStatus([frameDpt, FrameEmp], false);
InitAllComboBox; }
end;
procedure TfrmDptEmp.TreeView1DblClick(Sender: TObject);
begin
end;
//清除该容器控件内控件的显示
procedure TfrmDptEmp.ClearCtrl(ParentControls: array of TWincontrol);
var
i, j, k: integer;
parent: TWinControl;
begin
for k := 0 to length(parentControls) - 1 do
begin
parent := parentControls[k];
for i := 0 to parent.ControlCount - 1 do
begin
//TEdit
if parent.controls[i] is TEdit then
TEdit(parent.controls[i]).text := ''
//TStaTicText
else if parent.controls[i] is TStaticText then
TStaticText(parent.controls[i]).Caption := ''
else if parent.controls[i] is TDBEdit then
TDBEdit(parent.controls[i]).text := ''
else if parent.controls[i] is TDBComboBox then
TDBComboBox(parent.controls[i]).text := ''
else if parent.controls[i] is TComboBox then
TComboBox(parent.controls[i]).text := ''
else if parent.controls[i] is TDBMemo then
TDBMemo(parent.controls[i]).text := ''
else if parent.controls[i] is TStaticText then
TStaticText(parent.controls[i]).caption := '';
end;
end;
end;
//该过程使系统处于增加部门或员工状态
procedure TfrmDptEmp.btnAddDptClick(Sender: TObject);
var
node, newnode: TTreeNode;
iMaxDptid: integer;
begin
bAdd := true;
frameDpt.Visible := true;
frameEmp.Visible := false;
node := TreeView1.Selected; //得到选择结点的父结点
newnode := TreeView1.Items.AddChild(Node, ''); //在该父结点上增加新的结点
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -