AX2012 查询后台数据库记录
AX2012 自带的数据库查询功能比较慢(特别是查询删除的情况),有些业务可能需要频繁查询删除人和删除时间等,这种情况下还是用代码来查询比较快。
例:
static void SysDataBaseLog_SalesTableDel(Args _args) { SysDataBaseLog sysDataBaseLog; container tableRecord, tableRecordSel; container recordInstance; int idx = 0; str fieldName,fieldValue_new,fieldValue_old; SalesId salesId, salesIdDel; utcDateTime beginDT, endDT; TableId tableId; str delby; utcDateTime delDateTime; ; // return; salesIdDel = "XXXXXXXX"; // 被删除的SalesId beginDT = 2021-12-20T00:00:00; // 开始时间, 时间范围越精确,查询所需时间越少 endDT = 2021-12-24T00:00:00; // 结束时间 tableId = tableName2id("SalesTable"); // 1. 先根据【SalesId】找出被删的记录 while select sysDataBaseLog where sysDataBaseLog.table == tableId // Table的RecordId, 自行替换 && sysDataBaseLog.LogType == DatabaseLogType::Delete // 要查询的数据库日志的类型, 自行替换 && sysDataBaseLog.createdDateTime > beginDT // 开始时间 && sysDataBaseLog.createdDateTime < endDT // 结束时间 { tableRecord = sysDataBaseLog.Data; if(tableRecordSel != conNull()) { break; } for(idx = 1; idx <= conLen(tableRecord); idx++) { recordInstance = conpeek(tableRecord, idx); fieldName = conpeek(recordInstance, 1); // container下记录的数据为为【fieldNmae】, 【字段更改前的数据】,【更改后的数据】... if(fieldName == "SalesId") { salesId = conpeek(recordInstance, 2); if(salesId == salesIdDel) { tableRecordSel = tableRecord; delby = sysDataBaseLog.createdBy; delDateTime = DateTimeUtil::applyTimeZoneOffset(sysDataBaseLog.createdDateTime, DateTimeUtil::getUserPreferredTimeZone()); break; } else { break; } } } } // 2. 循环读出记录字段 info(strFmt("删除日期和时间: %1", delDateTime)); info(strFmt("删除人: %1", delby)); for(idx = 1; idx <= conLen(tableRecordSel); idx++) { recordInstance = conpeek(tableRecordSel, idx); fieldName = conpeek(recordInstance, 1); if(fieldName == "SalesId") { salesId = conpeek(recordInstance, 2); info(strFmt("销售订单号:%1", salesId)); } else if(fieldName == "createdBy") { info(strFmt("创建人: %1", conpeek(recordInstance, 2))); } else if(fieldName == "CreatedDateTime") { info(strFmt("创建日期和时间: %1", conpeek(recordInstance, 2))); } } }