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

📄 viewdbworklogfrm.pas

📁 医药连锁经营管理系统源码
💻 PAS
字号:
unit ViewDBWorkLogFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, VirtualTrees, ExtCtrls, Grids, DBGridEh, DbUtilsEh, EhLibCDS, xEhLibCtl, RzSplit,
  RzButton, StdCtrls, RzCmboBx, Mask, RzEdit, RzPanel, ComCtrls, RzDTP,
  RzRadChk, ActnList, ImgList, DB, DBClient, MConnect, SConnect, ckDBClient,
  xBaseFrm, IMainFrm, SelectEmpFrm, RzBtnEdt, ceGlobal;

type
  PWorkLogData = ^TWorkLogData;
  TWorkLogData = record
    WorkDate:   TDateTime;
    UserID:     WideString;
    UserName:   WideString;
    WorkType:   String[1];
    WorkTable:  WideString;
    TableDescribe: WideString;
    KeyFields:     WideString;
    KeyFieldValues:WideString;
    WorkRecNo:     Integer;
    Remark:      wideString;
  end;

  TFmViewDBWorkLog = class(TxBaseForm)
    plTop: TRzPanel;
    RzBitBtn1: TRzBitBtn;
    plClient: TRzPanel;
    plDetail: TRzSizePanel;
    Label5: TLabel;
    xDBGridEh1: TxDBGridEh;
    Panel1: TPanel;
    vtWorkLog: TVirtualStringTree;
    ImageList1: TImageList;
    ActionList1: TActionList;
    ActExit: TAction;
    ActFirst: TAction;
    ActPrior: TAction;
    ActNext: TAction;
    ActLast: TAction;
    ActRefersh: TAction;
    ActQuery: TAction;
    plCtrl: TRzPanel;
    RzBitBtn2: TRzBitBtn;
    RzBitBtn3: TRzBitBtn;
    RzBitBtn4: TRzBitBtn;
    RzBitBtn5: TRzBitBtn;
    RzBitBtn6: TRzBitBtn;
    BtnMoreRec: TRzBitBtn;
    ActMore: TAction;
    ActViewDetail: TAction;
    RzGroupBox1: TRzGroupBox;
    cbWorkType: TRzComboBox;
    cbWorkTable: TRzComboBox;
    edKeyValues: TRzEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label7: TLabel;
    DTCtrl1: TRzDateTimePicker;
    DTCtrl2: TRzDateTimePicker;
    Label8: TLabel;
    BtnViewDetail: TRzBitBtn;
    Label9: TLabel;
    cdsWorkLog: TckClientDataSet;
    DataSource1: TDataSource;
    cdsWorkDetail: TckClientDataSet;
    edGetRecCount: TRzNumericEdit;
    ckAutoViewDetail: TRzCheckBox;
    Label6: TLabel;
    cdsLogObjects: TckClientDataSet;
    edUserID: TRzButtonEdit;
    procedure plCtrlResize(Sender: TObject);
    procedure ActExitExecute(Sender: TObject);
    procedure ActQueryExecute(Sender: TObject);
    procedure ActFirstExecute(Sender: TObject);
    procedure ActPriorExecute(Sender: TObject);
    procedure ActNextExecute(Sender: TObject);
    procedure ActLastExecute(Sender: TObject);
    procedure ActMoreExecute(Sender: TObject);
    procedure ActViewDetailExecute(Sender: TObject);
    procedure vtWorkLogGetNodeDataSize(Sender: TBaseVirtualTree;
      var NodeDataSize: Integer);
    procedure vtWorkLogGetText(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: WideString);
    procedure vtWorkLogBeforeItemErase(Sender: TBaseVirtualTree;
      TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect;
      var ItemColor: TColor; var EraseAction: TItemEraseAction);
    procedure vtWorkLogExpanding(Sender: TBaseVirtualTree;
      Node: PVirtualNode; var Allowed: Boolean);
    procedure vtWorkLogChange(Sender: TBaseVirtualTree;
      Node: PVirtualNode);
    procedure vtWorkLogDblClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure edUserIDButtonClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    IFmMain: IMainForm;
    LastRecNo, CurrRecNo: Integer;
    sqWhere: String;
    procedure BuildNodeByDataSet(DataSet: TDataSet; pNode: PVirtualNode);
    procedure AssignNodeData(Data: PWorklogData; DataSet: TDataSet);
    procedure ViewDetail;
    function SeparateTableName(S: string): string;
  protected
    SvrSysManage: TDispatchConnection;
  public
    { Public declarations }
  end;

const
  cWorkTypes = 'IUDAR';
  cTypeDescr: Array[0..5] of string=('', '新增记录', '修改数据', '删除记录', '审核过帐', '取消过帐');
  sqFields = ' FDate, UserID, UserName, WorkType, TableDescribe, KeyFields, KeyFieldValues, Remark, WorkRecNo, '
            +'case when exists(select 1 from DBWorkLog l where l.hostrecno=w.workrecno) then 1 else 0 end HasChild '
            +'from DBWorkLog W ';

var
  FmViewDBWorkLog: TFmViewDBWorkLog;

implementation

{$R *.dfm}

