有没有办法改进这个动态斧头更新工作

Is there a way to improve this dynamics ax update job

我正在安装 AX 2009。工作是更新 WMSOrderTrans table。到目前为止,这是我得到的:

WMSOrderTrans   wmsOrderTrans;
;

while select wmsOrderTrans
{
    if (wmsOrderTrans.BBBpackingSlipExists())
    {
        ttsBegin;
        wmsOrderTrans.selectForUpdate(true);
        wmsOrderTrans.BBBPackingSlipExists  =   NoYes::Yes;
        wmsOrderTrans.doUpdate();
        ttsCommit;
    }
}

在测试系统上完成该作业大约需要一个小时。这让我担心生产系统上的性能

目前代码是这样编写的,以最大限度地减少锁定问题(如果应该更新,则对每一行执行 selectForUpdate,然后立即提交)。原因是,当作业为 运行.

时,用户将在系统上工作

我的问题是,是否有一种合理的方式来以较少的事务开销来实施这项工作。

while select forUpdate ...

... 似乎不是一个选项,因为它会锁定 table 直到作业完成。

欢迎任何意见。


这是 BBBPackingSlipExists 方法的代码:

display boolean BBBpackingSlipExists()
    {
    InventDim               inventDimCur;
    InventDim               inventDimPackSlip;
    InventTrans             inventTransPackSlip;

    ;

    select firstonly RecId from inventTransPackSlip
        where inventTransPackSlip.InventTransId == this.inventTransId
            && (inventTransPackSlip.StatusIssue == StatusIssue::Deducted
                || inventTransPackSlip.StatusIssue == StatusIssue::Sold)
            && !inventTransPackSlip.PackingSlipReturned
        exists join inventDimCur
            where inventDimCur.inventDimId == this.inventDimId
        exists join inventDimPackSlip
            where inventDimPackSlip.inventDimId == inventTransPackSlip.inventDimId
                && inventDimCur.inventSerialId  == inventDimPackSlip.inventSerialId
    ;
if (inventTransPackSlip.RecId != 0 && this.isReserved)
{
    return true;
}
return false;

}

这看起来是转换为 set based logic 的主要候选者,我会选择这样的东西。请注意,这项工作根本没有经过测试,因为我手边没有 2009 年的环境(这甚至没有在 2012 年编译)所以如果你需要更改代码,请随时将其编辑到我的答案中。

请注意,查询中内置了 isreserved 检查以及来自 packingslipexists 方法的存在连接

static void Job250(Args _args)
{
    WMSOrderTrans           wmsOrderTrans;
    InventDim               inventDimCur;
    InventDim               inventDimPackSlip;
    InventTrans             inventTransPackSlip;
    ;
    wmsOrderTrans.skipDatabaseLog(true);
    wmsOrderTrans.skipDataMethods(true);
    wmsOrderTrans.skipEvents(true);
    update_recordset wmsOrderTrans setting BBBPackingSlipExists  = NoYes::Yes
        where wmsOrderTrans.isReserved
        exists join inventTransPackSlip
        where inventTransPackSlip.InventTransId == wmsOrderTrans.inventTransId
          && (inventTransPackSlip.StatusIssue == StatusIssue::Deducted
           || inventTransPackSlip.StatusIssue == StatusIssue::Sold)
          && !inventTransPackSlip.PackingSlipReturned
        exists join inventDimCur
        where inventDimCur.inventDimId == wmsOrderTrans.inventDimId
        exists join inventDimPackSlip
        where inventDimPackSlip.inventDimId == inventTransPackSlip.inventDimId
           && inventDimCur.inventSerialId  == inventDimPackSlip.inventSerialId;       
}

请参阅 update_recordset and why the skip* methods might be necessary

上的文档