可以修改或扩展 D365FO 中的代码以抑制抛出的错误

Possibility to modify or extend code in D365FO to suppress thrown error

原始 class 函数创建一个 SQL 查询并执行它。 由于查询中存在语法错误,因此会引发错误。实现固定的正确方法是什么? Class 扩展不起作用,因为 CoC 执行完整的原始功能。

originalFunction(..)
{
    createSomeSQLQueryWithSyntayErrorInIt();
    executeQuery();
}

有问题的 class 是 ReqDemPlanMissingForecastFiller。在方法 insertMissingDatesForecastEntries 中生成一个直接的 SQL 语句字符串。日期变量 nonFrozenForecastStartDate 已添加到字符串中,但并未像看起来那样正确转义。

如果执行SQL语句,会出现语法错误。如果语句是固定的,它可以被执行,例如在 SQL Server Management Studio (SSMS) 中。

在这种特定情况下,根据您的评论,您或许可以回避。

创建一个新的 class ReqDemPlanMissingForecastFiller_Fix 扩展 ReqDemPlanMissingForecastFiller 然后 copy/paste 错误的函数并更正错误。

创建扩展 class 并更改 newParameters 静态函数。

[ExtensionOf(classStr(ReqDemPlanMissingForecastFiller))]
class ReqDemPlanMissingForecastFiller_Extention
{
    public static ReqDemPlanMissingForecastFiller newParameters(
        ReqDemPlanCreateForecastDataContract    _dataContract,
        ReqDemPlanAllocationKeyFilterTmp        _allocationKeyFilter,
        ReqDemPlanTaskLoggerInterface           _logger = null)
    {
        ReqDemPlanMissingForecastFiller filler = next newParameters(_dataContract, _allocationKeyFilter, _logger);
        filler = new ReqDemPlanMissingForecastFiller_Fix(); //Throw away previous value    
        filler.parmDataContract(_dataContract);
        filler.parmAttributeManager(_dataContract.attributeManager());
        filler.parmAllocationKeyFilter(_allocationKeyFilter);
        filler.parmLogger(_logger);
        filler.init();    
        return filler;
    }
}

以上代码基于 AX 2012 代码。愚蠢问题的愚蠢解决方案。

不用说,您应该向 Microsoft 报告该问题。

@Jan B. Kjeldsen 的回答描述了如何在不涉及 Microsoft 的情况下解决特定案例。

由于 overlayering 不再可行,解决方案涉及复制相当多的标准代码。这带来了自身的风险,因为 Microsoft 对该代码的未来更改不会反映在复制的代码中。

虽然不能总是避免,但应首先评估其他选项:

  • 如@Jan B. Kjeldsen 所述,标准代码中的错误应报告给 Microsoft(请参阅 Get support for Finance and Operations apps or Lifecycle Services (LCS))。这使他们能够修复错误。
    • 专业人士:无需进一步工作。
    • 缺点:Microsoft 可能会拒绝修复或需要很长时间才能实施。
  • 如果与此特定情况不同,问题不是彻头彻尾的错误,而是缺少扩展选项,可以与 Microsoft 一起创建 extensibility request。然后他们将添加一个扩展选项。
    • 专业人士:无需进一步工作。
    • 缺点:Microsoft 可能会拒绝扩展性请求或需要很长时间才能实现。
  • 对于错误和缺少的扩展选项,Microsoft 还提供了 Community Driven Engineering 程序 (CDE)。这使您能够直接通过特殊的 Microsoft 托管存储库对标准代码进行更改,其中标准代码未锁定以进行更改。
    • Pro:涉及 Microsoft 的所有选项中最灵活、最快速。
    • 缺点:您必须自己完成工作。 Microsoft 可能会拒绝更改。更改在 GA 版本中可用还需要一些时间。

您也可以考虑采用混合方法:要获得快速解决方案,请复制标准代码并根据需要对其进行自定义。但也会报告错误,创建扩展性请求或在 CDE 程序中自行修复。当更改在标准代码中可用时,您可以再次删除复制的代码。