日志记录函数公共库

This commit is contained in:
sgwp 2025-05-12 09:50:47 +08:00
parent 0cc3a60d4c
commit 4c77143d0b

View File

@ -0,0 +1,295 @@
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.