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

📄 untdptemp.pas

📁 是分布式粮库程序,是采用Delphi实现的
💻 PAS
📖 第 1 页 / 共 4 页
字号:
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 + -