procedure TFmViewDBWorkLog.FormCreate(Sender: TObject);
var iMaxDropWidth,w: integer;
begin
  DTCtrl1.Date := Date;
  DTCtrl2.Date := Date;
  IFmMain := Application.MainForm as IMainForm;
  SvrSysManage := IFmMain.GetConnection(Handle, '', 'ckSysManager.ModuleSetting');
  cdsWorklog.RemoteServer := SvrSysManage;
  cdsWorkDetail.RemoteServer := SvrSysManage;
  with cdsLogObjects do begin
    RemoteServer := SvrSysManage;
    Open;
    iMaxDropWidth :=0;
    cbWorkTable.Add('');
    while not Eof do begin
      if Eof then break;
      with cbWorkTable do begin
        Items.Add(Fields[0].AsString);
        w := Canvas.TextWidth(Fields[0].AsString);
        if w >iMaxDropWidth then iMaxDropWidth := w;
      end;
      Next;
    end;
    if iMaxDropWidth > 0 then cbWorkTable.DropDownWidth := iMaxDropWidth+20;
    Close;
  end;
end;

procedure TFmViewDBWorkLog.FormShow(Sender: TObject);
begin
//  plTop.Color := TitlePanelColor ;
  Color := FormBackColor ;
  vtWorkLog.Header.Background := GridFixColor;
  xDBGridEh1.FixedColor := GridFixColor;
end;

procedure TFmViewDBWorkLog.vtWorkLogBeforeItemErase(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  ItemRect: TRect; var ItemColor: TColor;
  var EraseAction: TItemEraseAction);
begin
//同一级的各节点间用颜色背景分隔
  if Odd(Node.Index) then begin
    ItemColor := $FFEEEE;
    EraseAction := eaColor;
  end;
end;

procedure TFmViewDBWorkLog.plCtrlResize(Sender: TObject);
var i, j: Integer;
begin
  j := BtnMoreRec.Left+BtnMoreRec.Width+4;
  i := plCtrl.Width-BtnViewDetail.Width-4;
  if i<j then i:=j;
  BtnViewDetail.Left := i;
end;

procedure TFmViewDBWorkLog.ActExitExecute(Sender: TObject);
begin
  Close;
end;

