起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1461|回复: 2

数据表维护的日志记录

[复制链接]
发表于 2005-10-20 16:25:53 | 显示全部楼层 |阅读模式
A.定义:           在表定义中增加了TableLog属性来定义该表是否记录日志以及如果记录日志
B.是否记录日志:   TableLog.Enable属性,默认为False。为True的时候则允许记录日志
C.选择日志表:     TableLog.LogTable属性,目前可以指定任意业务数据下的用于记录日志的表,也允许多张数据表指定一张日志表
D.字段对应关系:   TableLog.LogFields属性,TCollection类型,用于日志表记录字段的记录规则列表,下面是每个记录规则的说明:
  a.日志字段名:   TableLog.LogFields[].FieldName属性,用于指定一个日志表的字段名称(必须,且不能重复)。
  b.日志字段类型: TableLog.LogFields[].Kind属性,每个日志字段都需要说明其类型,类型目前包括三种:
                  1.lfkDataField     默认,用于表示日志表中的该字段为一个普通的记录数据表中历史数据的字段
                  2.lfkDataKeyField  可选,用于表示用那个日志字段作为关键字段,这个关键字段可以为一的在数据表中定位到一条记录
                  3.lfkModifyOrder   必须,用于记录“日志记录”的修改顺序。在LogFields属性中必须指定那个日志表的字段为“变更序号”字段,并且变更字段的类型为数字;当LogFields属性中不存在类型为lfkDataKeyField的日志字段的时候,则用于记录“日志记录”的修改顺序的日志字段在日志表中全局累加;否则按照具有lfkDataKeyField日志字段的范围局部累加。
  c.值表达式:     TableLog.LogFields[].Expression属性,每个日至字段都可以为其指定填值规则表达式,表达式中可以包含被记录日志的数据表的字段,也可以包含常量、业务元素、参数等。
E.字段匹配字段:   TableLog.AutoMatch属性,可以使数据表字段与日志表字段按照字段名自动匹配,但需要在LogFields中指定lfkModifyOrder两种类型的日志字段;如果在LogFields中指定了日志字段,则以LogFields的设置为准。
F.内部实现机制:   当TSQLBasedDataSet在ApplyUpdates的时候,会根据其涉及的表来分析数据集的Delta记录日志,并在一个事务内与更改的数据一起提交。目前记录日志的规则是只记录“历史”数据,最新的数据还在原始表中。细节如下:
  a.插入记录:     不向日志表中写数据
  b.修改记录:     将修改前的数据根据定义的规则添加到日志表中
  c.删除记录:     将被删除的记录根据定义的规则添加到日志表中

aa2.jpg

15.53 KB, 下载次数: 568

回复

使用道具 举报

 楼主| 发表于 2005-10-20 16:26:25 | 显示全部楼层

使用提示

A.如何使多张数据表利用一个日志表,并可以在日志表中区分出是那个数据表中的数据?
  首先要指定多个数据表的TableLog.LogTable属性为一个日志表;还要在TableLog.LogFields中为一个用于标识表名的字段设置一个值表达式,使不同的数据表用不同的常量值即可。

B.如何实现在日志表中记录例如修改时间、修改人员等辅助信息?
  首先日志表中必须存在记录这些信息的字段,然后只要在TableLog.LogFields中定义这些字段的Expression属性即可。

C.如何使日志表中用于记录修改顺序的字段,按照关键字段(关键字段可以唯一标识数据表中的一条记录)的范围内递增?
  只要在TableLog.LogFields中设置好那些日志字段为关键字段(Kind属性为lfkDataKeyField的日志字段)即可。否则按照日志表内全局递增
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-20 16:27:52 | 显示全部楼层

数据表日志属性定义

{ TBizTableLog }

  TBizTableLog = class(TPersistent)
  private
    FOwner: TPersistent;
    FEnable: Boolean;
    FLogTable: TBizRef;
    FLogFields: TLogFields;
    procedure SetEnable(const Value: Boolean);
    procedure SetLogFields(const Value: TLogFields);
    procedure SetLogTable(const Value: TBizRef);
    procedure CheckLogTable;
    procedure CheckDataSet;
  protected
    procedure AssignTo(Dest: TPersistent); override;
    function GetOwner: TPersistent; override;
  public
    constructor Create(AOwner: TPersistent);
    destructor Destroy; override;
    procedure DoLog(ADataSet: TDataSet);
    property Owner: TPersistent read FOwner;
  published
    property Enable: Boolean read FEnable write SetEnable default False;
    property LogTable: TBizRef read FLogTable write SetLogTable;
    property LogFields: TLogFields read FLogFields write SetLogFields;
  end;

  { TLogField }

  TLogExpression = TBizExpression;

  TLogFieldKind = (
    lfkDataField,    //日志数据字段
    lfkDataKeyField, //日志数据关键字段
    lfkModifyOrder   //变更序号字段
  );

  TLogField = class(TCollectionItem)
  private
    FKind: TLogFieldKind;
    FFieldName: string;
    FExpression: TLogExpression;
    procedure SetExpression(const Value: TLogExpression);
    procedure SetFieldName(const Value: string);
    procedure SetKind(const Value: TLogFieldKind);
  protected
    procedure DoChange(Sender: TObject);
  public
    constructor Create(Collection: TCollection); override;
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
  published
    property Kind: TLogFieldKind read FKind write SetKind default lfkDataField;
    property FieldName: string read FFieldName write SetFieldName;
    property Expression: TLogExpression read FExpression write SetExpression;
  end;

  { TLogFields }

  TLogFields = class(TOwnedCollection)
  private
    function GetItems(Index: Integer): TLogField;
    procedure SetItems(Index: Integer; const Value: TLogField);
  public
    constructor Create(AOwner: TPersistent);
    function Add: TLogField;
    function Find(AFieldName: string): TLogField;
    property Items[Index: Integer]: TLogField read GetItems write SetItems; default;
  end;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-22 19:21 , Processed in 0.042031 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表