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

📄 ustainfo.pas

📁 人事档案管理
💻 PAS
📖 第 1 页 / 共 2 页
字号:
end;

procedure TfrmStainfo.GetStaffs(const ADeptNode: TTreeNode; IsRoot: Boolean);
var
  sSql, sDepIds: string;
  
  procedure GetDepIds(const ANode: TTreeNode);
  var
    i: Integer;
  begin
    sDepIds := sDepIds + ',' + IntToStr(Integer(ANode.Data));
    for i := 0 to ANode.Count - 1 do
      if (ANode.Item[i].getFirstChild <> nil) or not ANode.Item[i].HasChildren then
        GetDepIds(ANode.Item[i]);
  end;

begin
  sSql := 'select stainfo.id, stano, sname, sex, birth, tel, dept.dep, [level], ' +
    'provi from stainfo left join dept on stainfo.depid=dept.id';
  if not IsRoot then
  begin
    GetDepIds(ADeptNode);
    sDepIds := Copy(sDepIds, Pos(',', sDepIds) + 1, Length(sDepIds) - Pos(',', sDepIds));
    sSql := sSql + ' where depid in('+sDepIds+') ' + sWhr;
  end;
  dmPer.OpenQuery(aqStaInfo, sSql);
  if aqStaInfo.RecordCount = 0 then Exit;
  dgStaInfo.DataSource := dsStaInfo;
end;

procedure TfrmStainfo.tvPerChange(Sender: TObject; Node: TTreeNode);
var
  sDep: string;
begin
  if Node.IsFirstNode then
  begin
    gbPer.Caption := Node.Text;
    if rbDisplay.Checked then GetStaffs(Node, True);
  end
  else if (not Node.IsFirstNode) and (Node.ImageIndex <> 2) then
  begin
    if rbDisplay.Checked then GetStaffs(Node, False);
    sDep := Node.Text;
    while Node.Parent.Level <> 0 do
    begin
      Node := Node.Parent;
      sDep := Node.Text + '-->' + sDep;
    end;
    gbPer.Caption := '部门:' + sDep;
  end
  else if Node.ImageIndex = 2 then
  begin
    fraStaDetail.ID := Integer(PNodeData(Node.Data)^.Id);
    sDep := Node.Text;
    while Node.Parent.Level <> 0 do
    begin
      Node := Node.Parent;
      sDep := Node.Text + '-->' + sDep;
    end;
    gbPer.Caption := '员工:' + sDep;
  end;
end;

procedure TfrmStainfo.tvPerClick(Sender: TObject);
begin
  if fraStaDetail.pcSta.ActivePageIndex = 5 then fraStaDetail.tsStainfo.Show;
end;

//******************************
procedure TfrmStainfo.tvPerMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
  function GetStaInfo(AId, ADept: string): string;
  var
    aqGetInfo: TADOQuery;
    sInfo: string;
  begin
    if AId = '' then Exit;
    aqGetInfo := TADOQuery.Create(nil);
    dmPer.OpenQuery(aqGetInfo, 'select sname, stano, sex, dutystate from stainfo where id=' + AId);
    if not aqGetInfo.Eof then
    begin
      sInfo := sInfo + '姓名:' + aqGetInfo.Fields[0].AsString + #13;
      sInfo := sInfo + '工号:' + aqGetInfo.Fields[1].AsString + #13;
      sInfo := sInfo + '性别:' + aqGetInfo.Fields[2].AsString + #13;
      sInfo := sInfo + '部门:' + ADept + #13;
      sInfo := sInfo + '状态:' + aqGetInfo.Fields[3].AsString;
    end;
    Result := sInfo;
    aqGetInfo.Free;
  end;
  
var
  tnSta: TTreeNode;
  sId: Integer;
begin
  tnSta := tvPer.GetNodeAt(X, Y);
  if (tnSta <> nil) and (tnSta.ImageIndex = 2) then
  begin
    if tnSta.Data = nil then Exit;
    sId := PNodeData(tnSta.Data)^.Id;
    tvPer.Hint := GetStaInfo(IntToStr(sId), tnSta.Parent.Text);

    if nIndex <> tnSta.AbsoluteIndex then
    begin
      nIndex := tnSta.AbsoluteIndex;
      Application.Activatehint(Point(X, Y));
    end;
  end
  else tvPer.Hint := '';
end;

procedure TfrmStainfo.GetBrithStaff(IsMonth: Boolean);
var
  aqBirth: TADOQuery;
