unit U_log; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ToolWin, ShlObj, cxShellCommon, cxControls, cxDropDownEdit, cxContainer, cxShellTreeView, cxShellListView, StdCtrls, BtnEdit, OleCtnrs, DB, ADODB,DBClient,cxGridDBTableView, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DBGrids, cxDBData, cxGridLevel, cxClasses, cxGridCustomView, StrUtils, Midas,cxMRUEdit, cxGridCustomTableView, cxGridTableView, cxTimeEdit, cxButtonEdit, cxTreeView, cxGrid, cxDBLookupComboBox, cxCalendar, cxCurrencyEdit, cxGridExportLink, cxMemo, cxTextEdit, RTComboBox, dxLayoutControl,RegularExpressions; function getCDSDataChangeLog(keyNo,SerialNoFieldName:string;TV_Edit: TcxGridDBTableView;ADOCmd:TADOQuery): string; function getMainDataChangeLog(dxLayoutControl:TdxLayoutControl;ADOQueryCmd:TADOQuery; mTag: Integer): String; function WriteChangeLog(FMainId,ModelStr,OperorStr:string;dxLayoutControl:TdxLayoutControl; mTag: Integer;ADO_Main:TADOQuery;SubIdFieldName,SerialNoFieldName:string;TV1: TcxGridDBTableView;ADO_Sub:TADOQuery; ADOQueryBaseCmd:TADOQuery): Boolean; //单表日志记录 function WriteOneTableChangeLog(keyNo,ModelStr,OperorStr:string;dxLayoutControl:TdxLayoutControl; mTag: Integer;ADO_Main:TADOQuery;ADOQueryBaseCmd:TADOQuery): Boolean; //通过日志字符串写日志 function WriteLog(keyNo,ModelStr,OperorStr:string;logStr:string;ADOQueryBaseCmd:TADOQuery): Boolean; implementation //////////////////////////////主明细表//////////////////////////////// //FMainId:主表主键; ModelStr:模块名称; OperorStr:操作员,父类 /// SubIdFieldName:子表主键 //SerialNoFieldName 子表序号 function WriteChangeLog(FMainId,ModelStr,OperorStr:string;dxLayoutControl:TdxLayoutControl; mTag: Integer;ADO_Main:TADOQuery;SubIdFieldName,SerialNoFieldName:string;TV1: TcxGridDBTableView;ADO_Sub:TADOQuery; ADOQueryBaseCmd:TADOQuery): Boolean; var TmpStr: string; mainlogStr,sublogstr:string; begin try Result := false; mainlogStr:=getMainDataChangeLog(dxLayoutControl,ADO_Main,mTag); sublogstr:=getCDSDataChangeLog(SubIdFieldName,SerialNoFieldName,TV1,ADO_Sub); TmpStr:= trim(mainlogStr) + trim(sublogstr) ; if TmpStr='' then begin result:=true; exit; end; with ADOQueryBaseCmd do begin close; sql.Clear; sql.Add(' insert into SY_SysLog(operor,opertime,Model,acction,opevent,result) values( '); sql.Add(' ' + quotedstr(Trim(OperorStr))); sql.Add(',getdate() '); sql.Add(',' + quotedstr(Trim(ModelStr))); sql.Add(',' + quotedstr(Trim('数据修改'))); sql.Add(',' + quotedstr(TmpStr)); sql.Add(',' + quotedstr(Trim('成功'))); sql.Add(')'); execsql; end; Result := True; except raise Exception.Create(PWideChar('保存数据修改日志时,发生错误!')); end; end; ////////////////////// //单表日志记录 //FMainId: function WriteOneTableChangeLog(keyNo,ModelStr,OperorStr:string;dxLayoutControl:TdxLayoutControl; mTag: Integer;ADO_Main:TADOQuery;ADOQueryBaseCmd:TADOQuery): Boolean; var TmpStr: string; begin try Result := false; TmpStr:=getMainDataChangeLog(dxLayoutControl,ADO_Main,mTag); if TmpStr='' then begin result:=true; exit; end; with ADOQueryBaseCmd do begin close; sql.Clear; sql.Add(' insert into SY_SysLog(operor,opertime,Model,acction,opevent,result) values( '); sql.Add(' ' + quotedstr(Trim(OperorStr))); sql.Add(',getdate() '); sql.Add(',' + quotedstr(Trim(ModelStr))); sql.Add(',' + quotedstr(Trim('数据修改'))); sql.Add(',' + quotedstr(TmpStr)); sql.Add(',' + quotedstr(keyNo)); sql.Add(')'); execsql; end; Result := True; except raise Exception.Create(PWideChar('保存数据修改日志时,发生错误!')); end; end; ////////////////////// //通过日志字符串写日志 function WriteLog(keyNo,ModelStr,OperorStr:string;logStr:string;ADOQueryBaseCmd:TADOQuery): Boolean; var TmpStr: string; begin try Result := false; if logStr='' then begin result:=true; exit; end; with ADOQueryBaseCmd do begin close; sql.Clear; sql.Add(' insert into SY_SysLog(operor,opertime,Model,acction,opevent,result) values( '); sql.Add(' ' + quotedstr(Trim(OperorStr))); sql.Add(',getdate() '); sql.Add(',' + quotedstr(Trim(ModelStr))); sql.Add(',' + quotedstr(Trim('数据修改'))); sql.Add(',' + quotedstr(logStr)); // sql.Add(',' + quotedstr(keyNo)); sql.Add(',' + quotedstr(keyNo)); sql.Add(')'); execsql; end; Result := True; except raise Exception.Create(PWideChar('保存数据修改日志时,发生错误!')); end; end; function getCDSDataChangeLog(keyNo,SerialNoFieldName:string;TV_Edit: TcxGridDBTableView;ADOCmd:TADOQuery): string; var i,k: integer; TmpLogStr: string; TmpField: TField; TmpColumn: TcxGridDBColumn; mLogStr:string; CDS_Edit: TClientDataset; begin mLogStr := ''; result:=''; CDS_Edit:= TV_Edit.DataController.DataSource.DataSet as TClientDataset; try if TV_Edit = nil then begin exit; end; if CDS_Edit = nil then begin exit; end; if TV_Edit.DataController.DataSource.DataSet <> CDS_Edit then begin exit; end; // LogEntry := Format('表[%s] 字段[%s] 从[%s] 改为[%s] 时间[%s] 用户[%s]', with ADOCmd do begin First; k:=1; while not eof do begin if not CDS_Edit.Locate(keyNo, FieldByName(keyNo).Value, []) then begin Continue; end; TmpLogStr := ''; for i := 0 to Fields.Count-1 do begin TmpField := CDS_Edit.FindField(Fields[i].FieldName); TmpColumn := TV_Edit.GetColumnByFieldName(Fields[i].FieldName); if (TmpField <> nil) and (TmpColumn <> nil) and (Trim(Fields[i].AsString) <> Trim(TmpField.AsString)) then begin TmpLogStr := TmpLogStr + '[' + TmpColumn.Caption + ':' + trim(Fields[i].AsString) + '→' + trim(TmpField.AsString) + ']'; end; end; if TmpLogStr <> '' then begin if (SerialNoFieldName<>'') and (Fields.FindField(SerialNoFieldName)<>nil) then mLogStr := mLogStr + '{' + '序号:' + trim(FieldByName(SerialNoFieldName).AsString) + '|' + trim(FieldByName(keyNo).AsString) + TmpLogStr + '}'+#10#13 else mLogStr := mLogStr + '{' + '序号:' + inttostr(k) + '|' + trim(FieldByName(keyNo).AsString) + TmpLogStr + '}'+#10#13 ; end; Next; end; end; result:=mLogStr; except raise Exception.Create(PWideChar('获取修改字段时,发生错误!')); end; end; function getMainDataChangeLog(dxLayoutControl:TdxLayoutControl;ADOQueryCmd:TADOQuery; mTag: Integer): String; var i: integer; mLogStr,mcaption:string; mOldValue,mNewValue:string; begin try mLogStr := ''; with dxLayoutControl do begin for i := 0 to ControlCount - 1 do begin mcaption:=TRegEx.Replace(trim(dxLayoutControl.FindItem(Controls[i]).CaptionOptions.Text), '\[.*?\]', ''); mOldValue:=trim(ADOQueryCmd.fieldByName(Controls[i].Name).AsString); if Controls[i].Tag = mTag then begin if Controls[i] is TcxButtonEdit then begin mNewValue:= Trim(TcxButtonEdit(Controls[i]).Text) ; if Trim(ADOQueryCmd.fieldByName(Controls[i].Name).AsString) <> mNewValue then begin mLogStr := mLogStr + '[' + mcaption + ':' +mOldValue + '→' + mNewValue + ']'; end; end else if Controls[i] is TcxCurrencyEdit then begin mNewValue:= Trim(TcxCurrencyEdit(Controls[i]).Text) ; if ADOQueryCmd.fieldByName(Controls[i].Name).Value <> TcxCurrencyEdit(Controls[i]).Value then begin mLogStr := mLogStr + '[' + mcaption + ':' + mOldValue + '→' + mNewValue + ']'; end; end else if Controls[i] is TcxTextEdit then begin mNewValue:= Trim(TcxTextEdit(Controls[i]).Text) ; if Trim(ADOQueryCmd.fieldByName(Controls[i].Name).AsString) <> mNewValue then begin mLogStr := mLogStr + '[' + mcaption + ':' +mOldValue + '→' + mNewValue + ']'; end; end else if Controls[i] is TcxMRUEdit then begin mNewValue:= Trim(TcxMRUEdit(Controls[i]).Text) ; if Trim(ADOQueryCmd.fieldByName(Controls[i].Name).AsString) <> mNewValue then begin mLogStr := mLogStr + '[' + mcaption + ':' +mOldValue + '→' + mNewValue + ']'; end; end else if Controls[i] is TRichEdit then begin mNewValue:= Trim(TRichEdit(Controls[i]).Text) ; if ADOQueryCmd.fieldByName(Controls[i].Name).AsString <> mNewValue then begin mLogStr := mLogStr + '[' + mcaption + ':' + mOldValue + '→' + mNewValue+ ']'; end; end else if Controls[i] is TcxComboBox then begin mNewValue:= Trim(TcxComboBox(Controls[i]).Text) ; if Trim(ADOQueryCmd.fieldByName(Controls[i].Name).AsString) <> mNewValue then begin mLogStr := mLogStr + '[' + mcaption + ':' + mOldValue + '→' + mNewValue+ ']'; end; end else if Controls[i] is TcxDateEdit then begin mNewValue:= Trim(TcxDateEdit(Controls[i]).Text) ; if ADOQueryCmd.fieldByName(Controls[i].Name).AsDateTime <> TcxDateEdit(Controls[i]).Date then begin mLogStr := mLogStr + '[' + mcaption + ':' + mOldValue+ '→' + mNewValue + ']'; end; end else if Controls[i] is TcxMemo then begin mNewValue:= Trim(TcxMemo(Controls[i]).Text) ; if Trim(ADOQueryCmd.fieldByName(Controls[i].Name).AsString) <> mNewValue then begin mLogStr := mLogStr + '[' + mcaption + ':' + mOldValue + '→' + mNewValue + ']'; end; end else if Controls[i] is TcxTimeEdit then begin if ADOQueryCmd.fieldByName(Controls[i].Name).AsDateTime <> TcxTimeEdit(Controls[i]).Time then begin mLogStr := mLogStr + '[' + mcaption + ':' + mOldValue + '→' + Trim(TcxTimeEdit(Controls[i]).Text) + ']'; end; end; end; end; end; if mLogStr = '' then begin exit; end; mLogStr:=mLogStr + #13#10 ; result:=mLogStr; except raise Exception.Create(PWideChar('获取修改字段时,发生错误!')); end; end; end.