296 lines
10 KiB
ObjectPascal
296 lines
10 KiB
ObjectPascal
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.
|