当从代码调用方法 SalesLine.modifiedField 时,错误的字段会重置

Wrong fields reset when method SalesLine.modifiedField is called from code

接受任意一行包含字段 SalesLine.NameSalesLine.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;

作业完成后,NameExternalItemId 都将被重置。

此问题是由 \Classes\AxSalesLine\isCustExternalItemDescriptionFieldsSet 中的行 this.axInventDim().isFieldSet(fieldNum(InventDim, ConfigId)) 引起的,它总是 returns true

因此,方法 AxSalesLine.setNameAxSalesLine.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 上解决的基本错误。

https://fix.lcs.dynamics.com/Issue/Resolved?kb=3061573&bugId=3612128&qc=83c15cd8881ece605195acc30e039142

我认为完整的方法修复与您所拥有的接近,但修补程序也可能会调整其他方法。我希望这个修补程序能让你满意,因为你没有疯。

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>