Dynamics AX - 在AX 2009中以编程方式将表添加到DatabaseLog

Lun*_*tri 2 microsoft-dynamics x++ axapta dynamics-ax-2009

我正在寻找一种方法来为某些表启用日志记录更改.
我已经尝试并测试过以编程方式将表添加到数据库日志中,但到目前为止取得了各种成功 - 有时它有时它不起作用(大多数情况下它没有) - 似乎只是将行插入DatabaseLog表中并不是很有效.

我尝试过:
使用正确的tableId,fieldId,logType和添加行.
域名已被指定为"管理员",主要公司,空白场和子公司,结果相同.
我创建了处理插入的类,主要的两个函数是:

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");
}
Run Code Online (Sandbox Code Playgroud)

以及列出每个字段并添加为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();
    }
}
Run Code Online (Sandbox Code Playgroud)

结果: 从databaselog = 662的databaselog中选择*

我错过了什么?

@EDIT有一些额外的信息
不用于工作SalesTableSalesLine,WMSBillOfLading.
我不能为添加日志SalesTable,并SalesLine通过使用管理面板向导,但我的同事莫名其妙地做了(她做了完全一样的东西我).我们还尝试将日志添加到其他各种表中,我们经常发现她可以在我不能的情况下反之亦然(有时候没有人像WMSBillOfLading桌子一样设法做到这一点).

这种机制的不一致促使我编写这段代码,我希望能解决所有问题.

DAX*_*lic 5

完成设置更改后,您可能需要致电

SysFlushDatabaseLogSetup::main();
Run Code Online (Sandbox Code Playgroud)

为了刷新任何缓存.
此方法也在表单方法SysDatabaseLogTableSetup\Methods\close和类方法中的标准AX代码中调用 SysDatabaseLogWizard\doRun.