我正在寻找一种方法来为某些表启用日志记录更改。
我已经尝试并测试过以编程方式将表添加到数据库日志中,但到目前为止取得了各种成功 - 有时候它有时它不起作用(大多数情况下它没有) - 它似乎只是将行插入DatabaseLog
表中而不是# 39;完全可以做到这一点。
我的尝试:
添加具有正确tableId,fieldId,logType和。
域的行已分配为' Admin',主要公司,空白字段和子公司,结果相同。
我创建了处理插入的类,主要的两个函数是:
public static void InsertBase(STR tableName, domainId _domain='Admin')
{
//base logging for insert, delete, uptade on fieldid=0
DatabaseLog DBDict;
TableId _tableId;
DatabaseLogType _logType;
fieldId _fieldId =0;
List logTypes;
int i;
ListEnumerator enumerator;
;
_tableId= tableName2id(tableName);
logTypes = new List(Types::Enum);
logTypes.addEnd(DatabaseLogType::Insert);
logTypes.addEnd(DatabaseLogType::Update);
logTypes.addEnd(DatabaseLogType::Delete);
logTypes.addEnd(DatabaseLogType::EventInsert);
logTypes.addEnd(DatabaseLogType::EventUpdate);
logTypes.addEnd(DatabaseLogType::EventDelete);
enumerator = logTypes.getEnumerator();
while(enumerator.moveNext())
{
_logType = enumerator.current();
select * from dbdict where
dbdict.logTable==_tableId && dbdict.logField==_fieldId
&& dbdict.logType==_logType;
if(!dbDict) //that means it doesnt exist
{
dbdict.logTable=_tableId;
dbdict.logField=_fieldId;
dbdict.logType=_logType;
dbdict.domainId=_domain;
dbdict.insert();
}
}
info("Success");
}
以及列出每个字段的方法,并添加为logType :: Update
public static void init(str TableName, DomainId domain='Admin')
{
DatabaseLogType logtype;
int i;
container kk, ll;
DatabaseLog dblog;
tableid _tableId;
fieldid _fieldid;
;
logtype = DatabaseLogType::Update;
//holds a container of not yet added table fields to databaselog
kk = BLX_AddTableToDatabaseLog::buildFieldList(logtype,TableName);
for(i=1; i <= conlen(kk);i++)
{
ll = conpeek(kk,i);
_tableid = tableName2id(tableName);
_fieldid = conpeek(ll,1);
info(strfmt("%1 %2", conpeek(ll,1),conpeek(ll,2)));
dblog.logType=logType;
dblog.logTable = _tableId;
dblog.domainId = domain;
dblog.logField =_fieldid;
dblog.insert();
}
}
我错过了什么?
带有一些额外信息的@EDIT
不适用于SalesTable
和SalesLine
,WMSBillOfLading
。
我无法通过管理面板中的向导为SalesTable
和SalesLine
添加日志,但我的同事却以某种方式做了(她做了与我完全相同的事情)。我们还尝试将日志添加到其他各种表中,我们经常发现她可以在我不能的情况下反之亦然(有时没有人像WMSBillOfLading
表那样设法做到这一点)。
这种机制的不一致促使我编写这段代码,我希望能解决所有问题。
答案 0 :(得分:5)
完成设置更改后,您可能需要调用
SysFlushDatabaseLogSetup::main();
以刷新任何缓存
此方法也在标准AX代码中以方法SysDatabaseLogTableSetup\Methods\close
和类方法SysDatabaseLogWizard\doRun
调用。