有没有办法改进这个动态斧头更新工作
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
上的文档
我正在安装 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
上的文档