当从代码调用方法 SalesLine.modifiedField 时,错误的字段会重置
Wrong fields reset when method SalesLine.modifiedField is called from code
接受任意一行包含字段 SalesLine.Name
和 SalesLine.ExternalItemId
的销售订单。
然后 运行 下面的工作试图修改与上面两个不相关的任何字段:
SalesLine sl = SalesLine::findInventTransId('US01-000025', true);
ttsBegin;
sl.CustomerLineNum = 100; //any other field will serve as well
sl.modifiedField(fieldNum(SalesLine, CustomerLineNum)); //causes the issue
sl.update();
ttsCommit;
作业完成后,Name
和 ExternalItemId
都将被重置。
此问题是由 \Classes\AxSalesLine\isCustExternalItemDescriptionFieldsSet
中的行 this.axInventDim().isFieldSet(fieldNum(InventDim, ConfigId))
引起的,它总是 returns true
。
因此,方法 AxSalesLine.setName
和 AxSalesLine.setExternalItemId
使用默认值填充相应的字段。
对于 Microsoft 以这种方式编码的原因以及解决此问题的最佳方法有何建议?
P.S. 我将问题缩小到 R2 CU7
中引入的方法 \Classes\AxSalesLine\setRetailVariantId
正如我在后记中提到的,我将问题缩小到方法 \Classes\AxSalesLine\setRetailVariantId
,该方法在 R2 CU7 中引入。
作为解决方法,我在代码中添加了一行,它解决了问题:
if (this.axInventDim().parmConfigId() != comb.inventDim().configId) // added check
this.axInventDim().parmConfigId(comb.inventDim().configId);
我会等一段时间以获得更好的answer/fix。如果none提供,我会接受这个答案。
这是 2015 年 4 月 30 日在 KB3061573 上解决的基本错误。
我认为完整的方法修复与您所拥有的接近,但修补程序也可能会调整其他方法。我希望这个修补程序能让你满意,因为你没有疯。
protected void setRetailVariantId()
{
InventDimCombination comb;
InventDim inventDim;
;
comb = InventDimCombination::findVariantId(salesLine.RetailVariantId);
inventDim = this.axInventDim().inventDim();
if(comb)
{
if (inventDim.InventSizeId != comb.inventDim().InventSizeId)
{
this.axInventDim().parmInventSizeId(comb.inventDim().InventSizeId);
}
if (inventDim.InventColorId != comb.inventDim().InventColorId)
{
this.axInventDim().parmInventColorId(comb.inventDim().InventColorId);
}
if (inventDim.InventStyleId != comb.inventDim().InventStyleId)
{
this.axInventDim().parmInventStyleId(comb.inventDim().InventStyleId);
}
if (inventDim.configId != comb.inventDim().configId)
{
this.axInventDim().parmConfigId(comb.inventDim().configId);
}
}
}
// </RETAIL>
接受任意一行包含字段 SalesLine.Name
和 SalesLine.ExternalItemId
的销售订单。
然后 运行 下面的工作试图修改与上面两个不相关的任何字段:
SalesLine sl = SalesLine::findInventTransId('US01-000025', true);
ttsBegin;
sl.CustomerLineNum = 100; //any other field will serve as well
sl.modifiedField(fieldNum(SalesLine, CustomerLineNum)); //causes the issue
sl.update();
ttsCommit;
作业完成后,Name
和 ExternalItemId
都将被重置。
此问题是由 \Classes\AxSalesLine\isCustExternalItemDescriptionFieldsSet
中的行 this.axInventDim().isFieldSet(fieldNum(InventDim, ConfigId))
引起的,它总是 returns true
。
因此,方法 AxSalesLine.setName
和 AxSalesLine.setExternalItemId
使用默认值填充相应的字段。
对于 Microsoft 以这种方式编码的原因以及解决此问题的最佳方法有何建议?
P.S. 我将问题缩小到 R2 CU7
中引入的方法\Classes\AxSalesLine\setRetailVariantId
正如我在后记中提到的,我将问题缩小到方法 \Classes\AxSalesLine\setRetailVariantId
,该方法在 R2 CU7 中引入。
作为解决方法,我在代码中添加了一行,它解决了问题:
if (this.axInventDim().parmConfigId() != comb.inventDim().configId) // added check
this.axInventDim().parmConfigId(comb.inventDim().configId);
我会等一段时间以获得更好的answer/fix。如果none提供,我会接受这个答案。
这是 2015 年 4 月 30 日在 KB3061573 上解决的基本错误。
我认为完整的方法修复与您所拥有的接近,但修补程序也可能会调整其他方法。我希望这个修补程序能让你满意,因为你没有疯。
protected void setRetailVariantId()
{
InventDimCombination comb;
InventDim inventDim;
;
comb = InventDimCombination::findVariantId(salesLine.RetailVariantId);
inventDim = this.axInventDim().inventDim();
if(comb)
{
if (inventDim.InventSizeId != comb.inventDim().InventSizeId)
{
this.axInventDim().parmInventSizeId(comb.inventDim().InventSizeId);
}
if (inventDim.InventColorId != comb.inventDim().InventColorId)
{
this.axInventDim().parmInventColorId(comb.inventDim().InventColorId);
}
if (inventDim.InventStyleId != comb.inventDim().InventStyleId)
{
this.axInventDim().parmInventStyleId(comb.inventDim().InventStyleId);
}
if (inventDim.configId != comb.inventDim().configId)
{
this.axInventDim().parmConfigId(comb.inventDim().configId);
}
}
}
// </RETAIL>