老板要求记录应用程序的每一步操作,如操作员的登录,数据的访问\增加\删除...........的动作.
   该如何做才是最好的方法.

解决方案 »

  1.   

    首先设计好自己的日志表。
    从用户一登陆就开始记录信息。其实也挺简单的。不过,你把对记录的访问\增加\删除都记录在日子里不大好(成了sql server的日志了),在业务表里完全可以记录修改人的信息。
      

  2.   

    procedure TLoginForm.FormClose(Sender: TObject; var Action: TCloseAction);
    var
       Id : Integer;
       i : integer;
       Reg: TRegistry;
    begin
       With HDataModule.tblUsers do
       begin
          open;
          if IsOk then
             if not Locate('UserName;Password',vararrayof([LoginForm.cmbUser.text,LoginForm.edtPwd.text]),[]) then
             begin
                application.MessageBox('用户名或密码不正确!','系统提示',MB_OK);
                action:=canone;
             end
             else
             begin
                  action:=cafree;
                iright:=FieldValues['Right'];
            ///////////////////////////////////////////////////////////////////////
              FrmSystemLog:=TFrmSystemLog.Create(self);
                     with FrmSystemLog.ADOTable1 do
                       begin
                         FrmSystemLog.ADOTable1.Connection:=HDatamodule.ADOConnection1;
                         FrmSystemLog.ADOTable1.TableName:='SystemLog';
                         FrmSystemLog.ADOTable1.Open;
                          Reg:=TRegistry.create;
                          reg.RootKey:=HKEY_LOCAL_MACHINE;
          /////////////////////////////////////////////////////////////////////////////////////////////
                          if reg.OpenKey('software\公路数据库管理系统\系统日志',false) then
                          begin
                              Id:=StrToInt(Reg.ReadString('SystemLogId'));   //读取出日志的ID号
                                for i:=0 to FrmSystemLog.ADOTable1.RecordCount-1 do
                                begin
                                      if FrmSystemLog.ADOTable1.FieldValues['id']=Id then
                                       begin
                                      FrmSystemLog.ADOTable1.Edit;
                                      FrmSystemLog.ADOTable1.FieldValues['ExitTime']:=DateToStr(Date)+' '+TimeToStr(Time);
                                      FrmSystemLog.ADOTable1.post;
                                      Break;
                                        end;
                                      FrmSystemLog.ADOTable1.Next;
                                end;
                         end;
    ////////////////////////////////////////////////////////////////////////////
                         FrmSystemLog.ADOTable1.Append;
                         FrmSystemLog.ADOTable1.FieldValues['UserName']:=LoginForm.cmbUser.text;
                            username:=LoginForm.cmbUser.text;
                            //////////////////////////////////////////////////////
                           if IRight=15 then
                              FrmSystemLog.ADOTable1.FieldValues['UserId']:='数据库管理员'
                           Else
                              FrmSystemLog.ADOTable1.FieldValues['UserId']:='一般浏览者';
                           FrmSystemLog.ADOTable1.FieldValues['LoginTime']:=DateToStr(Date)+' '+TimeToStr(Time);
                           FrmSystemLog.ADOTable1.FieldValues['Operation']:=LoginForm.cmbUser.text;
                          LoginTime:=FrmSystemLog.ADOTable1.FieldValues['LoginTime'];
                         Post;
                            reg.CloseKey;
                            reg.RootKey:=HKEY_LOCAL_MACHINE;
                              if reg.OpenKey('software\公路数据库管理系统\系统日志',True) then  //写入日志的ID号
                                  Reg.WriteString('SystemLogId',IntToStr(Fieldvalues['Id']));
                                      reg.CloseKey;
                                       reg.Free;
                         FrmSystemLog.ADOTable1.close;
                        end;
                  FrmSystemLog.Destroy;
                  /////////////////////////////////////////////////////////////
                close;
             end
         else
         begin
            action:=cafree;
            close;
         end;
      end;
    end;我做的
      

  3.   

    建立一个日志表,日志可包含的字段有LogNo, DateTime, UserName, Event, Type, Status
    可以记录每次用户登陆、更新、增加和删除记录信息,
    LogNo:表示Log号码
    DateTime:操作的时间
    UserName:用户名
    Event:做何种操作
    Type: 操作类型
    Status:操作成功还是失败
    满意了吗?
      

  4.   

    上面的各位说的好象是有点不对呀,你找一下吧,可以通过你的连接处理的,
    如BDE吧,可以通过它把发出的语句取到的。我是见过的,实现我也不太清楚的,
    祝你好运。
      

  5.   

    给你一点思路:
    1: 重写你用到的控件,在你要管理的事件中,写入要写日志的代码。
    2: 写一个类,监视你的数据集。其实和上一个是一样的,不过,是不用写新的控件(componets)做了一个小例子,请你试试看:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, DBCtrls, Db, DBTables, Grids, DBGrids;type
      //这就是一个数据集监视类,简单起见,只监视BeforePost,并在BeforePost时,showMesage.
      TDataSetMonitor = class
      private
        FDataSet: TDataSet;    FOldBeforePost: TDataSetNotifyEvent;    //被监视数据集的BeforePost事件处理过程
        procedure SetDataSet(const Value: TDataSet);
      protected
        procedure MyBeforePost(xDataSet: TDataSet);  //监视程序的BeforePost过程
      public
        property DataSet: TDataSet read FDataSet write SetDataSet;
      end;  TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        Query1: TQuery;           //我们就是要监视他!·!!!
        DBNavigator1: TDBNavigator;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        FdsMon : TDataSetMonitor;  //申明一个对象
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ TDataSetMonitor }procedure TDataSetMonitor.MyBeforePost(xDataSet: TDataSet);
    begin
      ShowMessage(' Before Post!');  //在这里写入日志  if Assigned(FOldBeforePost) then  //如果原数据集有处理,则处理之。
        FOldBeforePost(xDataSet);
    end;procedure TDataSetMonitor.SetDataSet(const Value: TDataSet);
    begin
      //在给之前,先看看是不是已经有监视了,如果有,结束!
      if FDataSet <> nil then
      begin
        FDataSet.BeforePost := FOldBeforePost;
      end;  FDataSet := Value;  //监视起来,如果为空,就不用。  //把被监视者的事件都接过来
      if FDataSet <> nil then
      begin
        FOldBeforePost := FDataSet.BeforePost;
        FDataSet.BeforePost := self.MyBeforePost;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FdsMon := TDataSetMonitor.Create;
      FdsMon.DataSet := self.Query1;  //给我看紧喽!!!  Query1.open();
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FdsMon.Free;  //Free
    end;end.
      

  6.   

    以上方法比较容易实现,修改也容易但,可以被控件绕过还是重写控件来得好从Query(TADODataSet, etc.)重新继承一个。
      

  7.   

    可不可以调用后台sql server的日志文件以实现该功能.
      

  8.   

    在基类中建立一个通用记录处理函数:
        根据操作命令进行日志记录.
        然后在其派生类中inherit后,再进行其他操作就不用为日志写代码了.
      

  9.   

    做个函数,可以写入每个窗体的操作日志.
    我想是在基类窗体中加个QinfoBase的基类数据源,在其的BeforePost,BeforeInsert,BeforeEdit,BeforeDelete......等等事件中加入函数
    问题是如何自动获得每个窗体的自身名字.
      

  10.   

    老兄既然是基类.Self就代表每个派生窗体的名字啦.