begin
  aqBirth := TADOQuery.Create(Self);
  if IsMonth then
  begin
    dmPer.OpenQuery(aqBirth, 'select stano, sname from stainfo where datepart(''m'', birth) = '
      + QuotedStr(IntToStr(MonthOf(Date()))) + ' order by sname');
    meoBirth.Lines.Append('本月生日的员工['+ IntToStr(aqBirth.RecordCount) +']');
    if not aqBirth.Eof then
    begin
      meoBirth.Lines.Append('他们是:');
      while not aqBirth.Eof do
      begin
        meoBirth.Lines.Append(aqBirth.fieldByName('sname').AsString + '[' + aqBirth.fieldByName('stano').AsString + ']');
        aqBirth.Next;
      end;
    end;
  end
  else
  begin
    meoBirth.Lines.Append(#13);
    dmPer.OpenQuery(aqBirth, 'select stano, sname from stainfo where datepart(''m'', birth) = '
      + QuotedStr(IntToStr(MonthOf(Date()))) + ' and datepart(''d'', birth) = ' + QuotedStr(IntToStr(DayOf(Date()))) + ' order by sname');
    meoBirth.Lines.Append('今天生日的员工[' + IntToStr(aqBirth.RecordCount) + ']');
    if not aqBirth.Eof then
    begin
      meoBirth.Lines.Append('他们是:');
      while not aqBirth.Eof do
      begin
        meoBirth.Lines.Append(aqBirth.fieldByName('sname').AsString + '[' + aqBirth.fieldByName('stano').AsString + ']');
        aqBirth.Next;
      end;
    end;
  end;
  aqBirth.Free;
end;

procedure TfrmStainfo.rbDetailClick(Sender: TObject);
begin
  tvPer.BringToFront;
  if aqStaInfo.RecordCount <> 0 then FindStaffs(aqStaInfo.FieldByName('id').AsString);
  meoBirth.BringToFront;
  fraStaDetail.BringToFront;
end;

procedure TfrmStainfo.rbDisplayClick(Sender: TObject);
var
  i, iDepId: Integer;
begin
  tvPerv.BringToFront;
  meoBirth.BringToFront;
  iDepId := 0;
  if tvPer.Selected.Data <> nil then
  begin
    if tvPer.Selected.ImageIndex <> 2 then
      iDepID := Integer(tvPer.Selected.Data)
    else iDepID := Integer(tvPer.Selected.Parent.Data)
  end;
  for i := 0 to tvPerv.Items.Count - 1 do
    if (iDepId <> 0) and (Integer(tvPerv.Items[i].Data) = iDepId) then
    begin
      tvPerv.Items[i].Selected := True;
      tvPerv.OnChange(tvPerv, tvPerv.Items[i]);
      Break;
    end;
  dgStaInfo.BringToFront;
end;

procedure TfrmStainfo.FindStaffs(const AStaID: string);
var
  i: Integer;
begin
  if AStaID = '' then Exit;
  for i := 0 to tvPer.Items.Count - 1 do
    if (tvPer.Items[i].ImageIndex = 2) and (PNodeData(tvPer.Items[i].Data).Id = StrToInt(AStaID)) then
    begin
      tvPer.Items[i].Selected := True;
      Exit;
    end;
end;

procedure TfrmStainfo.dgStaInfoDblClick(Sender: TObject);
var
  sId: string;
begin
  sId := aqStaInfo.FieldByName('id').AsString;
  rbDetail.Checked := True;
  FindStaffs(sId);
  tvPerChange(tvPer, tvPer.Selected);
end;

{Acttion start here}
procedure TfrmStainfo.actEditExecute(Sender: TObject);
begin
  if rbDisplay.Checked then dgStaInfoDblClick(Sender);
  fraStaDetail.Edit;
  SetActState(asEdit);
end;

procedure TfrmStainfo.actAddExecute(Sender: TObject);
begin
  if tvPer.Items.Count = 1 then
  begin
    MessageBox(Handle, '请先添加部门!', '提示', mb_IconInformation + mb_Ok);
    Exit;
  end;

  if rbDisplay.Checked then rbDetail.Checked;
  fraStaDetail.Append;
  SetActState(asAppend);
end;

procedure TfrmStainfo.actOkExecute(Sender: TObject);
  procedure FindTree(AStaNo: string);
  var
    i: Integer;
  begin
    for i := 0 to tvPer.Items.Count - 1 do
    begin
      if (tvPer.Items[i].Data <> nil) and (tvPer.Items[i].ImageIndex = 2) then
        if PNodeData(tvPer.Items[i].Data)^.No = AStaNo then
        begin
          tvPer.Items[i].Selected := True;
          Break;
        end;
    end;
  end;

var
  StaNo: string;
begin
  StaNo := fraStaDetail.deStano.Text;
  fraStaDetail.UpdateData;
  SetActState(asView);
  if fraStaDetail.pcSta.ActivePageIndex = 0 then
  begin
    LoadTree(tvPer);
    FindTree(StaNo);
  end;
end;

procedure TfrmStainfo.actSearchExecute(Sender: TObject);
begin
  frmPer.actInquExecute(Sender);
end;

procedure TfrmStainfo.actPriorExecute(Sender: TObject);
begin
  if rbDetail.Checked then
  begin
    if tvPer.Selected.AbsoluteIndex > 0 then
    begin
      tvPer.Selected := tvPer.Selected.GetPrev;
      if (tvPer.Selected.Data <> nil) and (tvPer.Selected.ImageIndex = 2) then
        tvPer.SetFocus
      else actPriorExecute(Sender);
    end;
  end
  else if not aqStaInfo.Bof then aqStaInfo.Prior;
end;

procedure TfrmStainfo.actNextExecute(Sender: TObject);
begin
  if rbDetail.Checked then
  begin
    if tvPer.Selected.AbsoluteIndex < tvPer.Items.Count - 1 then
    begin
      tvPer.Selected := tvPer.Selected.GetNext;
      if (tvper.Selected.Data <> nil) and (tvPer.Selected.ImageIndex = 2) then
        tvPer.SetFocus
      else actNextExecute(Sender);
    end;
  end
  else if not aqStaInfo.Eof then aqStaInfo.Next;
end;

procedure TfrmStainfo.actDelExecute(Sender: TObject);
var
  i, Index: Integer;
begin
  Index := tvPer.Selected.AbsoluteIndex - 1;
  if rbDisplay.Checked then
  begin
    if MessageBox(handle, '真的要删除此员工记录么?', '提示', mb_IconQuestion + mb_YesNo) = idYes then
    begin
      Log.Write('删除员工记录[' + fraStaDetail.deName.Text + ']');
      aqStaInfo.Delete;
      LoadTree(tvPer);
    end;
  end
  else if fraStaDetail.pcSta.ActivePageIndex < 5 then
  begin
    if fraStaDetail.pcSta.ActivePageIndex = 0 then
    begin
      Log.Write('删除员工记录[' + fraStaDetail.deName.Text + ']');
      if fraStaDetail.Delete then
      begin
        LoadTree(tvPer);
        for i := 0 to tvPer.Items.Count - 1 do
          if tvPer.Items[i].AbsoluteIndex = Index then
            tvPer.Selected := tvPer.Items[i];
        if tvPer.Selected.ImageIndex <> 2 then actPriorExecute(Sender);
      end;
    end
    else fraStaDetail.Delete;
  end;
end;

procedure TfrmStainfo.actCancelExecute(Sender: TObject);
begin
  fraStaDetail.Cancel;
  tvPer.OnChange(tvPer, tvPer.Selected);
  SetActState(asView);
end;

procedure TfrmStainfo.actPrintExecute(Sender: TObject);
  function GetStaIDs: string;
  var
    sIds: string;

    function GetNodeIds(ANode: TTreeNode): string;
    var
      i: Integer;
    begin
      if (ANode.Data <> nil) and (ANode.ImageIndex = 2) then
        sIds := sIds + ', ' + IntToStr(PNodeData(ANode.Data)^.Id);
      for i := 0 to ANode.Count - 1 do
        if (ANode.Item[i].getFirstChild <> nil) or not ANode.Item[i].HasChildren then
          GetNodeIds(ANode.Item[i]);
      Result := sIds;
    end;  
  begin
    Result := '';
    sIds := '';
    if rbDetail.Checked then
      Result := GetNodeIds(tvPer.Selected)
    else
    begin
      aqStaInfo.First;
      while not aqStaInfo.Eof do
      begin
        Result := Result + ', ' + aqStaInfo.FieldByName('id').AsString;
        aqStaInfo.Next;
      end;
      aqStaInfo.First;
    end;
  end;
begin
  fraStaDetail.Print(GetStaIDs)
end;

procedure TfrmStainfo.actExitExecute(Sender: TObject);
begin
  Close();
end;

end.

⌨️ 快捷键说明

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