procedure TFmViewDBWorkLog.ActQueryExecute(Sender: TObject);
var sw: String;
begin
 	sw := ' WHERE FDATE>='''+FormatDateTime('yyyy-mm-dd', DTCtrl1.Date)
  		 +''' AND FDATE<'''+FormatDateTime('yyyy-mm-dd', DTCtrl2.Date+1)+'''';
  if edUserID.Text<>'' then
    sw := sw+' AND UserID='''+edUserID.Text+'''';
  if cbWorkType.ItemIndex>0 then
    sw := sw+' AND WorkType='''+cWorkTypes[cbWorkType.ItemIndex]+'''';
  if cbWorkTable.Text <> '' then
    sw := sw+' AND WorkTable=''' + SeparateTableName(cbWorkTable.Text)+'''';
  if edKeyValues.Text<>'' then
    sw := sw+' AND KeyFieldValues='''+edKeyValues.Text+'''';
  sqWhere := sw;
  LastRecNo := 0;
  ActMore.Enabled := true;
  ActMore.Execute;
end;

procedure TFmViewDBWorkLog.ActFirstExecute(Sender: TObject);
begin
  if vtWorkLog.RootNodeCount=0 then Exit;
  vtWorklog.Selected[vtWorklog.GetFirst] := true;
end;

procedure TFmViewDBWorkLog.ActPriorExecute(Sender: TObject);
var Node: PVirtualNode;
begin
  Node := vtWorklog.GetFirstSelected;
  if Node=nil then Exit;
  Node := vtWorklog.GetPreviousSibling(Node);
  if Node<>nil then
    vtWorklog.Selected[Node] := true;
end;

procedure TFmViewDBWorkLog.ActNextExecute(Sender: TObject);
var Node: PVirtualNode;
begin
  Node := vtWorklog.GetFirstSelected;
  if Node=nil then Exit;
  Node := vtWorklog.GetNextSibling(Node);
  if Node<>nil then
    vtWorklog.Selected[Node] := true;
end;

procedure TFmViewDBWorkLog.ActLastExecute(Sender: TObject);
begin
  if vtWorkLog.RootNodeCount=0 then Exit;
  vtWorklog.Selected[vtWorklog.GetLast] := true;
end;

procedure TFmViewDBWorkLog.ActMoreExecute(Sender: TObject);
var str: String;
    i, j: Integer;
begin
  str := ' AND HostRecNo=0';
  if LastRecNo=0 then
    vtWorkLog.Clear
  else
    str := str+' AND WorkRecNo>'+IntToStr(LastRecNo);
  i := edGetRecCount.IntValue;
  str := 'select top '+IntToStr(i)+sqFields+sqWhere+str+' order by WorkRecNo';
  with cdsWorkLog do begin
    Close;
    CommandText := str;
    Open;
    j := RecordCount;
    if j>0 then begin
      Last;
      LastRecNo := FieldByName('WorkRecNo').AsInteger;
    end;
    ActMore.Enabled := j=i;
  end;
  BuildNodeByDataSet(cdsWorkLog, vtWorklog.RootNode);
end;

procedure TFmViewDBWorkLog.ActViewDetailExecute(Sender: TObject);
begin
  if plDetail.HotSpotClosed then
    plDetail.RestoreHotSpot
  else
    plDetail.CloseHotSpot;
end;

procedure TFmViewDBWorkLog.vtWorkLogGetNodeDataSize(
  Sender: TBaseVirtualTree; var NodeDataSize: Integer);
begin
  NodeDataSize := SizeOf(TWorkLogData);
end;

procedure TFmViewDBWorkLog.BuildNodeByDataSet(DataSet: TDataSet;
  pNode: PVirtualNode);
var vNode: PVirtualNode;
    NodeData: PWorklogData;
begin
  with DataSet do begin
    First;
    While not Eof do begin
      vNode := vtWorklog.AddChild(pNode);
      NodeData := vtWorklog.GetNodeData(vNode);
      AssignNodeData(NodeData, DataSet);
      vtWorkLog.HasChildren[vNode] := DataSet.FieldByName('HasChild').Value;
      Next;
    end;
  end;
end;

procedure TFmViewDBWorkLog.AssignNodeData(Data: PWorklogData;
  DataSet: TDataSet);
begin
  with DataSet do begin
    Data^.WorkDate  := FieldByName('FDate').Value;
    Data^.UserID    := FieldByName('UserID').Value;
    Data^.UserName  := FieldByName('UserName').Value;
    Data^.WorkType  := FieldByName('WorkType').AsString;
    Data^.WorkTable := '';//FieldByName('WorkTable').Value;
    Data^.TableDescribe := FieldByName('TableDescribe').Value;
    Data^.KeyFields     := FieldByName('KeyFields').Value;
    Data^.KeyFieldValues:= FieldByName('KeyFieldValues').Value;
    Data^.WorkRecNo     := FieldByName('WorkRecNo').Value;
    Data^.Remark        := FieldByName('Remark').AsString;
  end;
end;

procedure TFmViewDBWorkLog.vtWorkLogGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var NodeData: PWorklogData;
    i: integer;
begin
  CellText := '';
  NodeData := Sender.GetNodeData(Node);
  case Column of
    0://FDate
      if Node.Parent=vtWorklog.RootNode then
        CellText := DateTimeToStr(NodeData^.WorkDate);
    1: //UserID
      CellText := NodeData^.UserID;
    2: begin//WorkType
      i := AnsiPos(NodeData^.WorkType, cWorktypes);
      if i>0 then
        CellText := cTypeDescr[i]
      else
        CellText := '';
    end;
    3: //WorkTable
      CellText := NodeData^.TableDescribe;
    4: //KeyFields
      CellText := NodeData^.KeyFields;
    5: //KeyFieldValues
      CellText := NodeData^.KeyFieldValues;
    6: //remark
      CellText := NodeData^.Remark;
  end;
end;

procedure TFmViewDBWorkLog.vtWorkLogExpanding(Sender: TBaseVirtualTree;
  Node: PVirtualNode; var Allowed: Boolean);
var NodeData: PWorklogData;
    str: String;
begin
  if Sender.ChildCount[Node]>0 then Exit;
  NodeData := Sender.GetNodeData(Node);
  str := 'select '+sqFields+' where HostRecNo='+IntToStr(NodeData^.WorkRecNo);
  with cdsWorkLog do begin
    Close;
    CommandText := str;
    Open;
    Allowed := not IsEmpty;
  end;
  if Allowed then
    BuildNodeByDataSet(cdsWorkLog, Node);
end;

procedure TFmViewDBWorkLog.vtWorkLogChange(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var NodeData: PWorklogData;
begin
  if Node=nil then Exit;
  NodeData := Sender.GetNodeData(Node);
  CurrRecNo:= NodeData.WorkRecNo;
  if ckAutoViewDetail.Checked then
    ViewDetail;
end;

procedure TFmViewDBWorkLog.vtWorkLogDblClick(Sender: TObject);
begin
  if vtWorkLog.GetFirstSelected<>nil then
    ViewDetail;
end;

procedure TFmViewDBWorkLog.ViewDetail;
begin
  with cdsWorkDetail do begin
    if Tag=CurrRecNo then Exit;
    close;
    CommandText := 'select FieldName, OldValue, NewValue from DBWorkDetail where WorkRecNo='+IntToStr(CurrRecNo);
    Open;
    Tag := CurrRecNo;
  end;
end;

procedure TFmViewDBWorkLog.edUserIDButtonClick(Sender: TObject);
var EmpNo: string;
begin
  if SelectEmp(EmpNo) then edUserID.Text := EmpNo;
end;

function TFmViewDBWorkLog.SeparateTableName(S: string): string;
begin
  Result := S;
  if Pos('(',Result)>0 then Delete(Result,Pos('(',Result),Length(S));
end;

initialization
  RegisterClass(TFmViewDBWorkLog);

finalization
  UnRegisterClass(TFmViewDBWorkLog);

end.

⌨️ 快捷键说明

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