gpt4 book ai didi

axapta - 有没有办法改善这个动态斧头更新工作

转载 作者:行者123 更新时间:2023-12-04 22:19:46 25 4
gpt4 key购买 nike

我正在安装 AX 2009。任务是更新 WMSOrderTrans 表。这是我到目前为止所得到的:

WMSOrderTrans   wmsOrderTrans;
;

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

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

目前,代码是这样编写的,以最大限度地减少锁定问题(如果应该更新并立即提交,则为每一行完成 selectForUpdate)。原因是,当作业运行时,用户将在系统上工作。

我的问题是, 是否有合理的方法以较少的事务开销来实现这项工作。
while select forUpdate ...

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

任何输入表示赞赏。

这是 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 方法的exists 连接都内置在查询中

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 的文档以及为什么 skip* methods might be necessary

关于axapta - 有没有办法改善这个动态斧头更新工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33911334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com